2009-10-26 19 views
58

¿Alguien sabe cómo seleccionar nodos de comentario HTML con jQuery?Selección de comentarios 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> 

Esto no recoge el comentario.

+0

Creo que la respuesta que marcó no es la mejor. Esa es una buena idea para marcar una segunda respuesta que tiene más voto. – Mohammad

Respuesta

11

Está el jQuery comments() plugin que lo hará por usted. Uso:

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

Realmente necesito poder seleccionar los comentarios de la misma forma que cualquier otro elemento, pero ese es un buen comienzo, gracias –

11

Y si usted no quiere un plugin:

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

Esto utiliza expresiones regulares. Está configurado para buscar cualquier cosa incluida en <!-- y -->, mientras que no importa lo que está escrito en el interior.

NOTA: No estoy seguro, sin embargo, si jQuery también devuelve comentarios. Si no lo hace, este enfoque no funciona.

+2

Devuelve comentarios, por lo que lo anterior funciona, gracias por la sugerencia –

+1

En realidad mirando de nuevo, esto es no es realmente el uso de jquery para hacer nada útil, es decir, document.body.innerHTML == jQuery ('body'). html(), y hay más en la expresión regular que se sugiere aquí ... pensando de nuevo, gracias de todos modos Mike –

+1

La expresión regular Sin embargo, fue apreciado por esta parte. – 2rs2ts

104

Esto parece hacer algo equivalente a lo que estás buscando:

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

+1 para usar las propiedades DOM nativas. –

+26

Esto algo no siempre funciona, este lo hace: '$ (" * "). Contents(). Filter (function() {return this.nodeType == 8;})' –

+0

Ver http://jsfiddle.net/ zM5se/1/para código de trabajo. –

6

Una vez más, estoy al final del partido, pero pensé que había contribuir atrás como me encontré con este post útil en una situación reciente que enfrenté.

En nuestro contexto, tenemos un servicio de anuncios que entrega bloques de código para procesar el anuncio.

Cada anuncio tiene una "identificación de vuelo" única. Lo que significa que el mismo anuncio de raíl lateral de 250x300 puede tener múltiples vuelos. Entonces, en una impresión, es posible que veas un anuncio de Subway, de actualización y quizás de Quizno's.

Desafortunadamente, el servicio ofrece este ID de vuelo en un comentario, y no como algo un poco más útil como un atributo de datos. Dicho esto, cada comentario está dentro de una etiqueta.

De lo anterior, yo era capaz de armar esta solución para obtener el número de vuelo en el comentario aprovechando el método de JavaScript exec() del objeto 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]); 
} 

Una vez más, disculpas por el final del partido , pero pensé que no estaría de más dar otro enfoque a este problema.