2010-08-04 4 views
1

J'essaye d'écrire un script greasemonkey qui n'affiche que des photos avec les tags bacon.Accès au noeud <span> en Javascript

Le site, il fonctionne sur est écrit comme ceci:

<div class="photos"> 
<ul> 
... 
<li> 
<a href="photo1"> <img src="http://somesite.co/photo1.jpg" </a> <br /> <a href="tags_photo1"> <span class="tags">&nbsp;bacon, delicious&nbsp;</span> </a> 
</li> 
... 
</ul> 
</div> 

Au début, j'essayé d'utiliser DOM par acessing div puis en utilisant childNodes. Je pouvais accéder à l'img et aux deux nœuds href, mais pas au span.

Ensuite, j'ai essayé d'utiliser cela pour obtenir les étiquettes de la durée:

tagNodes=document.getElementsByClassName('tags'); 

Et il est revenu une collection XPCNativeWrapper dont tous les éléments ne sont pas définis.

Des idées sur la façon d'obtenir les étiquettes? Je suis assez nouveau pour javascript, donc je suis désolé si ma question est stupide.

[Modifier]

var spans, tags;  
spans = document.getElementsByTagName('span'); 
for (var i = spans.length - 1; i >= 0; --i) 
{ 
    tags = spans[i]; 
    alert(tags.wrappedJSObject.nodeValue); 
} 

retours NULL, même avec wrappedJSObject. Est-ce parce que Object.prototype ne fonctionne pas pour XPCNativeWrapper? Ou est-ce que je manque quelque chose?

Répondre

3

En utilisant pur Javascript (plutôt que d'utiliser une bibliothèque comme jQuery - que je ne pense pas que vous pouvez utiliser dans un script Greasemonkey), cela devrait fonctionner:

var spans = document.getElementsByTagName("span"); 
for(var i = spans.length - 1; i >= 0; i--) { 
    if(spans[i].className == "tags") { 
     var span = spans[i]; 
     // do something to span 
    } 
} 

Vous pouvez regarder dans jQuery , si vous le pouvez, parce que le code jQuery serait:

$("span.tags").each(function() { 
    var span = this; 
    // do something to span 
}); 

[EDIT]

vous pourriez avoir des problèmes b ecause votre balise img n'est pas fermée. Une fois que vous avez accès à la plage avec les balises, vous devez simplement obtenir la propriété innerHTML.

Ce code supprime l'ensemble élément de la liste, si l'élément tags ne contient pas "lard":

var spans = document.getElementsByTagName("span"); 
for(var i = spans.length - 1; i >= 0; i--) { 
    if(spans[i].className == "tags") { 
     var span = spans[i]; 
     if (!span.innerHTML.match(/bacon/i)) { 
      var li = span.parentElement.parentElement; 
      li.style.display = "none"; 
     } 
    } 
} 
+0

2 choses: for (int i = 0; i = 0; - i) { fait. Et traves [i] renvoie [objet XPCNativeWrapper [objet HTMLImageElement]] Merci pour l'aide si – Vcitric

+0

Cela explique ce que XPCNativeWrapper est: https://developer.mozilla.org/en/XPCNativeWrapper Ainsi, vous devriez être en mesure de traiter un élément enveloppé dans XPCNativeWrapper comme s'il s'agissait de l'élément lui-même. La section intitulée "Going Deeper" dans cet article devrait aider aussi: http://www.oreillynet.com/pub/a/network/2005/11/01/avoid-common-greasemonkey-pitfalls.html? page = 2 –

+0

span.innerText renvoie undefined – Vcitric