Intenté cargar algunos guiones en una página usando innerHTML
en un <div>
. Parece que el script se carga en el DOM, pero nunca se ejecuta (al menos en Firefox y Chrome). ¿Hay alguna manera de ejecutar scripts al insertarlos con innerHTML
?¿Se pueden insertar scripts con innerHTML?
Código de ejemplo:
<!DOCTYPE html>
<html>
<body onload="document.getElementById('loader').innerHTML = '<script>alert(\'hi\')<\/script>'">
Shouldn't an alert saying 'hi' appear?
<div id="loader"></div>
</body>
</html>
Lo que realmente quiero hacer es cargar un script externo, no sólo eval una secuencia de comandos local. Agregar una etiqueta de script con innerHTML es mucho más breve que crear un elemento DOM de script y agregarlo al cuerpo, y estoy tratando de hacer que mi código sea lo más breve posible. ¿Tienes que crear los elementos del guión dom y agregarlos a la dom en lugar de usar algo como innerHTML? ¿Hay alguna manera de hacer esto con document.write desde dentro de una función? – Craig
Como sugiere zombat, utilice un marco de JavaScript para cargar el script externo, no intente reinventarlo. JQuery lo hace extremadamente fácil, solo incluya JQuery y llame a: $ .getScript (url). También puede proporcionar una función de devolución de llamada que se ejecutará una vez que se carga el script. –
Ariel tiene razón. Agradezco tratar de mantener el código corto, y agregar una etiqueta '
Sí, puedes, pero tienes que hacerlo fuera del DOM y el orden debe ser el correcto.
... alertará 'foo'. Esto no funcionará:
Y aunque esto no funcionará, debido a que el nodo se inserta en primer lugar:
Fuente
2009-07-29 12:23:05 mwilcox
Por lo que vale: esto no parece funcionar en los navegadores actuales. –
Lo que en realidad es algo bueno, creo. – jayarjo
Aquí es una solución muy interesante para su problema: http://24ways.org/2005/have-your-dom-and-script-it-too
Así que use esto en lugar de etiquetas de scripts:
<img src="empty.gif" onload="alert('test');this.parentNode.removeChild(this);" />
Fuente
2010-09-15 03:07:44 user447963
¡muy bueno, y trabajando completamente en todos los navegadores! –
¡Esto es brillante! – confile
No funciona para mí, cuando se inserta en un resultado de una solicitud de AJAX: falta de sintaxis; declaración anterior al inicio de la secuencia de comandos – Oliver
Puede crear secuencias de comandos y luego inyectar el contenido.
Esto funciona en todos los navegadores :)
Fuente
2011-08-14 00:36:57
A menos que no haya otros elementos de script en el documento. Use 'document.documentElement' en su lugar. –
No es necesario porque está escribiendo un script desde otro script. '' –
Quién dice que es de otro guión? Puede ejecutar JavaScript sin los elementos '
Ejecutar etiqueta (Java Script) de innerHTML
Reemplazar el elemento de guión con div que tiene un atributo de clase class = "javascript" y cerrarla con
</div>
No cambie el contenido que desea ejecutar (anteriormente estaba en la etiqueta de script y ahora está en la etiqueta div)
Agrega un estilo a tu página ...
<style type="text/css"> .javascript { display: none; } </style>
Ahora ejecute eval usando jQuery (JS Jquery deben estar ya incluidos)
se puede explorar más here, en mi blog.
Fuente
2013-01-22 14:29:12
que utiliza este código, que está trabajando muy bien
Fuente
2013-04-29 12:04:56
Gracias. Resolvió mi problema de agregar el código de Disqus Universal a una ventana emergente modal creada con el complemento Jquery de TinyBox2. – gsinha
Desafortunadamente, esta solución no funciona cuando el script contiene funciones que se invocarán más adelante. –
Probé esto y que está funcionando. Gracias @mwilcox.
Fuente
2013-07-14 14:23:33 user2573178
Aquí es un método que sustituye a todos los scripts de forma recursiva con los ejecutables:
Ejemplo de llamada:
Fuente
2013-12-14 14:20:25 momomo
Estoy un poco sorprendido de que tu respuesta haya bajado. En mi humilde opinión, esta es la mejor solución, este método incluso le permite restringir las secuencias de comandos con URL específicas o contenido. – davidmh
ahora funciona en firefox – inf3rno
@ inf3rno does or does not? Solía funcionar, ¿alguien alguna vez afirmó algo diferente? – momomo
Krasimir Tsonev tiene una gran solución que superar todos los problemas. Su método no necesita el uso de eval, por lo que no existen problemas de rendimiento ni de seguridad. Le permite establecer innerHTML cadena contiene html con js y traducirlo de inmediato a un elemento DOM, mientras que también ejecuta las partes js existen a lo largo del código. corto, simple y funciona exactamente como lo desea.
disfrutar de su solución:
http://krasimirtsonev.com/blog/article/Convert-HTML-string-to-DOM-element
Notas importantes:
Fuente
2014-01-28 16:22:41 user3198805
Use
$(parent).html(code)
en lugar deparent.innerHTML = code
.Lo siguiente también corrige scripts que usan
document.write
y scripts cargados a través del atributosrc
. Lamentablemente, incluso esto no funciona con las secuencias de comandos de Google AdSense.Source
Fuente
2014-05-07 08:27:04 iirekm
un poco tarde aquí, pero cualquiera que pueda estar usando este método, observe que en JQuery necesita cargar sus scripts usando $ .loadScript (url) en lugar de
añada la etiqueta en la cabeza después de poner texto en innerHTML y se ejecutará
Fuente
2015-01-09 09:47:40 Vaibhav
Para cualquier persona todavía está tratando de hacer esto, no, no se puede inyectar un script utilizando
innerHTML
, pero es posible cargar una cadena en una etiqueta de script usandoBlob
yURL.createObjectURL
.He creado un ejemplo que le permite ejecutar una cadena como una secuencia de comandos y obtener las exportaciones '' de la secuencia de comandos devuelven a través de una promesa:
He simplificado esto desde mi aplicación real, así que no hay promesas de que no haya ningún error en ello. Pero el principio funciona.
Si no le importa recuperar ningún valor después de que se ejecuta el script, es aún más fácil; simplemente deje fuera los bits
Promise
yonload
. Ni siquiera necesita envolver el script o crear la propiedad globalwindow.__load_script_exports_
.Fuente
2016-11-04 15:21:11 JayArby
Lo probé y funciona en Chrome 57. innerHTML en una etiqueta de script ejecuta el texto. – iPherian
Es interesante, no funcionó antes. Me pregunto si este comportamiento es de navegador cruzado o solo en cromo 57. – JayArby
Aquí es una función recursiva para establecer el innerHTML de un elemento que yo uso en nuestro servidor de anuncios:
Se puede ver la demo here.
Fuente
2017-05-02 08:08:59
Mi solución para este problema es establecer un Mutation Observer para detectar
<script></script>
nodos y luego reemplazarlo con un nuevo nodo<script></script>
con el mismo src. Por ejemplo:Fuente
2017-10-06 13:34:52
Pruebe usar template y document.importNode. He aquí un ejemplo:
Fuente
2018-02-09 16:44:05 Gray
Cuestiones relacionadas