Question

Je voudrais prendre le code trouvé ici: http: //www.jslab.dk/articles/non.recursive.preorder.traversal.part2

// HTML element
var root = document.documentElement;

recursivePreorder(root);

// Recusively find and handle all text nodes
function recursivePreorder(node) {  
  // If node is a text node
  if (node.type == 3) {
    // Do something with node
  }
  // else recurse for each child node
  else {
    for(var i=0; i<node.childNodes.length; i++)
      recursivePreorder(node.childNodes[i]);
  }
}

et le convertir en propre jQuery.

Une idée? Je sais récursion exige argument.callee puisque les callbacks dans jQuery sont anonymes, mais je suis trop nouveau pour JQuery de le prendre plus loin.

Merci!

Était-ce utile?

La solution

Code de Canard a souligné, jQuery parcourt les noeuds dans la source d'ordre, profondeur d'abord - ou, comme vous l'appelez, pré-commande. Cependant, contents obtient seulement des nœuds enfants immédiats, non descendants. Essayez ceci:

$(document).contents ().each (function processNodes ()
{
    if (this.nodeType == 3)
        doSomething (this); // do something with text node
    else
        $(this).contents ().each (processNodes);
});

En aparté, arguments.callee est marqué contre-indication, d'où la fonction nommée (par opposition à l'anonymat)

Autres conseils

À moins que c'est un devoir et vous êtes obligé de passer par toute la folie loufoque, il y a sûrement un moyen plus facile avec jQuery pour accomplir tout ce que vous essayez de faire ...

jQuery a un ensemble assez robuste de sélecteurs qui vous permettront de simplement sélectionner et retourner une collection de tous d'un type d'élément spécifié dans une page ou d'un élément (ex. Toutes les balises de paragraphe dans une balise div donnée). Ils seront dans l'ordre de votre retour, ils apparaissent dans les DOM (ce qui est à peu près ce que vous obtenez au-dessus). Vous pouvez également utiliser un filtre comme suggéré ci-dessus.

Si vous avez besoin de le faire dans un ordre spécifique, alors je suggère d'utiliser les sélecteurs ou les filtres pour saisir l'élément que vous voulez commencer à et ensuite en boucle à travers ses enfants récursive. jQuery a une fonction intégrée pour retourner les enfants d'un élément donné.

En tant que plugin jQuery (ajoute également une fonction de pause (comme jQuery.each), et une option pour pré ou post-ordre, YMMV avec post-ordre)

$.fn.walk = function(visit, post_order) {
    if(this.length === 0) { return; }
    this.each(function(i) {
        if (!post_order) {
            if (visit.call(this, i, this) === false) { return false; }
        }
        $j(this).children().walk(visit, post_order);
        if (post_order) { return visit.call(this, i, this); }
    });
}

Je pense qu'il est aussi simple que

var collection=$(document).contents().filter(function() { return this.nodeType == 3; });

Ensuite, vous êtes peut soit exécuter vos commandes sur l'ensemble de collection utilisant $.each, ou si vous voulez exécuter une méthode jQuery sur l'ensemble, on ne pouvait pas l'assigner à une variable et de la chaîne de la méthode sur la fin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top