Je veux exécuter une fonction lorsqu'un utilisateur modifie le contenu d'un attribut div
with contenteditable
. Quel est l'équivalent d'un onchange
événement?
J'utilise jQuery donc toutes les solutions qui utilisent jQuery sont préférées. Merci!
javascript
jquery
html
contenteditable
Jourkey
la source
la source
document.getElementById("editor").oninput = function() { ...}
.Réponses:
Je vous suggère d' attache des auditeurs à des événements clés tirés par l'élément modifiable, mais vous devez être conscient que
keydown
etkeypress
événements sont déclenchés avant que le contenu lui - même est changé. Cela ne couvrira pas tous les moyens possibles de modifier le contenu: l'utilisateur peut également utiliser couper, copier et coller à partir des menus du navigateur d'édition ou de contexte, vous pouvez donc également gérer les événementscut
copy
etpaste
. De plus, l'utilisateur peut supprimer du texte ou d'autres contenus, il y a donc plus d'événements (mouseup
par exemple). Vous souhaiterez peut-être interroger le contenu de l'élément comme solution de rechange.MISE À JOUR 29 octobre 2014
L' événement HTML5
input
est la réponse à long terme. Au moment de la rédaction, il est pris en charge pour lescontenteditable
éléments des navigateurs Mozilla actuels (de Firefox 14) et WebKit / Blink, mais pas IE.Démo:
Démo: http://jsfiddle.net/ch6yn/2691/
la source
cut
,copy
et lespaste
événements dans les navigateurs qui les soutiennent (IE 5+, Firefox 3.0+, Safari 3+, Chrome)input
événement HTML5 .Voici une version plus efficace qui utilise
on
pour tous les contenus modifiables. Il est basé sur les meilleures réponses ici.Le projet est ici: https://github.com/balupton/html5edit
la source
document.getElementById('editor_input').innerHTML = 'ssss'
. L'inconvénient est qu'il nécessite IE11Pensez à utiliser MutationObserver . Ces observateurs sont conçus pour réagir aux changements dans les DOM, et en remplacement performant des événements de mutation .
Avantages:
Les inconvénients:
Apprendre encore plus:
la source
input
événement HTML5 (qui est priscontenteditable
en charge dans tous les navigateurs WebKit et Mozilla qui prennent en charge les observateurs de mutation), car la mutation DOM peut se produire via un script ainsi que l'entrée utilisateur, mais c'est une solution viable pour ces navigateurs. J'imagine que cela pourrait nuire à la performance plus que l'input
événement aussi, mais je n'ai aucune preuve tangible pour cela.input
événement HTML5 se déclenche dans chacune de ces situations (en particulier glisser-déposer, italique, copier / couper / coller via le menu contextuel). J'ai également testé le bolding w / cmd / ctrl + b et obtenu les résultats attendus. J'ai également vérifié et j'ai pu vérifier que l'input
événement ne se déclenche pas sur les changements de programmation (ce qui semble évident, mais est sans doute contraire à un langage déroutant sur la page MDN pertinente; voir le bas de la page ici pour voir ce que je veux dire: développeur .mozilla.org / en-US / docs / Web / Events / input )J'ai modifié la réponse de lawwantsin comme ça et cela fonctionne pour moi. J'utilise l'événement keyup au lieu de keypress qui fonctionne très bien.
la source
réponse non jQuery rapide et sale :
la source
Deux options:
1) Pour les navigateurs modernes (à feuilles persistantes): L'événement "input" agirait comme un événement "change" alternatif.
https://developer.mozilla.org/en-US/docs/Web/Events/input
ou
ou (avec jQuery)
2) Pour prendre en compte IE11 et les navigateurs modernes (à feuilles persistantes): Cela surveille les changements d'éléments et leur contenu à l'intérieur de la div.
https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
la source
la source
Voici ce qui a fonctionné pour moi:
la source
Ce fil a été très utile pendant que j'enquêtais sur le sujet.
J'ai modifié une partie du code disponible ici dans un plugin jQuery afin qu'il soit sous une forme réutilisable, principalement pour répondre à mes besoins, mais d'autres peuvent apprécier une interface plus simple pour démarrer en utilisant des balises modifiables.
https://gist.github.com/3410122
Mise à jour:
En raison de sa popularité croissante, le plugin a été adopté par Makesites.org
Le développement se poursuivra à partir d'ici:
https://github.com/makesites/jquery-contenteditable
la source
Voici la solution que j'ai finalement utilisée et qui fonctionne à merveille. J'utilise $ (this) .text () à la place parce que j'utilise juste un div d'une ligne dont le contenu est modifiable. Mais vous pouvez également utiliser .html () de cette façon, vous n'avez pas à vous soucier de la portée d'une variable globale / non globale et l'avant est en fait attaché à l'éditeur div.
la source
Pour éviter les minuteries et les boutons "enregistrer", vous pouvez utiliser un événement flou qui se déclenche lorsque l'élément perd le focus. mais pour être sûr que l'élément a bien été modifié (pas seulement focalisé et défocalisé), son contenu doit être comparé à sa dernière version. ou utilisez l'événement keydown pour définir un indicateur "sale" sur cet élément.
la source
Une réponse simple dans JQuery, je viens de créer ce code et j'ai pensé qu'il serait utile pour les autres aussi
la source
$("div [contenteditable=true]")
sélectionnera tous les enfants d'un div, directement ou indirectement, qui sont modifiables.Réponse non JQuery ...
Pour l'utiliser, appelez (disons) un élément d'en-tête avec id = "myHeader"
Cet élément sera désormais modifiable par l'utilisateur jusqu'à ce qu'il perd le focus.
la source
L'événement onchange ne se déclenche pas lorsqu'un élément avec l'attribut contentEditable est modifié, une approche suggérée pourrait être d'ajouter un bouton, de "sauvegarder" l'édition.
Vérifiez ce plugin qui gère le problème de cette manière:
la source
L'utilisation de DOMCharacterDataModified sous MutationEvents entraînera la même chose. Le délai est configuré pour empêcher l'envoi de valeurs incorrectes (par exemple, dans Chrome, j'ai eu quelques problèmes avec la touche espace)
Exemple JSFIDDLE
la source
DOMCharacterDataModified
ne se déclenche pas lorsque l'utilisateur modifie du texte existant, par exemple en appliquant du gras ou de l'italique.DOMSubtreeModified
est plus approprié dans ce cas. De plus, les utilisateurs doivent se rappeler que les anciens navigateurs ne prennent pas en charge ces événements.J'ai construit un plugin jQuery pour ce faire.
Vous pouvez simplement appeler
$('.wysiwyg').wysiwygEvt();
Vous pouvez également supprimer / ajouter des événements si vous le souhaitez
la source
innerHTML
est cher). Je recommanderais d'utiliser l'input
événement où il existe et de revenir à quelque chose comme ça, mais avec une sorte de rebond.Dans Angular 2+
la source
Veuillez suivre la solution simple suivante
En .ts:
en .html:
la source
Découvrez cette idée. http://pastie.org/1096892
Je pense que c'est proche. HTML 5 doit vraiment ajouter l'événement change à la spécification. Le seul problème est que la fonction de rappel évalue si (avant == $ (this) .html ()) avant que le contenu ne soit réellement mis à jour dans $ (this) .html (). setTimeout ne fonctionne pas, et c'est triste. Laissez-moi savoir ce que vous pensez.
la source
D'après la réponse de @ balupton:
la source