11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

J'aimerai rajouter une classe sur un élément html pour faire un smooth scroll. . Smiley smile

Je ne peux pas directement rajouter la classe à l'élément.. Je passe donc par un bout de JavaScript. Je ne maitrise rien, j'essaie de comprendre, j'ai récupéré des bouts de codes et fait le bien.. Bon ben ça ne marche pas, je m'en doutais. .

$(function() {
		
		var BoutonMenuA = document.querySelector(".main-menu-links > li > a");
		BoutonMenuA.className += " scrollTo";
	
	    $('.scrollTo').on('click', function(event) {
        var page = $(this).attr('href'),
            speed = 5750,
            $body = $('html, body');
 
        $body.animate({
            scrollTop: $(page).offset().top
        }, speed);
 
        event.preventDefault();
    });
});


<div id="main-menu" class="navigation">
<h2 class="element-invisible">Menu principal</h2>
<ul id="main-menu-links" class="links clearfix ">
<li class="menu-706 first active">
[b]<a class="active" title="" href="...#Ancre 1">Zone ciblée 1 </a>[/b]
</li>
Le code utilisé est du jQuery, la bibliothèque est-elle bien chargée ?

Mais remplace plutôt ton code par ça, avec ceci tu pourras cibler toutes les ancres présentes sur la page et tu n'auras pas besoin de leur ajouter une classe (toujours en jQuery) :
// -----------------------------------------------------------------------------
// @section     Smooth Scroll
// @description Défilement fluide
// -----------------------------------------------------------------------------

jQuery(document).on('click', 'a[href*=#]:not([href=#])', function() {
	if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname){
		var target = $(this.hash);
		target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
		if (target.length){
			$('html,body').animate({
				scrollTop: target.offset().top
			}, 400);
			//return false;
		}
	}
});

Exemple d'utilisation en ligne de ce code ici.

Maintenant, juste pour répondre au titre du sujet :

- Pour ajouter une classe en javascript seulement (Vanilla JS) :
element.className = 'classname'

- Pour ajouter une classe avec jQuery :
$("element").attr('class', 'classname');

- Pour ajouter un ID en Vanilla JS :
element.setAttribute('id', 'index')

- Pour ajouter un ID avec jQuery :
$('element').attr('id', 'index');

Modifié par Olivier C (31 Mar 2016 - 06:52)
Bonjour,
Olivier C a écrit :

- Pour ajouter une classe avec jQuery :
$("element").attr('class', 'classname');

Je dirais plutôt .addClass() (histoire surtout de ne pas virer une classe qui serait déjà présente et de bien avoir la possibilité d'en mettre plusieurs en même temps)
Si vous n'utilisez pas JQuery, ce serait quand même beaucoup plus simple avec classList :


element.classList.add('nouvelle_classe');
element.classList.remove('ancienne_classe');


C'est compatible tous les navigateurs y compris IE10, et il y a un moyen pas trop compliqué de l'émuler pour IE9 avec un code de ce genre si besoin:


Object.defineProperty(Element.prototype, 'classList', {enumerable: false, configurable: true, get: function(){
var _this=this, o = {
add: function(c){
var cl=_this.getATtribute('class'); 
cl=cl&&cl.split(' ')||[]; 
if (!cl.indexOf(c)<0) { cl.push(c); _this.setAttribute('class', cl.join(' ')); return true; } 
else return false; 
},
remove: function(c){
var cl=_this.getATtribute('class'); 
cl=cl&&cl.split(' ')||[];
var idx=cl.indexOf(c); 
if (idx>=0) { cl.splice(idx,1); _this.setAttribute('class', cl.join(' ')); return true; } 
else return false;
}
};
Object.defineProperty(this, 'classList', {configurable: false, enumerable: false, writable: false, value: o});
return o;
});


Note 1: classList possède aussi la méthode toggle que je n'ai pas mis ici.

Note 2: ce code d'émulation ne marche que pour IE9. Pas de solution simple pour IE5-8. Mais il semblerait que la plupart des grands acteurs les ont aujourd'hui abandonnés de toute façon.
Modifié par QuentinC (31 Mar 2016 - 09:10)
Merci pour vos éclaircissement Smiley cligne

Olivier C,

Je suis avec Drupal7, apparemment la bibliothèque JQuery est chargée. J'ai mis ton code, pas de réaction malheureusement. Dans mes hrefs, je suis obligé de mettre "/lenomdusite/#Ancre" pour que mon lien soit validé à la création de mes liens menu. Je ne sais pas si c'est la cause, vu que je ne pige pas grand chose dans le JQuery. .
J'ai rapidement fait un test en html/css/JavaScript avec "/lenomdusite/#Ancre" et "#Ancre" dans le href="", les deux marchent. Smiley cligne

Je vais regarder sur Drupal si il y a quelque chose qui cloche pourtant la bibliothèque JQuery à l'air d'être chargée. . Smiley murf Bon je ne sais comment vérifié quelle soit prise en compte mais le module JQuery est installé. . Smiley rolleyes

Smiley biggol C'est gavant les cms lorsque l'on ne connait pas les petits rouages qui font fonctionner les chose directement. Smiley biggol
Bonjour,
blond1n a écrit :
Je vais regarder sur Drupal si il y a quelque chose qui cloche pourtant la bibliothèque JQuery à l'air d'être chargée. . Smiley murf Bon je ne sais comment vérifié quelle soit prise en compte mais le module JQuery est installé. . Smiley rolleyes

Juste petite astuce, tu ouvres ta console de développement sur ta page, tu tapes $ et tu valides avec Entrée, et si tu vois apparaître une fonction c'est que jQuery a de forte chance d'être chargée.
Tu peux ensuite justement vérifier en tapant de la même manière jQuery, et si c'est la même fonction qu'au dessus, c'est que la librairie est bien chargée.
Merci de coup de main Smiley smile

J'ai mis dans la console le $, et JQuery :

$ -> undefined
jQuery -> function(e, t)

En modifiant la partie haute du code de Olivier C, ça à marché, coup de bol, sur un autre forum, un gars m'a mis le code qu'il a mis ..

// Smooth Scroll to ID HashTags
jQuery(document).ready(function($) {
//$(function() {
  $('a[href*=#]:not([href=#])').click(function() {
    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
      var target = $(this.hash);
      target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
      if (target.length) {
        $('html,body').animate({ scrollTop: target.offset().top }, 1500);
        return false;
      }
    }
  });
});

Modifié par blond1n (06 Apr 2016 - 17:40)
Smiley smile

Merci les kiwis de vous êtes arrêtez sur mon post ! !!

Smiley smile
Modifié par blond1n (06 Apr 2016 - 17:42)