2013-03-14 4 views
4

Cela fait maintenant une heure que je me bats avec ça, et je ne peux pas le résoudre. Je suis nouveau à utiliser this sur javascript, mais c'est vraiment simple, et ça ne marche pas."ceci" ne fonctionne pas comme prévu

Voici le HTML

<ul class="nav pull-right nav-tabs" id="primarynav"> 
    <li class=" navlink"> 
     <a href="#">About</a> 
    </li> 
    <li class="navlink active"> 
     <a href="#">Portfolio</a> 
    </li> 
    <li class="navlink"> 
     <a href="#">Contact</a> 
    </li> 
</ul> 

Et les js

$(document).ready(function(){ 
    $(".navlink").click(function(){ 
     $(".navlink").removeClass("active"); 
     this.addClass("active"); 
    }); 
}); 

Il devrait de supprimer la classe active de tous les éléments avec la classe navlink, puis ajoutez la classe active à l'élément cliquée. Mais ce n'est pas le cas.

http://jsfiddle.net/Tckf7/

+0

Gardez la console de développement de votre navigateur ouverte pendant le développement, et lisez les erreurs qu'elle vous donne. –

+0

Le mauvais côté de la garder ouvert est qu'il prendra environ 30% de ma hauteur de l'écran. @thesystem –

+0

Ils peuvent généralement être détachés. –

Répondre

10

Modifier à:

$(this).addClass("active"); 

jsFiddle example

.addClass() est une méthode jQuery et vous aviez essayé de l'appliquer à un objet non jQuery (this vs $(this)).

+0

Cela ne s'arrête pas à une explication de pourquoi '$ (this)' fonctionne quand 'this' ne fonctionne pas. Les nouveaux javascripters ont souvent des problèmes ici, surtout avec jQuery parce que le '$' rend les choses mystérieuses et magiques. – benekastah

+2

@benekastah - Assez bien, mis à jour. – j08691

1

this n'est pas un objet jQuery, utilisez $(this) à la place.

2

addClass() est une méthode jQuery mais this est juste la référence directe à l'objet DOM. Vous devez d'abord ajouter this à un objet jQuery avant de pouvoir utiliser une méthode jQuery.

$(document).ready(function(){ 
    $(".navlink").click(function(){ 
     $(".navlink").removeClass("active"); 
     $(this).addClass("active"); 
    }); 
}); 

DEMO - À l'aide $(this).addClass() au lieu de this.addClass()


Modifier

Pour élaborer un peu sur ce point. Vous ne pouvez jamais appeler la méthode addClass() de jQuery sur un objet JavaScript car addClass() est une méthode jQuery.

Pour faire la même chose en JavaScript pur, si vous voulez simplement utiliser this, vous pouvez utiliser element.className, semblable à ceci:

$(document).ready(function(){ 
    $(".navlink").click(function(){  
     $(".navlink").removeClass("active"); 

     //$(this).addClass("active"); 
     this.className += " active"; 
    }); 
}); 

DEMO - En utilisant this.className exemple


Cependant, si vous utilisez déjà jQuery, il serait peu logique de ne pas utiliser $(this).addClass() à la place.

+0

Donc, si je cible l'élément avec 'getElementById' à la place, je pourrais utiliser' this'? –

+0

@Christian: La méthode 'addClass()' ne fonctionne que lorsqu'elle est appelée sur un objet jQuery car il s'agit d'une méthode jQuery. – Nope

+0

@Christian: par souci d'exhaustivité, j'ai ajouté quelques informations sur la façon dont on pourrait utiliser 'this' et pur JavaScript, mais comme mentionné, vous utilisez déjà jQuery donc' $ (this) .addClass() 'est parfaitement bien. – Nope

1

Vous devez utiliser $ (ce)

$(document).ready(function(){ 
    $(".navlink").click(function(){ 
     $(".navlink").removeClass("active"); 
     $(this).addClass("active"); 
    }); 
}); 

http://jsfiddle.net/Tckf7/2/

2

this fait référence au DOMElement auquel jQuery a attaché l'événement. Pour le transformer en une collection jQuery et être en mesure d'utiliser des méthodes jQuery comme addClass, passer comme argument à $:

$(this).addClass("active"); 

fonctions à l'intérieur, le mot-clé this se réfère en fait au contexte de la fonction. Dans le cas des gestionnaires d'événements, le contexte est le DOMElement auquel le gestionnaire est attaché.

+0

Donc, pour l'utiliser juste avec 'this', je devrais faire' var this = "$ (this);'? –

+0

'this' est un mot-clé spécial, vous ne devriez donc pas essayer de le réassigner. Au contraire, pour stocker la collection jQuery , utilisez une variable comme 'var jQThis = $ (this);' –

+3

@Christian: Une convention courante que j'ai vue et utilisée occasionnellement pour mettre en cache des objets jQuery est 'var $ this = $ (this)' par exemple où '$' est une logique de notation hongroise indiquant que cette variable contient un objet jQuery Bien que la mise en cache soit inutile de 'ceci 'si vous ne l'utilisez qu'une seule fois dans la portée actuelle. – Nope

Questions connexes