2016-04-10 22 views
-2

Ich versuche, das DOM einer Seite mit Javascript zu gehen, und eine einfache Warnung für jedes Tag, das TagName-Attribut anzuzeigen. Es scheint nicht zu funktionieren.Walking das DOM (JavaScript)

Dies ist der Code und die HTML in einem jsfiddle (und Beow) https://jsfiddle.net/fluffymuffins/fw208ozk/

Ich sehe keine Warnungen. Was ist los mit dir?

HTML

<body> 
test text 
<p> 
some paragraph 
</p> 
<img src="http://example.com/image.jpg"> 
</body> 

JS

var results = []; 

walkDOM(document.body, function(node) { 
    alert(node.tagName); 
}); 

var walkDOM = function (node,func) { 
     func(node);      //What does this do? 
     node = node.firstChild; 
     while(node) { 
      walkDOM(node,func); 
      node = node.nextSibling; 
     } 

    }; 
+0

Es gibt eine Tolles Tool, das Ihnen helfen kann - [postthtml] (https://github.com/postthtml/posthtml). Es ist wie ein PostCSS, aber für HTML. Es hat fast die gleiche API, also gibt es nichts Schwieriges, Ihnen ein einfaches Plugin zu machen, das genau das tut, was Sie brauchen. – denysdovhan

+0

Warum würden Leute dies ablehnen, ohne es zu erklären. – Daisetsu

Antwort

2

Also, Sie eine Methode aufrufen, die noch nicht existiert:

leicht nach Ihrer Methode Erklärung rufen:

var results = []; 

//declaration before 
var walkDOM = function (node,func) { 
     func(node);      //What does this do? 
     node = node.firstChild; 
     while(node) { 
      walkDOM(node,func); 
      node = node.nextSibling; 
     } 
};  

//invoke method after 
walkDOM(document.body, function(node) { 
    alert(node.tagName); 
}); 

Ihr Fiddle aktualisiert: https://jsfiddle.net/diegopolido/fw208ozk/3/

Die func(node); Linie bedeutet, dass Sie die Funktion von den args sich berufen, vielleicht dieses Beispiel wird dein Geist klären:

var walkDOM = function (node,func) { 
     func(node); //this will invoke the functionToInvoke from arg 
     node = node.firstChild; 
     while(node) { 
      walkDOM(node,func); 
      node = node.nextSibling; 
     } 
};  

var functionToInvoke = function(node) { 
    alert(node.tagName); 
}; 

walkDOM(document.body, functionToInvoke); 

Ihre aktualisierte Fiddle dafür: https://jsfiddle.net/diegopolido/fw208ozk/5/

+0

Danke, ich habe JS seit Jahren nicht geschrieben. Ich habe vergessen, dass die Reihenfolge der Definition zählt. – Daisetsu

+0

@Daisetsu Ihr war ein Funktionsausdruck wie 'var funcName = function() {}' und aufgrund der JS-Hubregeln müssen sie deklariert werden, bevor sie aufgerufen werden, aber wenn Sie wie 'function funcName() {}' dann getan haben wäre eine Funktionsdefinition und du könntest sie irgendwo platzieren und von überall anrufen (vorausgesetzt, dass du in einem zugänglichen Bereich anrufst) – Redu