Проверка JQuery не работает с ckeditor
Я использую jQuery для проверки форм. Но когда я использую CKeditor и пытаюсь проверить его с помощью jQuery, он не работает.
Вот фрагмент кода HTML
<form class="form-horizontal" role="form" name="f3" id="f3" >
<div class="col-xs-8">
<textarea class="ckeditor" name="cktext" id="cktext"></textarea>
</div>
<button type="submit" class="btn btn-default btn-success">Submit</button>
</form>
Вот код проверки формы
<script>
$(document).ready(function(){
$("#f3").validate(
{
debug: false,
rules: {
cktext:{
required:true,
minlenght:10
}
}
});
});
</script>
FYI: проверка правильности jquery для других полей формы ожидает, что ckeditor textarea зарегистрировано
Любые предложения.. избавиться от этой проблемы..
Ответы
Ответ 1
Наконец, я нашел ответ на свой вопрос...
Я изменил значение свойства ignore, которое по умолчанию имеет значение: hidden value. поскольку CKEDITOR скрывает проверку jQuery в textarea, не проверяет элемент:
ignore: []
Просто я изменил валидацию script следующим образом.
$(document).ready(function(){
$("#f3").validate(
{
ignore: [],
debug: false,
rules: {
cktext:{
required: function()
{
CKEDITOR.instances.cktext.updateElement();
},
minlength:10
}
},
messages:
{
cktext:{
required:"Please enter Text",
minlength:"Please enter 10 characters"
}
}
});
});
HTML-фрагмент
<form class="form-horizontal" role="form" name="f3" id="f3" >
<div class="col-xs-8">
<textarea class="ckeditor" name="cktext" id="cktext"></textarea>
</div>
<button type="submit" class="btn btn-default btn-success">Submit</button>
</form>
Как я нашел этот ответ в здесь
Спасибо всем...
Ответ 2
Я взял предыдущий ответ и создал его с помощью CKEditor, чтобы вы могли видеть, что нужно сделать, чтобы скопировать содержимое CKEditor в ваше текстовое поле перед отправкой.
Ключевыми битами являются следующие:
CKEDITOR.on('instanceReady', function () {
$.each(CKEDITOR.instances, function (instance) {
CKEDITOR.instances[instance].document.on("keyup", CK_jQ);
CKEDITOR.instances[instance].document.on("paste", CK_jQ);
CKEDITOR.instances[instance].document.on("keypress", CK_jQ);
CKEDITOR.instances[instance].document.on("blur", CK_jQ);
CKEDITOR.instances[instance].document.on("change", CK_jQ);
});
});
function CK_jQ() {
for (instance in CKEDITOR.instances) {
CKEDITOR.instances[instance].updateElement();
}
}
Что я получил от этого ответа к другому, но аналогичному вопросу.
Другая ошибка, с которой вы столкнулись, - это опечатка minlength
в объекте правил.
Это то, что похоже на работу: http://jsfiddle.net/ryleyb/QcJ57/
Ответ 3
jQuery.validator.setDefaults({
ignore: [],
// with this no hidden fields will be ignored E.g. ckEditor text-area
});
Я заметил, что валидация работала над 2-й подачей. Причина в том, что ckEditor
скрывает фактическую текстовую область и помещает iframe в качестве экземпляра редактора, а при отправке ее подталкивает содержимое в текстовую область. Это означает, что проверка на TextArea
выполняется с использованием устаревших данных. Чтобы исправить эту проблему, я обновляю свой TextArea
при изменении текста экземпляра редактора.
for (instance in CKEDITOR.instances) {
CKEDITOR.instances[instance].on('change', function ()
{
var editorName = $(this)[0].name;
CKEDITOR.instances[editorName].updateElement();
});
}
Ответ 4
Вам нужно поместить кнопку отправки в вашу форму:
<input type="submit"/>
Форма подтверждается только при отправке.
Отметьте пример этой скрипты: http://jsfiddle.net/5RrGa/800/
Ответ 5
Существующие ответы хороши, они предоставляют решения для проверки только на кнопке отправки, здесь есть код для реактивной проверки полей ckeditor, например, проверка правильности jquery по умолчанию. Поместите это в свой ckeditor/config. JS:
CKEDITOR.on('instanceReady', function (e) {
var instance = e.editor;
instance.on("change", function (evt) {
onCKEditorChange(evt.editor);
});
//key event handler is a hack, cause change event doesn't handle interaction with these keys
instance.on('key', function (evt) {
var backSpaceKeyCode = 8;
var deleteKeyCode = 46;
if (evt.data.keyCode == backSpaceKeyCode || evt.data.keyCode == deleteKeyCode) {
//timeout needed cause editor data will update after this event was fired
setTimeout(function() {
onCKEditorChange(evt.editor);
}, 100);
}
});
instance.on('mode', function () {
if (this.mode == 'source') {
var editable = instance.editable();
editable.attachListener(editable, 'input', function (evt) {
onCKEditorChange(instance);
});
}
});
});
function onCKEditorChange(intance) {
intance.updateElement();
triggerElementChangeAndJqueryValidation($(intance.element.$));
}
function triggerElementChangeAndJqueryValidation(element) {
element.trigger('keyup');
}
Бонус. Если вы используете пользовательские кнопки отправки и обработчики для своей формы, теперь вам не нужно явно вызывать CKEDITOR.instances["yourtextarea"].updateElement();
перед отправкой формы через ajax для ваш сервер.
Также не забудьте позвонить:
jQuery.validator.setDefaults({
ignore: []
});
Мой CKeditor: версия: "4.5.4", версия: "d4677a3"
Doc для событий ckeditor: http://docs.ckeditor.com/#!/api/CKEDITOR.editor. Трудно было найти правильный документ на этом сайте.
Ответ 6
мы можем проверить ckeditor, используя проверку jquery, используя следующий фрагмент кода.
<input type="text" name="firstname" id="firstname"/>
<textarea name="editor1" id="editor1" rows="10" cols="80"></textarea>
$("#myForm").validate({
ignore: [],
rules:{
firstname:{
required:true
},
editor1: {
required: function(textarea) {
CKEDITOR.instances[textarea.id].updateElement();
var editorcontent = textarea.value.replace(/<[^>]*>/gi, '');
return editorcontent.length === 0;
}
}
},messages:{
firstname:{
required:"Enter first name"
}
}
});
для получения дополнительной информации о валидации нажмите здесь http://www.dotnetqueries.com/Article/129/validate-ckeditor-using-jquery-form-validation.