Wykrywanie zdarzeń onChange z Ckeditora za pomocą Jquery

Pracuję z Ckeditorem i jQuery i chciałbym zmienić flagę na true za każdym razem, gdy użytkownik zmieni wartość pola. Jednym z tych pól jest instancja CKEditor.

Wszystkie textareas, które mają klasę wysiwyg, są konwertowane do CKEditors, ale w jakiś sposób Zdarzenie $('.wysiwyg').change() nigdy nie zostanie wykryte. Zrobiłem trochę googling, ale kombinacja słów kluczowych wydaje się przynieść nic, ale nieistotne wyniki(mój google-fu ssie).

Dzięki za pomoc :)

Edit:

for (var i in CKEDITOR.instances) {
        CKEDITOR.instances[i].on('click', function() {alert('test 1 2 3')});
    }

Wypróbowałem powyższy kod i nie działa. Nie daje mi to błędu, co oznacza, że znajduje obiekty CKEditor, ale z jakiegoś powodu słuchacz nie jest do niego przywiązany?

Również, jeśli zamienię załącznik zdarzenia NA po prostu {[2] }To powiadomi nazwę mojego textarea, więc wiem, że nie próbuję dołączyć zdarzenia kliknięcia do niczego:)

Author: Gazillion, 2011-02-28

14 answers

Możesz uzyskać wtyczkę (i wyjaśnienie, jakie rzeczy są wykrywane jako zmiany) w tym poście: http://alfonsoml.blogspot.com/2011/03/onchange-event-for-ckeditor.html więc możesz robić takie rzeczy jak

for (var i in CKEDITOR.instances) {
        CKEDITOR.instances[i].on('change', function() {alert('test 1 2 3')});
    }
 53
Author: AlfonsoML,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-06 20:43:39

Nie udało mi się uruchomić onchange, jednak onblur wydaje się działać, co może być wystarczające dla Twoich potrzeb

CKEDITOR.instances['name'].on('blur', function() {alert(1);});
 14
Author: Alexei Tenitski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-26 21:20:46

Jest teraz zdarzenie zmiany: http://docs.ckeditor.com/#! / api / CKEDITOR. editor-event-change

Poniżej działa dla mnie w wersji 4.4.3. Musisz obsłużyć, gdy zmieni się źródło i 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');
});
 13
Author: Garry English,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-31 02:58:42

Mam!

Najpierw miałem edytory na mojej stronie utworzone jako textareas z klasą ckeditor, i pozwoliłem ckeditor.js robią z nich richTextEditors. Potem próbowałem różnych rozwiązań od innych odpowiedzi, ale nie mogłem ich uruchomić.
Następnie zmieniłem nazwę klasy (na CKeditor), więc muszę zainicjować edytory w moim kodzie. Próbowałem tego i działa:

<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!');});
});

Więc gdy edytor straci fokus sprawdza czy jest brudny, a jeśli jest to odpala zmieniony funkcja (alert w tym przykładzie).

Później próbowałem ponownie z wtyczką onchanges, w ten sposób:

$('.CKeditor').ckeditor();
for (var i in CKEDITOR.instances) {
    CKEDITOR.instances[i].on('change', function() {alert('text changed!');});
}

Teraz działa również z wtyczką (dzięki @ Alfonso). Ale myślę, że wtyczka sprawia, że zmiany zdarzenia ogień zbyt dużo, wolę pierwsze rozwiązanie, gdzie zmiany są oceniane tylko na blur.

Mam nadzieję, że to pomoże! i dziękuję wszystkim za pomoc.
 11
Author: Peto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-02 09:46:57

CKEditor posiada funkcję a 'checkDirty()'. Najprostszym sposobem sprawdzenia, czy wartość CKEditor została zmieniona, jest dodanie tego fragmentu JS do kodu.

CKEDITOR.instances['emailBody'].on('blur', function(e) {
    if (e.editor.checkDirty()) {
        var emailValChanged=true; // The action that you would like to call onChange
    }
});

Uwaga: emailBody - jest id twojego pola textarea

 8
Author: Ryan Wright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-25 11:00:32

Najlepsze, co mogę zrobić, w zasadzie daje wskazówkę, czy Zawartość edytora zmieniła się ze stanu pierwotnego.

var editor = $('#ckeditor').ckeditorGet();

editor.on("instanceReady", function(){                    
     this.document.on("keyup", function(){
     console.log(editor.checkDirty());
   });
});
 7
Author: Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-14 17:42:37

Nie wymyśliłem rozwiązania, ale poniższy link mówi więcej o wydarzeniach dostępnych w witht he CKEditor:

Http://alfonsoml.blogspot.com/2009/09/ckeditor-events.html

Nie jest to idealne rozwiązanie, którego szukałem, ale używam następującego oznaczenia, aby zaznaczyć, że moja zawartość została zmodyfikowana:

CKEDITOR.on('currentInstance', function(){modified = true;});

To nie znaczy, że treść została zmodyfikowana, ale że użytkownik skupił się lub rozmazał z edytora (co jest lepsze niż nic).

 3
Author: Gazillion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-28 17:29:16

Dla zmiany zdarzenia Pobierz wtyczkę onchange http://ckeditor.com/addon/onchange i zrób to


var options_cke ={
         toolbar :
        [
            { name: 'basicstyles', items :['Bold','Italic','Underline','Image', 'TextColor'] },
            { name: 'paragraph', items : [ 'JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock','BGColor' ] },
                        { name: 'font', items : [ 'Font','Styles']}

        ],
                on :
                {
                    change :function( ev )
                    {
                        //ev.editor.focus();
                        console.log(ev);
                    }
                }

     };
 var editor=$('yourCkeEditorID').ckeditor(options_cke);
 2
Author: Flegoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 10:19:31
editor = CKEDITOR.appendTo('container', {resize_enabled: false}); 
editor.on('key', function () { setTimeout(setHtmlData,10); });

Etc

 2
Author: user1005462,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-08 11:07:24

Z tego co widzę na stronie dokumentacji CKEditor CKEditor posiada wbudowaną obsługę zdarzeń. Oznacza to, że powinieneś użyć tego zamiast JQuery do nasłuchania zdarzenia onChange. Dzieje się tak głównie dlatego, że gdy redaktorzy tacy jak CKEditors tworzą swój "fantazyjny" interfejs użytkownika, dla odmiany będziesz słuchał niewłaściwego elementu. Uważam, że jeśli można uzyskać odniesienie do obiektu javascript CKEditor powinieneś być w stanie napisać coś takiego:

ckRefObj.on('onChange', function() { /* do your stuff here */ });
Mam nadzieję, że to pomoże.
 1
Author: Simon H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-28 15:01:02

Ten kod powiadomi użytkownika po kliknięciu dowolnego linku na pasku bocznym

$("#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;
}
 0
Author: Serjas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 10:02:37

Najwyraźniej nie mogę po prostu dodać komentarza, ponieważ jestem nowy na stronie, ale odpowiedź jest poprawna i niezależnie ją zweryfikowałem, więc chciałem dodać to.

CKEDITOR.instancje [xxx].on ('change', function () {alert ('wartość zmieniona!!')});

To działa dla CKEditor 4+ i przechwytuje wszystkie zdarzenia zmiany, w tym undo i redo, przez co praca js staje się zbędna dla nowych użytkowników.

 0
Author: Stan Lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-27 03:48:36
$(document).ready(function () {        
    CKEDITOR.on('instanceReady', function (evt) {                    
        evt.editor.on('blur', function () {
            compare_ckeditor('txtLongDesc');
        });                    
    });
});

Nie wiem o zdarzeniu 'change', ale zdarzenie 'blur' działa dla mnie doskonale, gdy używam CKeditor w wersji 3.6

 0
Author: Himalaya Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-08 09:42:09

Dla późniejszych Googlerów zauważyłem, że jeśli utworzysz CKEditor używając tego

$("#mytextarea").ckeditor();

Działa, ale na formularzu submit nie aktualizuje mytextarea wartości, więc wysyła starą wartość

Ale

If you do like this

CKEDITOR.replace('mytextarea');

W formularzu submit wysyła nową wartość

 -1
Author: Ergec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-07 08:29:04