2009-07-01 12 views
10

que estoy tratando de hacer lo siguiente (estoy usando la biblioteca de prototipo):Por qué no puedo agregar una cadena que contiene una etiqueta de secuencia de comandos para innerHTML en IE

var div = document.createElement('div'); 
div.innerHTML = '<script src="somescript.js"></script>'; 
$('banner').insert(div); 

En IE, div.innerHTML la propiedad siempre es igual a "" después de establecer la propiedad en la segunda línea.

Este fragmento está dentro de una función que reemplaza a document.write() en un script de proveedor externo, por eso lo hago así en lugar de crear un elemento de script y anexarlo directamente al elemento div.

Cualquier ayuda realmente sería apreciada, ¡esto me da canas!

+0

(+1) buena pregunta. –

Respuesta

6

Se podría tratar de hacer algo como esto en su lugar:

function loadScript(src) { 
     var script = document.createElement("script"); 
     script.type = "text/javascript"; 
     document.getElementsByTagName("head")[0].appendChild(script); 
     script.src = src; 
} 

o hacer

.. 
div.innerHTML = "<script src=\"somescript.js\"></script>"; 
.. 
+4

+1 para la primera opción. –

+0

También prefiero el primero. Es mucho más limpio y reutilizable. El 2º fue solo una sugerencia "prueba" si no quiere usar el primer enfoque :) – Juri

+0

Tengo la vaga sensación de que el problema del OP es en realidad una característica de seguridad en el trabajo y su primera respuesta aquí es la convencional (y sin bloqueo!) solución. – annakata

1

¿Ha intentado agregar JS en línea en lugar de cargar un archivo .js? He hecho esto en el pasado y funcionó bien para mí. No estoy seguro si eso funcionaría con los últimos navegadores/missery de seguridad.

HTH.

7

Su etiqueta de script es, probablemente, consiguen ser interpretado de forma independiente. Pruebe:

div.innerHTML = '<scr' + 'ipt src="somescript.js"></scr' + 'ipt>'; 
+0

Este es un problema común con el uso de etiquetas de script en el código y muy probablemente el problema aquí – jcoder

+0

Esto es interesante. ¿Puedes elaborar? – bitsprint

+0

+1 Esto me parece el problema. – RedFilter

11

Esto me ha bloqueado un poco también. Resulta que IE no permite la inserción de JS directamente a través de innerHTML a menos que incluya la propiedad 'aplazar' (consulte el segundo enlace a continuación). Esta propiedad es exclusiva de IE y, aparentemente, permite que IE difiera la ejecución de cualquier JS hasta que se haya cargado el otro marcado. Sin embargo, una advertencia ... si incluye dos etiquetas de secuencia de comandos (como yo lo hice), no hay garantía de que se ejecutará primero, ya que las secuencias de comandos parecen estar cargadas de forma asíncrona. Esto solo debería ser un problema si sus scripts son dependientes el uno del otro (como el mío).

También hay una advertencia adicional ... debe insertar marcas que no sean secuencias de comandos al mismo tiempo que inserta la secuencia de comandos. No pude insertar las etiquetas de secuencia de comandos por sí mismas, con o sin la propiedad 'aplazar'. Finalmente, las etiquetas de scripts deben colocarse después de que se inserten todas las demás marcas de scripts. De lo contrario, las etiquetas de script se eliminan del HTML insertado.

Aquí hay algunas referencias:

MS innerHtml Referencia:

http://msdn.microsoft.com/en-us/library/ms533897%28v=vs.85%29.aspx

MS Defer Referencia del inmueble:

http://msdn.microsoft.com/en-us/library/ms533719%28v=vs.85%29.aspx

ejemplo de secuencia de comandos de inserción a través de código (sí, de hecho funciona):

http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/insertScript_2.htm

Mi Código de prueba:

// I downloaded the MS example file above and tweaked their script a bit, 
// resulting in this. Using the proper approach to the defer property 
// (namely: defer="defer") did not provide me with consistent results, so 
// sticking with 'DEFER' may be necessary. 
// Note: Try moving the 'sHTML' variable to the end of the script string. 
function insertScript2() 
{ 
    var sHTML="<input type=button onclick=" + "go2()" + " value='Click Me'><BR>"; 
    var sScript = sHTML + "<SCRIPT DEFER type='text/javascript'> function go2(){ alert('Hello from inserted script.') } </SCRIPT" + ">"; 
    ScriptDiv.innerHTML = sScript; 
} 
Cuestiones relacionadas