Pregunta

Me gustaría tomar el código que se encuentra aquí: 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]);
  }
}

y convertirlo en jQuery limpia.

¿Alguna idea? Sé recursividad requiere argument.callee ya que las devoluciones de llamada en jQuery son anónimas, pero soy demasiado nuevo para jQuery para llevarlo más lejos.

Gracias!

¿Fue útil?

Solución

Como Código Pato señaló, jQuery atraviesa los nodos de origen orden, primero en profundidad - o, como usted lo llama, pre-orden. Sin embargo, sólo se pone contents nodos hijos inmediatos, no los descendientes. Prueba esto:

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

Como acotación al margen, arguments.callee está marcado por depreciación, de ahí el nombre (en comparación con el anonimato) de función

Otros consejos

A menos que esta es una tarea y que está obligado a ir a través de toda la locura descabellado, hay sin duda una manera más fácil con jQuery para lograr lo que estamos tratando de hacer ...

jQuery tiene un conjunto bastante robusta de selectores que le permitirán acaba de seleccionar y devolver una colección de todos un tipo determinado de elemento dentro de una página o un elemento (ej. Todas las etiquetas de párrafo en una etiqueta div dado). Ellos serán devueltos en el orden en que aparecen en el DOM (que es más o menos lo que se obtiene con los anteriores). Alternativamente, se puede utilizar un filtro, como se sugirió anteriormente.

Si necesita hacer esto en un orden específico, entonces se recomienda usar selectores o filtros para agarrar el elemento que desee iniciar en bucle y luego a través de sus hijos de forma recursiva. jQuery ha construido en función de devolver los hijos de un elemento dado.

Como un plugin jQuery: (también agrega una característica de rotura (como jQuery.each), y una opción para pre o post-orden; YMMV con post-orden)

$.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); }
    });
}

Creo que es tan simple como

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

A continuación, usted es, o bien podría ejecutar comandos en el set collection usando $.each, o si desea ejecutar un método jQuery en el set, no se puede asignar a una variable y la cadena del método en el extremo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top