2010-06-02 12 views
22

Ho bisogno di sapere se è possibile ottenere il nodo di esecuzione corrente?JavaScript: ottiene il nodo corrente in esecuzione <script>?

Esempio:

..html 
<script id="x"> 
    console.log(document.currentNode.id); // << this must return "x" 
</script> 
..html 

Grazie!

+1

Cosa useresti questo per? –

+0

Sto cercando di sostituire document.write, per posticipare il caricamento degli annunci ... –

risposta

20

Non so per sicuro al 100%, ma la raccolta di tag script restituiti da document.getElementsByTagName('script') non deve includere i tag di script che si trovano sotto l'attuale esecuzione di <script>. In altre parole, credo che questo dovrebbe funzionare:

var arrScripts = document.getElementsByTagName('script'); 
var strScriptTagId = arrScripts[arrScripts.length - 1].id; 

Questo funziona solo per gli script in corso di esecuzione, come il caricamento della pagina. Se questo viene eseguito in uno script posticipato o come parte di un evento di caricamento della pagina, è probabile che riporti sempre l'ultimo <script> nella pagina completamente visualizzata. Tieni presente che il tag ID non è un attributo valido per <script>, pertanto la tua pagina probabilmente non verrà convalidata. Se si dispone di script esterni che scrivono tag di script (ad esempio, annunci di terze parti), penso che il codice sarà imprevedibile. Ho giocato con questa idea un paio di anni fa e i risultati sono stati insoddisfacenti.

+4

Questo non funzionerà per gli script asincroni. – unscriptable

+6

@unscriptable, sì.Pensavo di averlo spiegato abbastanza chiaramente nella mia risposta. No? – Andrew

16

Gecko (Firefox) supporta una proprietà non standard su un oggetto documento che punta al nodo di script corrente. Si consiglia di controllare questo prima di andare per la risposta di cui sopra.

https://developer.mozilla.org/en-US/docs/DOM/document.currentScript

<script id="x"> 
    console.log(document.currentScript.id); // << this must return "x" 
</script> 
+7

'document.currentScript' è in realtà parte di HTML5: http://www.whatwg.org/specs/web-apps/current-work/multipage/dom.html#dom-document-currentscript – scribu

+2

Chrome supporta anche (dalla v.29) –

+0

A partire da ora, questa è la migliore risposta –

0

perché non utilizzare:

<script id="x"> 
    console.log(document.getElementById("x").id); 
</script> 
+0

Perché non hai il nome dell'ID per cominciare - questo è un problema piuttosto specifico con il contenuto DOM iniettato – Alex

3

Andrews risposta è già stata una buona idea, ma ho vissuto tutte le questioni menzionate. Questo è il motivo per cui ho scelto un approccio diverso che funziona bene con IE, FF e Chrome.

Semplicemente eseguendo lo script in un evento onload di un'immagine. Definendo una gif trasparente a 1pixel in linea e riceverai "questo" quando spara.

Questo esempio viene utilizzato per modificare dinamicamente il contenuto DIV durante il rendering. Il mio obiettivo è riempire il div con un innerHTML differente creato da un rendering xsl basato su browser (non mostrato qui).

Di sicuro è possibile caricare qualsiasi immagine da Internet, quindi non deve essere in linea. E il grande vantaggio: l'immagine e il suo evento si stanno sostituendo con il nuovo contenuto in modo che anche l'immagine scompaia. Anche il "div" non ha bisogno di alcun incarico "id".

<div id="demo"> 
empty 
    <img onLoad="changeNodeOnTheFly(this,'hurra');void(0);" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="/> 
</div> 

Lo script:

<script> 
function changeNodeOnTheFly(ele, text) 
{ 
ele.parentNode.innerHTML=text; 
} 
</script> 

BR Heiko

+0

Un modo molto fresco e sicuro per risolvere questo problema, ottimo ! – Alex

2

Usa document.write per trovare la posizione:

<script data-foo="bar"> 
    var id = 'placeholder-' + Math.floor(Math.random() * 1e10) 
    document.write('<div id=' + id + '></div>') 

    var placeholder = document.getElementById(id) 
    var script = placeholder.previousSibling 
    placeholder.parentNode.removeChild(placeholder) 

    // "bar" is written to the document 
    document.write(script.getAttribute('data-foo')) 
</script> 
Problemi correlati