52 votes

déclencher un événement lorsque contenteditable est modifié

Lorsque la valeur d'un divs est modifiée, comment puis-je déclencher un événement ?

<div class="changeable" contenteditable="true"> Click this div to edit it <div>

Ainsi, lorsque son contenu change, je veux créer une alerte et/ou faire d'autres choses :

$('.changeable').text().change(function() {
  alert('Handler for .change() called.');
});

2 votes

Duplication possible de événements de changement de contenu

0 votes

Ajout d'une nouvelle réponse aquí

51voto

Niklas Points 17865

Il suffit de stocker le contenu dans une variable et de vérifier s'il est différent après blur() événement. S'il est différent, enregistrez le nouveau contenu.

var contents = $('.changeable').html();
$('.changeable').blur(function() {
    if (contents!=$(this).html()){
        alert('Handler for .change() called.');
        contents = $(this).html();
    }
});

exemple : http://jsfiddle.net/niklasvh/a4QNB/

0 votes

Merci beaucoup @Niklas !

2 votes

Il s'agit d'un sale coup qui ne devrait pas être utilisé.

0 votes

Modifié le code de @Niklas et ajouté la nouvelle réponse aquí

20voto

Haeresis Points 21

Vous pouvez simplement utiliser l'événement focus/blur avec la fonction data() de jQuery :

// Find all editable content.
$('[contenteditable=true]')
    // When you click on item, record into data("initialText") content of this item.
    .focus(function() {
        $(this).data("initialText", $(this).html());
    });
    // When you leave an item...
    .blur(function() {
        // ...if content is different...
        if ($(this).data("initialText") !== $(this).html()) {
            // ... do something.
            console.log('New data when content change.');
            console.log($(this).html());
        }
    });
});

UPDATE : Avec Vanilla JS

// Find all editable content.
var contents = document.querySelectorAll("[contenteditable=true]");
[].forEach.call(contents, function (content) {
    // When you click on item, record into `data-initial-text` content of this item.
    content.addEventListener("focus", function () {
        content.setAttribute("data-initial-text", content.innerHTML);
    });
    // When you leave an item...
    content.addEventListener("blur", function () {
        // ...if content is different...
        if (content.getAttribute("data-initial-text") !== content.innerHTML) {
            // ... do something.
            console.log("New data when content change.");
            console.log(content.innerHTML);
        }
    });
});

0 votes

+1 pour être la seule solution à ma question (non postée) "comment détecter le début de l'édition ?"... pour pouvoir afficher un bouton de sauvegarde etc.... Toutes les questions connexes sont axées sur la détection du changement, pas sur le début de la session d'édition...

0 votes

+1 pour montrer comment traiter tous les éléments modifiables sans avoir à référencer l'id spécifiquement. Fonctionne très bien pour créer une simple grille éditable avec une table html.

0 votes

Très utile lorsque l'édition dans une table html déclenche un appel ajax ! !!

15voto

Canaan Etai Points 307

La meilleure solution à ce problème est actuellement le Événement de saisie HTML5

<div contenteditable="true" id="content"></div>

dans votre jquery.

$('#content').on('input', (e) => {
    // your code here
    alert('changed')
});

0 votes

Fonctionne très bien !

2 votes

Cela devrait probablement être la réponse acceptée - je considère que c'est la plus simple et aussi la meilleure.

1 votes

Le seul problème, c'est que input est déclenché à chaque pression de touche alors que change est déclenché à la fin, une fois que toutes les données ont été saisies. Dans mon cas, j'ai besoin d'un événement de changement, et non de saisie.

12voto

Blowsie Points 25114

J'ai construit un plugin jQuery pour faire cela.

(function ($) {
    $.fn.wysiwygEvt = function () {
        return this.each(function () {
            var $this = $(this);
            var htmlold = $this.html();
            $this.bind('blur keyup paste copy cut mouseup', function () {
                var htmlnew = $this.html();
                if (htmlold !== htmlnew) {
                    $this.trigger('change')
                }
            })
        })
    }
})(jQuery);

Vous pouvez simplement appeler $('.wysiwyg').wysiwygEvt();

Vous pouvez également supprimer ou ajouter des événements si vous le souhaitez.

0 votes

Qu'est-ce que that en that.bind(...) ?

0 votes

blur keyup paste copy cut mouseup c'est tous les événements potentiels de changement

0 votes

that.bind(...) devrait être $this.bind(...)

7voto

VasG Points 58

Il est plus simple de le faire en utilisant EventListener (pas une méthode jQuery) :

document.getElementById("editor").addEventListener("input", function() {
   alert("input event fired");
}, false);

3 votes

C'est une bonne chose pour les navigateurs Mozilla et WebKit récents, mais malheureusement pas pour les navigateurs suivants contenteditable dans n'importe quelle version d'IE ou d'Opera.

0 votes

Ceci peut également être utilisé avec jquery pour faciliter l'attachement aux classes, $('.class').on('input', function(){})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X