плагин проверки jQuery с CKEditor
Я знаю, что этот вопрос был задан раньше, и я прочитал все предыдущие вопросы, и я все еще не могу получить jQuery validator для правильной проверки полей CKEditor.
Моя форма ниже:
<form id="faq-form">
<p>
<label>Title:</label>
<input type="text" id="faq-title" name="faq-title" class="faq-title" />
</p>
<p>
<label for="question">Question:</label>
<textarea name="question" id="question"></textarea>
</p>
<p>
<label for="answer">Answer:</label>
<textarea name="answer" id="answer"></textarea>
</p>
<p>
<input id="submit-faq" name="submit-faq" type="submit" value="Submit" />
</p>
</form>
Обе текстовые области преобразуются в поля CKEditor с помощью:
<script>
CKEDITOR.replace('question', { toolbar : 'forum' });
CKEDITOR.replace('answer', { toolbar : 'forum' });
</script>
Когда я пытаюсь проверить, проверяется только поле заголовка. Я не уверен, что делаю неправильно. Вот мой код javascript для проверки (следующий находится в документе jQuery ready функция).
$('#faq-form').submit(function() {
// Update textareas with ckeditor content
for (var i in CKEDITOR.instances) {
CKEDITOR.instances[i].updateElement();
$.trim($('#' + i).val());
}
// Validate the form
if ( ! $('#faq-form').validate({
rules: {
'faq-title': {
required: true,
minlength: 5
},
answer: {
required: true,
minlength: 20
},
question: {
required: true,
minlength: 20
}
}
}).form()) {
console.log('Form errors');
return false;
}
Как только проверка будет завершена, я буду использовать $.метод post вместо обычной формы get или post, чтобы я мог обновить свою страницу без перезагрузки. Этот $.сообщение приходит после метода проверки, но я не думал, что это нужно показывать.
6 ответов:
Я наконец - то смог заставить его работать. CKEditor скрывает текстовые области при запуске, а средство проверки jQuery игнорирует скрытые элементы. В функции validate это можно изменить. Итак, мой новый код приведен ниже:
if ( ! $('#faq-form').validate({ ignore: "input:hidden:not(input:hidden.required)", rules: { 'faq-title': { required: true, minlength: 5 }, answer: { required: true, minlength: 20 }, question: { required: true, minlength: 20 } }, messages: { 'faq-title': { required: "The title field is required" }, answer: { required: "The answer field is required" }, question: { required: "The question field is required." } }, errorElement: "span", errorPlacement: function (error, element) { error.appendTo(element.prev()); } }).form()) { console.log('Form errors'); return false; }Я также добавил сообщения и изменил элемент и расположение ошибок, когда они отображаются. Я подумал, что это может быть полезно для любого другого, кто наткнется на это.
Ок давайте сократим его, я потратил часы, чтобы получить сообщение об ошибке CKEditor в нужном месте, потому что каждый раз, когда он появляется на вершине CKEditor или сразу после метки, которая не выглядит красиво.
Как CKEditor скрывает textarea и помещает свой тег span сразу после textarea. Пожалуйста, используйте инструмент браузера для проверки элементов dom, тогда вы можете увидеть, что textarea скрыта.
Я только что настроил код, чтобы получить сообщение об ошибке label / span прямо под CKEditor.
$('#messageForm').validate( { ignore: 'input:hidden:not(input:hidden.required)', rules: { msgTitle: { minlength: 2, required: true }, msgText: { minlength: 2, required: true } }, errorElement: "span", // can be 'label' errorPlacement: function (error, element) { if ($(element).attr('id') == 'msgText') { $('#cke_msgText').after(error); } else { element.after(error); } }, highlight: function (element) { $(element).closest('.form-group').removeClass('text-success').addClass('error'); }, success: function (element) { element .closest('.form-group').removeClass('error').addClass('text-success'); } });Здесь 'msgText' - это идентификатор textarea, который скрыт, и cke_msgtext id ckeditor, вы можете найти идентификатор, проверив элемент dom, возможно, ckeditor берет атрибут id textarea и префикс 'cke_' с ним.
Я думаю, что CKEditor не очень хорошо справляется с проверкой, по крайней мере по умолчанию. Вам нужно будет удалить Редакторы перед проверкой (CKEditor работает, скрывая редактируемую вещь, а затем вставляя iframe и вставляя туда редактируемый контент; когда вы удаляете редактор, он выключает iframe и копирует содержимое-по крайней мере, это из памяти). Я думаю, что если вы посмотрите на DOM, то увидите, что содержание текстовых областей не меняется.
Вы можете найдите NicEdit более полезным в этом контексте-смотрите этот поток:
Https://stackoverflow.com/questions/3914510/wysiwyg-editor-without-iframe
Ваш код:
$('#faq-form').submit(function() { // Update textareas with ckeditor content for (var i in CKEDITOR.instances) { CKEDITOR.instances[i].updateElement(); $.trim($('#' + i).val()); } if ( ! $('#faq-form').validate({ rules: { 'faq-title': { required: true, minlength: 5 }, answer: { required: true, minlength: 20 }, question: { required: true, minlength: 20 } } }).form()) { console.log('Form errors'); return false; } ....Вы не должны использовать
.validate()внутри условного. Вот что такое.valid()Метод предназначен для..validate()используется только для инициализации плагинаодин раз на DOM ready с вашими правилами и опциями. После инициализации.valid()можно использовать внутри условных выражений для запуска теста и возврата логического значения.Кроме того, вы не должны иметь
.validate()внутри обработчикаsubmit. Плагин имеет свой собственныйsubmitHandlerобратный вызов функция.Ваш код должен быть изменен на что-то вроде:
$(document).ready(function() { $('#faq-form').validate({ // initialize the plugin // rules & options, rules: { 'faq-title': { required: true, minlength: 5 }, answer: { required: true, minlength: 20 }, question: { required: true, minlength: 20 } }, submitHandler: function (form) { // Update textareas with ckeditor content for (var i in CKEDITOR.instances) { CKEDITOR.instances[i].updateElement(); $.trim($('#' + i).val()); } } }) if ( ! $('#faq-form').valid() ) { // test the form for validity console.log('Form errors'); return false; } });
Лучшее решение, которое я нашел до сих пор, простое и элегантное:
$('#form1').validate({ ignore: [], rules: { corpo : { required: function() { CKEDITOR.instances.corpo.updateElement(); } } } })Шрифт: http://devlog.waltercruz.com/usando-ckeditor-e-jquery-validate-juntos
<form> <textarea class="ckeditor" id="noticeMessage" name="message"></textarea> </form> <script type="text/javascript" src="ckeditor/ckeditor.js"></script> <form> <textarea class="ckeditor" id="noticeMessage" name="message"></textarea> </form> <script type="text/javascript" src="ckeditor/ckeditor.js"></script> <script type="text/javascript"> $("form").submit( function() { var messageLength = CKEDITOR.instances['noticeMessage'].getData().replace(/<[^>]*>/gi, '').length; if( !messageLength ) { alert( 'Please enter a message' ); } } </script> see for full reference ---------------------- http://christierney.com/2012/12/14/ckeditor-4-required-field-validation/
Comments