Je travaille avec CKEditor et jQuery et j'aimerais basculer un indicateur sur true lorsqu'un utilisateur modifie la valeur d'un champ. L'un de ces champs est une instance de CKEditor.
Toutes les zones de texte ayant la classe "wysiwyg" sont converties en CKEditors, mais l'événement $('.wysiwyg').change()
n'est jamais détecté. J'ai fait quelques recherches sur Google, mais la combinaison de mots clés ne semble générer que des résultats non pertinents (mon google-fu est nul).
Merci pour toute aide :)
Modifier:
for (var i in CKEDITOR.instances) {
CKEDITOR.instances[i].on('click', function() {alert('test 1 2 3')});
}
J'ai essayé le code ci-dessus et cela ne fonctionne pas. Cela ne me donne pas une erreur signifiant qu'il trouve les objets CKEditor mais pour une raison quelconque, l'auditeur n'y est pas attaché?
De plus, si je remplace l'attachement d'événement par alert(CKEDITOR.instances[i].name);
, cela alertera le nom de mon textarea, je sais donc que je n'essaie pas d'attacher l'événement click à rien :)
Vous pouvez obtenir un plugin (et une explication des modifications détectées) dans cet article: http://alfonsoml.blogspot.com/2011/03/onchange-event-for-ckeditor.html so you peut faire des choses comme
for (var i in CKEDITOR.instances) {
CKEDITOR.instances[i].on('change', function() {alert('test 1 2 3')});
}
Je n'ai pas réussi à faire fonctionner le système mais onblur semble fonctionner, ce qui peut suffire à vos besoins.
CKEDITOR.instances['name'].on('blur', function() {alert(1);});
Il y a maintenant un événement de changement: http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change
Ce qui suit fonctionne pour moi avec la version 4.4.3. Vous devez gérer le changement de source et HTML.
// Initialize the rich text editor.
var bodyEditor = CKEDITOR.replace('emailTemplate_Body',
{
readOnly: false
});
// Handle when the Source changes.
bodyEditor.on('mode', function () {
if (this.mode == 'source') {
var editable = bodyEditor.editable();
editable.attachListener(editable, 'input', function () {
alert('source changed');
});
}
});
// Handle when the HTML changes.
bodyEditor.on('change', function () {
alert('change fired');
});
J? ai compris!
Tout d'abord, les éditeurs de mon site Web ont été créés en tant que textareas avec la classe ckeditor, et j'ai laissé le fichier ckeditor.js en faire de richTextEditors. Ensuite, j'ai essayé différentes solutions des autres réponses, mais je n'ai pas réussi à les faire fonctionner.
Puis j'ai changé le nom de la classe (en CKeditor), donc je dois initialiser les éditeurs dans mon code. J'ai essayé ça et ça marche:
<script type="text/javascript" src="/ckeditor/ckeditor.js"></script>
<script type="text/javascript" src="/ckeditor/adapters/jquery.js"></script>
$('.CKeditor').ckeditor(function(){
this.on('blur', function({if(this.checkDirty())alert('text changed!');});
});
Ainsi, lorsqu'un éditeur perd le focus, il vérifie s'il est sale et si c'est le cas, il déclenche la fonction modifiée (l'alerte dans cet exemple).
Plus tard, j'ai essayé à nouveau avec le plugin onchanges, de cette façon:
$('.CKeditor').ckeditor();
for (var i in CKEDITOR.instances) {
CKEDITOR.instances[i].on('change', function() {alert('text changed!');});
}
Maintenant, cela fonctionne aussi avec le plugin (merci @Alfonso). Mais je pense que le plugin déclenche trop les événements de modifications, je préfère la première solution où les modifications ne sont évaluées que sur le flou.
J'espère que cela t'aides! et merci à tous pour votre aide.
Le CKEditor a une fonction 'checkDirty()'
. Le moyen le plus simple de vérifier si la valeur de CKEditor a été modifiée consiste à ajouter cette partie de JS dans votre code.
CKEDITOR.instances['emailBody'].on('blur', function(e) {
if (e.editor.checkDirty()) {
var emailValChanged=true; // The action that you would like to call onChange
}
});
Note: emailBody
- est l'id de votre champ textarea
Le mieux que je puisse faire est de vous indiquer fondamentalement si le contenu de l'éditeur a changé par rapport à l'état d'origine.
var editor = $('#ckeditor').ckeditorGet();
editor.on("instanceReady", function(){
this.document.on("keyup", function(){
console.log(editor.checkDirty());
});
});
Je n'ai pas trouvé de solution, mais le lien suivant en dit plus sur les événements disponibles avec CKEditor:
http://alfonsoml.blogspot.com/2009/09/ckeditor-events.html
Ce n'est pas la solution parfaite que je cherchais, mais j'utilise ce qui suit pour signaler que mon contenu a été modifié:
CKEDITOR.on('currentInstance', function(){modified = true;});
Cela ne signifie pas réellement que le contenu a été modifié, mais que l'utilisateur s'est concentré ou estompé depuis l'éditeur (ce qui est mieux que rien).
Pour changer d’événement, téléchargez le plugin onchange http://ckeditor.com/addon/onchange et faites-le.
var options_cke = { barre d'outils: [ {name: 'basicstyles', items: ['Bold', 'Italic', 'Underline', 'Image', 'TextColor']}, {nom: 'paragraphe', éléments: ['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', 'BGColor']}, {nom: 'police', éléments: ['police', 'styles']} ], sur : { changement: fonction (ev) { //ev.editor.focus(); console.log (ev); } } }; var editor = $ ('yourCkeEditorID'). ckeditor (options_cke);
editor = CKEDITOR.appendTo('container', {resize_enabled: false});
editor.on('key', function () { setTimeout(setHtmlData,10); });
etc
d'après ce que je peux voir sur le site de documentation de CKEditor, CKEditor est livré avec la gestion d'événements construite. Cela signifie que vous devriez utiliser cela au lieu de JQuery pour écouter l'événement onChange. Cela tient aussi principalement au fait que lorsque des éditeurs tels que CKEditors créent leurs fichiers "fantaisistes", vous finissez par écouter le mauvais élément pour un changement. Je pense que si vous pouvez obtenir la référence de l’objet javascript de CKEditor, vous devriez être capable d’écrire quelque chose comme ceci:
ckRefObj.on('onChange', function() { /* do your stuff here */ });
J'espère que ça aide.
Ce code avertira l'utilisateur en cliquant sur un lien de la barre latérale.
$("#side-menu a").click(function(e){
if(checkUnsaved()){
if (confirm("You have unsaved changes.Do you want to save?")) {
e.preventDefault();
}
// or ur custom alert
}
});
function checkUnsaved() {
if(CKEDITOR)
return CKEDITOR.instances['edit-body'].checkDirty(); // edit-body is the name of textarea in my case.
else
return false;
}
Je ne peux apparemment pas simplement ajouter un commentaire parce que je suis nouveau sur le site, mais la réponse de Garry est correcte et je l’ai vérifiée de manière indépendante. Je voulais donc ajouter ceci.
CKEDITOR.instances [xxx] .on ('change', function () {alert ('la valeur a été modifiée !!')});
Cela fonctionne pour CKEditor 4+ et capture tous les événements de changement, y compris les annulations et les restaurations, rendant le travail js d'Alfonso inutile pour les nouveaux utilisateurs.
$(document).ready(function () {
CKEDITOR.on('instanceReady', function (evt) {
evt.editor.on('blur', function () {
compare_ckeditor('txtLongDesc');
});
});
});
Je ne connais pas l'événement 'change' mais l'événement 'flou' fonctionne parfaitement pour moi lorsque j'utilise CKeditor version 3.6