2010-05-07 10 views
9

Estoy intentando seleccionar todas las etiquetas <script type="text/html"> en una página. Yo uso <script> etiquetas para almacenar plantillas HTML, similar a how John Resig does it. Por alguna razón, no parece el siguiente selector de jQuery que la selección de cualquier cosa:problema de selector de jquery con etiquetas de script

$("script[type*=html]").each(function() { 
    alert("Found script "+this.id); 
}); 

Este marcado está en el cuerpo del documento HTML:

<body> 
    <script id="filter-search" type="text/html"> 
     <dt>Search</dt> 
     <dd><input type="text"/></dd> 
    </script> 
</body> 

También he intentado ponerla en el encabezado del documento HTML, y todavía no se encuentra. No se muestra ninguna alerta.

Si en lugar de cambiar el código para esto:

$("script[type*=javascript]").each(function() { 
    alert("Found script "+this.id); 
}); 

luego lo encuentra sólo las secuencias de comandos en la cabeza que tiene un src en un archivo externo. Los guiones en la página actual no se encuentran. Por ejemplo, con el siguiente en CABEZA:

<head> 
    <script type="text/javascript" src="jquery.js" id="jquery"></script> 
    <script type="text/javascript" src="jquery-ui.js" id="ui"></script> 
    <script type="text/javascript" id="custom"> 
     $(document).ready(function() { 
      $("script[type*=javascript]").each(function() { 
       alert("Found script "+this.id); 
      });   
      $("script[type*=html]").each(function() { 
       alert("Found TEMPLATE script "+this.id); 
      });   
     }); 
    </script> 
    <script id="filter-test" type="text/html"> 
     <dt>Test</dt> 
    </script> 
</head> 
<body> 
    <script id="filter-search" type="text/html"> 
     <dt>Search</dt> 
     <dd><input type="text"/></dd> 
    </script> 
</body> 

consigo las siguientes alertas:

  • encontrado guión jQuery
  • guión Encontrado UI

Los custom y filter-test scripts en el HEAD no está seleccionado, ni el script filter-search en la etiqueta body.

¿Es este el comportamiento esperado? ¿Por qué esto no funciona? Puedo evitarlo, pero es molesto que no funcione.

EDITAR: Resulta que esto realmente funciona bien con el ejemplo anterior. En mi situación, el código jquery estaba en un módulo Javascript externo, y definitivamente no funcionaba. Cuando moví el código a una etiqueta de script en la página, funcionó. Todavía no entiendo por qué no funcionaría en el archivo externo, pero informaré aquí si llego a solucionarlo en algún momento.

+0

Si ejecuto su script con jQuery 1.4.2 en cromo, todos los ID deseados son alertados – jAndy

+0

@tauren Recientemente he tenido un problema similar. Por favor, ¿podrías hacer un experimento: el cambio text/html a otra cosa (sugieren texto/plantilla) y ver si esto entonces trabaja con su script externo ... – UpTheCreek

Respuesta

2

¿Qué navegador está utilizando? Este script funciona bien para mí en Chrome, Firefox y IE6, dándome las alertas:

  • encontrado guión jQuery
  • guión Encontrado UI
  • guión Encontrado encargo
  • encontrado guión PLANTILLA filtro de prueba
  • Se encontró el script TEMPLATE de búsqueda de filtro
+0

Tengo que trabajar demasiado cuando pongo el código de la derecha en un jQuery cierre listo en el HTML mismo. Estaba probando el código que se ejecuta desde un módulo de JavaScript externo que se estaba importando en lugar de exactamente el script en mi pregunta. Aún no entiendo por qué no funciona cuando se ejecuta desde un módulo de script externo. Tendré que investigar eso más en algún momento. Pero al menos funciona desde un script local. ¡Gracias por probarlo! – Tauren

1

El problema que estaba teniendo con un script externo es probable debido a la orden de carga. Para maximizar la capacidad de respuesta, el navegador comienza a cargar y ejecutar scripts tal como se encuentran en la página, incluso antes de que la página se descargue y analice completamente. Por lo tanto, si tiene una secuencia de comandos vinculada en el elemento principal, probablemente no podrá acceder a las partes del DOM especificadas más adelante en la página, como las etiquetas de secuencia de comandos personalizadas.

dos soluciones posibles:

  • reordenar las etiquetas de secuencia de comandos para que las etiquetas personalizadas vienen antes que los scripts que los utilizan.
  • envolver su guiones con algo que espera a que el DOM se va a cargar (como el jQuery $() shortcut).