2010-10-29 18 views
0

Je travaille mon chemin à travers le O'Reilly jQuery Cookbook. Dans. 100 il y a un exemple où je ne reçois pas un détail. Je suis dans ma première semaine à regarder jQuery, donc ce n'est pas une surprise, mais j'espère que quelqu'un peut clarifier.jQuery question d'itération (confus par l'exemple dans un livre)

La fonction est une bascule avec quelques cloches & sifflets:

onValue et offValue sont à la fois booléens, et doivent avoir des sens opposés, et il aurait pu être plus clair d'avoir un seul d'entre eux, mais l'idée est pour accueillir quelque chose où (par exemple) name est "désactiver". l'option on, également une valeur booléenne, permet de l'utiliser comme appelant un « ensemble » au lieu d'une « bascule »

jQuery.fn.toggleAttr = function (name, onValue, offValue, on) { 
    function set($element, on) { 
     var value = on ? onValue : offValue; 
     return value == null ? $element.removeAttr(name) : $element.attr(name, value); 
    } 
    return on !== undefined ? 
     // next line is where I'm confused 
     set(this, on) : 
     this.each(function (i, element) { 
      var $element = $(element); 
      set($element, $element.attr(name) !== onValue); 
     }); 
}; 

Comment est set(this, on) travaille ici? Il semble fonctionner sur la liste des éléments, mais quelque chose doit arriver à chaque élément, et je ne vois pas ce qui pourrait provoquer une itération. Je l'aurais prévu quelque chose de plus comme le on === undefined cas, quelque chose comme:

 this.each (function(i, element) { 
      set($(element), on); 
     )} 

Alors, suis-je manque quelque chose?

+0

Je suis coupable de ne pas lire le code aussi près que je devrais, j'ai supprimé ma réponse. Je dirais maintenant que vous n'avez pas fourni assez d'informations. Comment savez-vous que cet ensemble est appliqué à une liste d'éléments? Pour que je puisse suivre ce qui se passe, je devrais voir comment toggleAttr est appliqué. – mikerobi

+0

Je sais que parce que 'toggleAttr' est défini comme une méthode de jQuery.fn (j'espère que la terminologie est correcte, je suis un développeur C++, nouveau dans jQuery). Cela sera appelé dans un contexte comme: 'jQuery ('ul # liste de li li'). ToggleAttr (" pertinent ", vrai, faux, vrai);' ou 'jQuery ('# workers li'). ToggleAttr ("on-shift", true, false); ' –

Répondre

0

Lorsque on n'est pas réglé alors les boucles fonction toggleAttr à travers chacun des éléments de vérification que la valeur actuelle de l'attribut name est réglé sur et en le comparant à la variable onValue.

Lorsque on est défini, cela signifie que vous dites toggleAttr "Je veux que vous basculiez tous les éléments sur true/false et ignoriez la valeur actuelle". Il n'a donc pas besoin de faire une boucle sur tous les éléments et de vérifier à quoi la valeur actuelle est définie, car vous lui avez demandé de forcer la valeur.

Exemple: http://jsfiddle.net/petersendidit/sHJC3/2/

+0

Je pense que je vois: donc quand' set' est passé un objet jQuery, et que cet objet est une liste, 'set' opère implicitement sur les éléments de la liste, parce que' jQuery.fn.removeAttr' et 'jQuery.fn.attr' opèrent implicitement sur les éléments de la liste. Est-ce exact? –

+0

correct 'jQuery.fn.removeAttr' et' jQuery.fn.attr' s'exécutent sur les objets jQuery, peu importe si l'objet jQuery a 12 éléments dans la collection ou 1. – PetersenDidIt