2010-05-07 21 views
9

Sto tentando di selezionare tutti i tag <script type="text/html"> in una pagina. Io uso i tag <script> per memorizzare modelli HTML, simili a how John Resig does it. Per qualche ragione, il seguente selettore jquery non sembra essere selezionare nulla:problema selettore jquery con tag di script

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

Questo markup è nel corpo del documento HTML:

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

Ho anche provato a mettere in l'HEAD del documento HTML e non è ancora stato trovato. Nessun avviso è mai mostrato.

Se invece cambiare il mio codice a questo:

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

Poi si trova distante solo gli script nella HEAD che hanno un src in un file esterno. Gli script nella pagina effettiva non vengono trovati. Per esempio, con il seguente nella testa:

<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> 

Ottengo i seguenti avvisi:

  • Trovato script di jQuery
  • sceneggiatura Trovato UI

I custom e filter-test script nella HEAD non è selezionato, né lo script filter-search nel tag body.

È questo il comportamento previsto? Perché non funziona? Posso aggirarlo, ma è fastidioso che non funzioni.

MODIFICA: Si scopre che in realtà funziona bene con l'esempio sopra. Nella mia situazione, il codice jquery era in un modulo Javascript esterno e sicuramente non funzionava. Quando ho spostato il codice in un tag di script nella pagina stessa, ha funzionato. Non ho ancora capito perché non funzionerebbe nel file esterno, ma riferirò di nuovo qui se riuscirò a risolverlo a un certo punto.

+0

Se eseguo il tuo script con jQuery 1.4.2 su Chrome, tutti gli ID desiderati sono allertati – jAndy

+0

@tauren Recentemente ho avuto un problema simile. Per favore, potresti provare un esperimento: cambiare testo/html in qualcos'altro (suggerisci testo/modello) e vedere se funziona con lo script esterno ... – UpTheCreek

risposta

2

Che browser stai utilizzando? Questo script funziona bene per me in Chrome, Firefox e IE6, dandomi gli avvisi

  • Trovato script di jQuery
  • sceneggiatura Trovato UI
  • sceneggiatura Trovato personalizzato
  • script per i modelli Trovato filtro-test
  • Trova ricerca filtro TEMPLATE
+0

Anche io ho funzionato quando ho inserito il codice in un jQuery chiusura pronta nell'HTML stesso. Stavo testando il codice in esecuzione da un modulo javascript esterno che veniva importato invece che esattamente nello script nella mia domanda. Ancora non capisco perché non funziona quando si esegue da un modulo di script esterno. Dovrò esaminarlo più a lungo. Ma almeno funziona da uno script locale. Grazie per averlo provato! – Tauren

1

Il problema riscontrato con uno script esterno è probabilmente dovuto all'ordine di caricamento. Per massimizzare la reattività, il browser inizia a caricare ed eseguire gli script man mano che si incontrano nella pagina, prima che la pagina venga persino completamente scaricata e analizzata. Quindi, se hai uno script collegato nell'elemento head, probabilmente non sarà in grado di accedere a parti del DOM specificate più in basso nella pagina, come i tuoi tag script personalizzati.

Due possibili soluzioni:

  • riorganizzare i tag di script in modo che i tag personalizzati vengono prima gli script che li utilizzano.
  • Avvolgi gli script con qualcosa che attenda il caricamento del DOM (come il jQuery $() shortcut).
Problemi correlati