2009-10-26 12 views
58

Qualcuno sa come selezionare nodi di commento HTML con jQuery?Selezione di commenti HTML con jQuery

<html> 
<head> 
    <title>Check Test</title> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
    <script type="text/javascript"> 
     $(function() { 
      $("body *").each(function() { 
       alert($(this).wrap("<span />").parent().html()); 
      }); 
     }); 
    </script> 
</head> 
<body> 
    <!-- Hello --> 
    <p> 
     <label for="thing">Thing Label</label> 
     <input id="thing" type="checkbox" /> 
    </p> 

Questo non sollevare il commento.

+0

Penso che la risposta contrassegnata non sia la migliore. È una buona idea segnare una seconda risposta che ha più voti. – Mohammad

risposta

11

C'è lo jQuery comments() plugin che lo farà per voi. Uso:

var comments = $("#foo").comments(); 
alert(comments.html()); 
+0

Devo davvero essere in grado di selezionare i commenti allo stesso modo di qualsiasi altro elemento, ma è un buon inizio, grazie –

11

E se non si vuole un plugin:

var content = jQuery('body').html(); 
alert(content.match(/<!--.*?-->/g)); 

Questo utilizza le espressioni regolari. È impostato per cercare qualsiasi cosa racchiuso tra <!-- e --> mentre non importa ciò che è scritto all'interno.

NOTA: non sono sicuro, tuttavia, se jQuery restituisce anche commenti. In caso contrario, questo approccio non funziona.

+2

Restituisce i commenti, così funziona, grazie per il suggerimento –

+1

Guardando di nuovo, questo è non usare davvero jquery per fare qualcosa di utile, ad esempio document.body.innerHTML == jQuery ('body'). html(), e c'è più di regex di quanto suggerito qui ... ripensandoci, grazie comunque a Mike –

+1

L'espressione regolare è stato apprezzato comunque da questa festa. – 2rs2ts

104

Questo sembra di fare qualcosa di equivalente a quello che stai cercando:

$(function() { 
     $("body").contents().filter(function(){ 
      return this.nodeType == 8; 
     }).each(function(i, e){ 
      alert(e.nodeValue); 
     }); 
    }); 
+7

+1 per l'utilizzo delle proprietà DOM native. –

+26

Questo qualcosa non funziona sempre, questo fa: '$ (" * "). Contents(). Filter (function() {return this.nodeType == 8;})' –

+0

Vedi http://jsfiddle.net/ zM5se/1/per codice funzionante. –

6

Ancora una volta, sono in ritardo nel gioco, ma ho pensato di contribuire indietro come ho trovato questo post utile in una situazione recente ho affrontato.

Nel nostro contesto, abbiamo un servizio pubblicitario che consegna blocchi di codice per il rendering dell'annuncio.

Ogni annuncio ha un 'ID di volo' univoco. Ciò significa che la stessa pubblicità su binario 250x300 può avere più voli. Quindi, in un'impressione, potresti vedere un annuncio per Subway, aggiornare e forse quello di Quizno.

Sfortunatamente, il servizio fornisce questo ID di volo in un commento e non come qualcosa di un po 'più utile come un attributo di dati. Detto questo, ogni commento è all'interno di un tag.

Da quanto sopra, sono stato in grado di mettere insieme questa soluzione per ottenere il numero del volo nel commento sfruttando il metodo exec() di JavaScript dell'oggetto RegExp:

regexComment = new RegExp(/<!--\s*ad flight id:\s*([0-9]+)\s*-->/i); 
targetElement = regexComment.exec($('div.advertisement').html()); 
if(targetElement.length > 0) { 
    return parseInt(targetElement[1]); 
} 

Anche in questo caso, le scuse per la fine del gioco , ma ho pensato che non sarebbe male fornire un altro approccio a questo problema.