En el siguiente código de ejemplo, adjunto un onclick
controlador de eventos al intervalo que contiene el texto "foo". El controlador es una función anónima que muestra un archivo alert()
.
Sin embargo, si lo asigno al nodo principal innerHTML
, este onclick
controlador de eventos se destruye; al hacer clic en "foo" no aparece el cuadro de alerta.
¿Es esto reparable?
<html>
<head>
<script type="text/javascript">
function start () {
myspan = document.getElementById("myspan");
myspan.onclick = function() { alert ("hi"); };
mydiv = document.getElementById("mydiv");
mydiv.innerHTML += "bar";
}
</script>
</head>
<body onload="start()">
<div id="mydiv" style="border: solid red 2px">
<span id="myspan">foo</span>
</div>
</body>
</html>
javascript
html
innerhtml
dom-events
Miguel
fuente
fuente
Respuestas:
Desafortunadamente, la asignación a
innerHTML
causa la destrucción de todos los elementos secundarios, incluso si está intentando agregar. Si desea conservar los nodos secundarios (y sus controladores de eventos), deberá usar las funciones DOM :Editar: la solución de Bob, de los comentarios. ¡Publica tu respuesta, Bob! Obtenga crédito por ello. :-)
fuente
El uso
.insertAdjacentHTML()
conserva los detectores de eventos y es compatible con todos los navegadores principales . Es un simple reemplazo de una línea para.innerHTML
.El
'beforeend'
argumento especifica en qué parte del elemento insertar el contenido HTML. Las opciones son'beforebegin'
,'afterbegin'
,'beforeend'
, y'afterend'
. Sus ubicaciones correspondientes son:fuente
Ahora, estamos en 2012, y jQuery tiene funciones de agregar y anteponer que hacen exactamente esto, agregar contenido sin afectar el contenido actual. Muy útil.
fuente
.insertAdjacentHTML
ha existido desde IE4Como ayuda leve (pero relacionada), si usa una biblioteca javascript como jquery (v1.3) para realizar su manipulación dom, puede hacer uso de eventos en vivo mediante los cuales configura un controlador como:
y se aplicará a ese selector en todo momento durante cualquier tipo de manipulación de jquery. Para eventos en vivo, consulte: docs.jquery.com/events/live para la manipulación de jquery, consulte: docs.jquery.com/manipulation
fuente
Creé mi marcado para insertarlo como una cadena, ya que es menos código y más fácil de leer que trabajar con las cosas elegantes de dom.
Luego lo hice innerHTML de un elemento temporal solo para poder tomar el único hijo de ese elemento y adjuntarlo al cuerpo.
fuente
something.innerHTML + = 'agrega lo que quieras';
funcionó para mí. Agregué un botón a un texto de entrada usando esta solución
fuente
Hay otra alternativa: usar en
setAttribute
lugar de agregar un detector de eventos. Me gusta esto:fuente
Sí, es posible si enlaza eventos usando el atributo de etiqueta
onclick="sayHi()"
directamente en una plantilla similar a la suya<body onload="start()">
: este enfoque es similar a los marcos angular / vue / react / etc. También puede utilizar<template>
para operar en html 'dinámico' como aquí . No es un js estrictamente discreto, sin embargo, es aceptable para proyectos pequeñosfuente
La pérdida de controladores de eventos es, en mi opinión, un error en la forma en que Javascript maneja el DOM. Para evitar este comportamiento, puede agregar lo siguiente:
fuente
mydiv.onclick
. Solo se anula el clic del intervalo internoinnerHTML +=
.Podrías hacerlo así:
fuente
La forma más fácil es usar una matriz e insertar elementos en ella y luego insertar los valores subsiguientes de la matriz en la matriz de forma dinámica. Aquí está mi código:
fuente
Para cualquier matriz de objetos con encabezado y datos.
jsfiddle
https://jsfiddle.net/AmrendraKumar/9ac75Lg0/2/
fuente
Soy un programador vago. No uso DOM porque parece una escritura adicional. Para mí, cuanto menos código, mejor. Así es como agregaría "bar" sin reemplazar "foo":
fuente