La récursivité en bas de l'arbre DOM
C'est le code de Crockford JavaScript: Les Bonnes Pièces.
var results = [];
var walkDOM = function (node,func) {
func(node); //What does this do?
node = node.firstChild;
while(node) {
walkDOM(node,func);
node = node.nextSibling;
}
};
Je comprends le code, sauf pour func(node)
. Je suppose que le point est de passer node
comme paramètre dans la fonction func
, mais comment le navigateur comprendre de cette façon? node
et func
pourrait être n'importe quoi--alors, quand la fonction est appelée, elle pourrait lire comme ceci:
walkDOM(document.body,function(att) {
node.getAttribute(att);
results.push(node);
});
Quand func
est passé, walkDOM
traitera de la fonction(att) {...}(document.corps)--qui n'aurait pas de sens. Alors pourquoi Crockford a choisi d'inclure func(nœud)?
- Il est prévu que le développeur à l'aide de
walkDOM
va passer une fonction qui s'attend à recevoir un DOM de noter que l'argument. Votre fonction s'attend à recevoir un nom d'attribut, et en tant que tel, ne serait pas appropriée. - ne comprends toujours pas la notation de
func(node)
. Est le développeur censé remplacer parfunction(node)
? Et si non, commentfunc(node)
sens pour le navigateur? - Le navigateur n'a pas besoin d'en comprendre le sens. Seul le développeur qui a écrit la fonction qui lui a été transmis
walkDOM
doit faire sens. Si je veux marcher sur le DOM, chaque nœud de texte, et de remplacer le texte par "patrick dw est tellement beau", puis je place cette logique dans la fonction que j'ai passer. LewalkDOM
va passer chaque nœud à votre fonction (un à la fois), et votre fonction est responsable de faire quelque chose avec ce nœud. - ...rappelez-vous,
func
est tout simplement une référence à la même fonction que vous avez passé àwalkDOM
. Doncfunc( node )
est tout simplement l'appel de votre fonction, et en passant le nœud courant. - Avez-vous éventuellement d'acquérir une compréhension complète de la walkTheDOM code? Si non, j'aimerais de l'aide.
- La fonction récursive dans l'exemple comprend l'utilisation de nœud.getAttribute simplement à démontrer pour le noob de l'élève et qui non seulement les nœuds peuvent être obtenus, mais leurs attributs. Il anticipe la question de savoir " si les nœuds peut être accédé comme cela, peut attributs?' - il n'est pas le code complet, qui pourrait inclure quelque chose comme var attrVariable = node.getAttribute("class"); je suppose que vous pourriez parcourir les résultats de tableau et d'examiner les attributs, mais si vous ne voulait retourner des nœuds dans ce tableau avec des attributs qui correspondent seulement à un certain type?
Vous devez vous connecter pour publier un commentaire.
Me semble que la
func
est utilisé pour faire quelque chose pour chaque nœud de l'arbre.Par exemple, si je voulais alerter le nom de la balise pour chaque noeud de l'arbre tout entier:
Dans votre exemple de fonction:
... vous avez nommé le
node
paramètreatt
, mais ce n'est pas comme par magie dans un nom d'un attribut. Je m'attends à une "variable" nœud "n'est pas définie" lorsquenode.getAttribute(att)
est couru, parce que le nœud est en cours de mise àatt
... il n'y a pas denode
en fonction de la portée.Oui cet arbre transversal de la fonction a un sens puisque :
Cela dit, cet algorithme a toujours l'air incorrect pour moi, car elle ne s'explore à travers le premier de la fratrie ; d'autres frères et sœurs seront tout simplement ignorés. Donc, je recommande l'utilisation de cette approche plus traditionnelle à la place :
Noter que la version est "en profondeur d'abord" (c'est à dire de ne pas appeler appel func() avant le traitement des enfants), mais je préfère le recommande depuis func est susceptible de modifier les nœuds. De cette façon, le traitement d'un parent, sera en mesure d'examiner l'état actuel de sa déjà transformés enfants avant d'émettre, éventuellement, de l'onu-les changements appropriés.
La
func
c'est dans leligne est ce qui est généralement connu comme un fonction de rappel. Une fonction qui est disponible pour une utilisation par le
walkDOM
fonction. Il pourrait faire du sens avec un plus prolixe nom de la fonction:Espère que cela efface les choses pour vous.
Crockford code est le passage d'un rappel à walkDOM qui peut être utilisé de nombreuses façons de traiter les arguments transmis.
Un exemple pourrait être une méthode qui retourne le nombre de tous les éléments du DOM avec le tag: