Dans l'exemple de code suivant, j'attache un onclick
gestionnaire d'événements à la plage contenant le texte «foo». Le gestionnaire est une fonction anonyme qui affiche un fichier alert()
.
Cependant, si j'assigne au nœud parent innerHTML
, ce onclick
gestionnaire d'événements est détruit - cliquer sur "foo" ne parvient pas à afficher la boîte d'alerte.
Est-ce réparable?
<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>
Réponses:
Malheureusement, l'affectation à
innerHTML
provoque la destruction de tous les éléments enfants, même si vous essayez d'ajouter. Si vous souhaitez conserver les nœuds enfants (et leurs gestionnaires d'événements), vous devrez utiliser les fonctions DOM :Edit: la solution de Bob, à partir des commentaires. Postez votre réponse, Bob! Obtenez du crédit pour cela. :-)
la source
L'utilisation
.insertAdjacentHTML()
préserve les écouteurs d'événements et est prise en charge par tous les principaux navigateurs . C'est un simple remplacement d'une ligne pour.innerHTML
.L'
'beforeend'
argument spécifie où dans l'élément insérer le contenu HTML. Les options sont'beforebegin'
,'afterbegin'
,'beforeend'
et'afterend'
. Leurs emplacements correspondants sont:la source
Maintenant, nous sommes en 2012 et jQuery a des fonctions d'ajout et de préfixe qui font exactement cela, ajouter du contenu sans affecter le contenu actuel. Très utile.
la source
.insertAdjacentHTML
existe depuis IE4En guise d'asside légère (mais liée), si vous utilisez une bibliothèque javascript telle que jquery (v1.3) pour faire votre manipulation dom, vous pouvez utiliser des événements en direct dans lesquels vous configurez un gestionnaire comme:
et il sera appliqué à ce sélecteur à tout moment pendant tout type de manipulation de jquery. Pour les événements en direct, voir: docs.jquery.com/events/live pour la manipulation de jquery, voir: docs.jquery.com/manipulation
la source
J'ai créé mon balisage à insérer sous forme de chaîne car c'est moins de code et plus facile à lire que de travailler avec les trucs sophistiqués.
Ensuite, je l'ai fait innerHTML d'un élément temporaire juste pour que je puisse prendre le seul et unique enfant de cet élément et l'attacher au corps.
la source
something.innerHTML + = 'ajoutez ce que vous voulez';
cela a fonctionné pour moi. J'ai ajouté un bouton à un texte d'entrée en utilisant cette solution
la source
Il existe une autre alternative: utiliser
setAttribute
plutôt que d'ajouter un écouteur d'événements. Comme ça:la source
Oui, c'est possible si vous liez des événements en utilisant l'attribut de balise
onclick="sayHi()"
directement dans un modèle similaire à votre<body onload="start()">
- cette approche similaire aux frameworks angular / vue / react / etc. Vous pouvez également utiliser<template>
pour opérer sur du HTML «dynamique» comme ici . Ce n'est pas un js discret strict mais il est acceptable pour les petits projetsla source
La perte des gestionnaires d'événements est, IMO, un bogue dans la façon dont Javascript gère le DOM. Pour éviter ce problème, vous pouvez ajouter les éléments suivants:
la source
mydiv.onclick
. Seul le clic de la plage interne est remplacé parinnerHTML +=
.Vous pouvez le faire comme ceci:
la source
Le moyen le plus simple est d'utiliser un tableau et d'y insérer des éléments, puis d'insérer dynamiquement les valeurs suivantes du tableau dans le tableau. Voici mon code:
la source
Pour tout tableau d'objets avec en-tête et données.
jsfiddle
https://jsfiddle.net/AmrendraKumar/9ac75Lg0/2/
la source
Je suis un programmeur paresseux. Je n'utilise pas DOM car cela semble être une saisie supplémentaire. Pour moi, moins il y a de code, mieux c'est. Voici comment ajouter "bar" sans remplacer "foo":
la source