Обнаружение событий onChange из CKEditor с помощью Jquery
Я работаю с CKEditor и jQuery, и я хотел бы переключить флаг на true всякий раз, когда пользователь изменяет значение поля. Одним из этих полей является экземпляр CKEditor.
все textareas, которые имеют класс "wysiwyg", преобразуются в CKEditors, но как-то $('.wysiwyg').change()
событие никогда не обнаружены. Я немного погуглил, но комбинация ключевых слов, похоже, не приносит ничего, кроме нерелевантных результатов (мой google-Fu отстой).
Спасибо за любую помощь :)
Edit:
for (var i in CKEDITOR.instances) {
CKEDITOR.instances[i].on('click', function() {alert('test 1 2 3')});
}
я попробовал приведенный выше код и он не работает. Это не дает мне ошибки, означающей, что он находит объекты CKEditor, но по какой-то причине слушатель не привязан к нему?
кроме того, если я заменю вложение события просто alert(CKEDITOR.instances[i].name);
это предупредит имя моего textarea, поэтому я знаю, что не пытаюсь присоединить событие click ни к чему:)
14 ответов
вы можете получить плагин (и объяснение о том, что вещи обнаруживаются как изменения) в этом сообщении:http://alfonsoml.blogspot.com/2011/03/onchange-event-for-ckeditor.html таким образом, вы можете делать такие вещи, как
for (var i in CKEDITOR.instances) {
CKEDITOR.instances[i].on('change', function() {alert('test 1 2 3')});
}
мне не удалось заставить onchange работать, однако onblur, похоже, работает, что может быть достаточно для ваших нужд
CKEDITOR.instances['name'].on('blur', function() {alert(1);});
теперь есть событие изменения:http://docs.ckeditor.com/#!/api / CKEDITOR.редактор-событие-изменение
следующее работает для меня, используя версию 4.4.3. Вам нужно обрабатывать, когда изменяется источник и 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');
});
Я понял!
сначала у меня были редакторы в моей сети, созданные как textareas с классом ckeditor, и я позволил ckeditor.Яш сделать их richTextEditors. Затем я попробовал различные решения из других ответов, но не смог заставить их работать.
Затем я изменил имя класса (на CKeditor), поэтому мне нужно инициализировать Редакторы в моем коде. Я пробовал это, и это работает:
<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!');});
});
поэтому, когда редактор теряет фокус, он проверяет, грязно ли это, и если это так, то это запускает измененную функцию (предупреждение в данном примере).
позже я попробовал снова с плагином onchanges, таким образом:
$('.CKeditor').ckeditor();
for (var i in CKEDITOR.instances) {
CKEDITOR.instances[i].on('change', function() {alert('text changed!');});
}
теперь он работает и с плагином (спасибо @Alfonso). Но я думаю, что плагин делает события изменений слишком много, я предпочитаю первое решение, где изменения оцениваются только на blur.
надеюсь, что это помогает! и спасибо всем за помощь.
CKEditor имеет функцию a 'checkDirty()'
. Самый простой способ проверить, было ли изменено значение CKEditor, - добавить этот фрагмент JS в свой код.
CKEDITOR.instances['emailBody'].on('blur', function(e) {
if (e.editor.checkDirty()) {
var emailValChanged=true; // The action that you would like to call onChange
}
});
Примечание: emailBody
- это идентификатор вашего поля textarea
лучшее, что я могу сделать, в основном дает вам представление о том, изменилось ли содержимое редактора из исходного состояния.
var editor = $('#ckeditor').ckeditorGet();
editor.on("instanceReady", function(){
this.document.on("keyup", function(){
console.log(editor.checkDirty());
});
});
Я не придумал решение, но следующая ссылка рассказывает больше о событиях, доступных с помощью CKEditor:
http://alfonsoml.blogspot.com/2009/09/ckeditor-events.html
Это не идеальное решение, которое я искал, но я использую следующее, чтобы отметить, что мой контент был изменен:
CKEDITOR.on('currentInstance', function(){modified = true;});
это на самом деле не означает, что содержимое было изменено, но что пользователь сфокусировался или размылся из редактора (это лучше, чем ничего).
для изменения события загрузите плагин onchange http://ckeditor.com/addon/onchange и сделайте это
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);
editor = CKEDITOR.appendTo('container', {resize_enabled: false});
editor.on('key', function () { setTimeout(setHtmlData,10); });
etc
из того, что я вижу на сайте документации CKEditor CKEditor поставляется со встроенной обработкой событий. Это означает, что вы должны использовать это вместо JQuery для прослушивания события onChange. Это также в основном потому, что, когда редакторы, такие как CKEditors, создают свои "причудливые" uis, вы в конечном итоге будете слушать неправильный элемент для изменения. Я считаю, что если вы можете получить ссылку на объект javascript CKEditor, вы сможете написать что-то вроде этого:
ckRefObj.on('onChange', function() { /* do your stuff here */ });
Я надеюсь, что это помогает.
этот код будет предупреждать пользователя при нажатии на любую ссылку боковой панели
$("#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;
}
Я, по-видимому, не могу просто добавить комментарий, потому что я новичок на сайте, но ответ Гарри правильный, и я независимо проверил его, поэтому я хотел добавить это.
с CKEditor.экземпляры[xxx].on ('change', function () {alert ('значение изменено!!')});
Это работает для CKEditor 4+ и захватывает все события изменений, включая отмену и повтор, что делает работу JS Альфонсо ненужной для новых пользователей.
$(document).ready(function () {
CKEDITOR.on('instanceReady', function (evt) {
evt.editor.on('blur', function () {
compare_ckeditor('txtLongDesc');
});
});
});
Не знаю о событии "изменение", но событие "размытие" отлично работает для меня, когда я использую CKEditor версии 3.6
для более поздних гуглеров я заметил, что если вы создадите CKEditor с помощью этого
$("#mytextarea").ckeditor();
он работает, но в форме отправки не обновляется mytextarea
значение, поэтому он отправляет старое значение
но
Если вам это нравится
CKEDITOR.replace('mytextarea');
на форме отправить он отправляет новое значение