No código de exemplo a seguir, anexei um onclick
manipulador de eventos ao intervalo que contém o texto "foo". O manipulador é uma função anônima que exibe um alert()
.
No entanto, se eu atribuir ao nó pai innerHTML
, esteonclick
manipulador de eventos será destruído - clicar em "foo" não abre a caixa de alerta.
Isso pode ser corrigido?
<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>
Respostas:
Infelizmente, a atribuição a
innerHTML
causa a destruição de todos os elementos filhos, mesmo se você estiver tentando anexar. Se você quiser preservar os nós filhos (e seus manipuladores de eventos), precisará usar as funções DOM :Edit: solução de Bob, a partir dos comentários. Publique sua resposta, Bob! Receba crédito por isso. :-)
fonte
O uso
.insertAdjacentHTML()
preserva ouvintes de eventos e é compatível com todos os principais navegadores . É uma substituição simples de uma linha para.innerHTML
.O
'beforeend'
argumento especifica onde no elemento inserir o conteúdo HTML. As opções são'beforebegin'
,'afterbegin'
,'beforeend'
, e'afterend'
. Seus locais correspondentes são:fonte
Agora, estamos em 2012 e o jQuery tem funções anexar e anexar que fazem exatamente isso, adicionar conteúdo sem afetar o conteúdo atual. Muito útil.
fonte
.insertAdjacentHTML
existe desde IE4Como uma pequena (mas relacionada) asside, se você usar uma biblioteca javascript como jquery (v1.3) para fazer sua manipulação dom, você pode fazer uso de eventos ao vivo por meio dos quais você configura um manipulador como:
e será aplicado a esse seletor em todos os momentos durante qualquer tipo de manipulação do jquery. Para eventos ao vivo, consulte: docs.jquery.com/events/live para manipulação do jquery, consulte: docs.jquery.com/manipulation
fonte
Eu criei minha marcação para inserir como string, já que é menos código e mais fácil de ler do que trabalhar com as coisas sofisticadas do dom.
Em seguida, criei um innerHTML de um elemento temporário apenas para poder pegar o único filho desse elemento e anexar ao corpo.
fonte
algo.innerHTML + = 'adicione o que quiser';
funcionou para mim. Eu adicionei um botão a um texto de entrada usando esta solução
fonte
Existe outra alternativa: usar em
setAttribute
vez de adicionar um ouvinte de evento. Como isso:fonte
Sim, é possível se você vincular eventos usando o atributo tag
onclick="sayHi()"
diretamente em um modelo semelhante ao seu<body onload="start()">
- essa abordagem é semelhante ao framework angular / vue / react / etc. Você também pode usar<template>
para operar em html 'dinâmico' como aqui . Não é estritamente discreto, no entanto, é aceitável para pequenos projetosfonte
A perda de manipuladores de eventos é, IMO, um bug na maneira como o Javascript lida com o DOM. Para evitar esse comportamento, você pode adicionar o seguinte:
fonte
mydiv.onclick
. Apenas o onclick do span interno é substituído porinnerHTML +=
.Você poderia fazer assim:
fonte
A maneira mais fácil é usar uma matriz e inserir elementos nela e, em seguida, inserir os valores subsequentes da matriz na matriz dinamicamente. Aqui está o meu código:
fonte
Para qualquer matriz de objeto com cabeçalho e dados.
jsfiddle
https://jsfiddle.net/AmrendraKumar/9ac75Lg0/2/
fonte
Sou um programador preguiçoso. Não uso o DOM porque parece uma digitação extra. Para mim, quanto menos código, melhor. Veja como eu adicionaria "bar" sem substituir "foo":
fonte