2010-06-02 7 views

Respuesta

20

No estoy seguro al 100%, pero la colección de etiquetas de script devueltas por document.getElementsByTagName('script') no debe incluir las etiquetas de secuencia de comandos que se encuentran debajo del <script> actualmente en ejecución. En otras palabras, creo que esto debería funcionar:

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

Esto sólo funcionará para los scripts que se están ejecutando como se carga la página. Si esto se ejecuta en un script diferido o como parte de un evento de carga de página, es probable que siempre informe el último <script> en la página completamente renderizada. Tenga en cuenta que la etiqueta id no es un atributo válido para <script>, por lo que su página probablemente no valide. Si tiene scripts externos que escriben etiquetas de script (por ejemplo, anuncios de terceros), creo que el código será impredecible. Jugué con esta idea hace un par de años y los resultados fueron insatisfactorios.

+4

Esto no funcionará para las secuencias de comandos async. – unscriptable

+6

@unscriptable, sí.Pensé que lo expliqué con bastante claridad en mi respuesta. ¿No? – Andrew

16

Gecko (Firefox) admite una propiedad no estándar en el objeto de documento que apunta al nodo de script actual. Es posible que desee comprobar esto antes de ir a la respuesta anterior.

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' es en realidad parte de HTML5: http://www.whatwg.org/specs/web-apps/current-work/multipage/dom.html#dom-document-currentscript – scribu

+2

Chrome lo admite también (desde v.29) –

+0

A partir de ahora, esta es la mejor respuesta –

0

Por qué no usar:

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

Porque no tiene el nombre ID para empezar - este es un problema bastante específico con contenido de DOM inyectado – Alex

3

Andrews respuesta ya ha sido una buena idea, pero experimentaron todas las cuestiones mencionadas. Es por eso que elegí un enfoque diferente que funciona bien para IE, FF y Chrome.

Simplemente ejecutando el script en un evento de carga de una imagen. Al definir un gif transparente de 1 píxel en línea, recibirás "esto" cuando se dispare.

Este ejemplo se usa para cambiar dinámicamente el contenido de DIV durante el procesamiento. Mi objetivo es llenar el div con un innerHTML diferente creado por un buscador basado en navegador xsl (no se muestra aquí).

Seguro que incluso puede cargar cualquier imagen de Internet, por lo que no debe estar en línea. Y el gran beneficio: la imagen y su evento se están reemplazando con el nuevo contenido, por lo que incluso la imagen desaparecerá. El "div" incluso no necesita ninguna asignación "id".

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

El guión:

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

BR Heiko

+0

Una forma muy buena y más segura de resolver este problema, genial ! – Alex

2

Uso document.write para encontrar su posición:

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