JQuery Проверка с помощью ошибки Summernote Editor: невозможно прочитать свойство "replace" из undefined
Я использую MVC5 для создания формы с редактором summernote.
Код бритвы:
<div class="form-group">
@Html.LabelFor(model => model.Content, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.Content, new { htmlAttributes = new { @class = "form-control post-content"} })
@Html.ValidationMessageFor(model => model.Content, "", new { @class = "text-danger" })
</div>
JS:
$('#blog-form .post-content').summernote({
height: 400,
minHeight: 300,
codemirror: {
theme: 'default'
}
});
С приведенной выше настройкой редактор редактора отлично отображает. Однако, как только я удаляюсь от редактора, то есть onBlur, я получаю следующую ошибку в консоли:
Uncaught TypeError: Cannot read property 'replace' of undefined
at $.validator.escapeCssMeta (jquery.validate.js:1014)
at $.validator.errorsFor (jquery.validate.js:995)
at $.validator.prepareElement (jquery.validate.js:679)
at $.validator.element (jquery.validate.js:466)
at $.validator.onfocusout (jquery.validate.js:289)
at HTMLDivElement.delegate (jquery.validate.js:411)
at HTMLFormElement.dispatch (jquery-2.2.3.js:4737)
at HTMLFormElement.elemData.handle (jquery-2.2.3.js:4549)
at Object.trigger (jquery-2.2.3.js:7819)
at Object.simulate (jquery-2.2.3.js:7890)
Вот рендерная часть DOM:
<div class="form-group">
<label class="control-label" for="Content">Content</label>
<textarea class="form-control post-content text-box multi-line" id="Content" name="Content" style="display: none;"></textarea>
<div class="note-editor note-frame panel panel-default">
...summernote generated...
</div>
<span class="field-validation-valid text-danger" data-valmsg-for="Content" data-valmsg-replace="true"></span>
</div>
версия jQuery: 2.2.3
jQuery Проверить версию: 1.16.0
Microsoft.jQuery.Unobtrusive.Validation version: 3.2.3
Я провел некоторое исследование и уже знаю, что это не связано с плагином summernote. Я попытался запустить следующий код внутри и снаружи документа, но он не работал:
$.validator.setDefaults({
ignore: ":hidden:not(.post-content)"
});
Любые идеи?
Ответы
Ответ 1
Я использую этот script, чтобы заставить валидатор игнорировать элементы Summernote. Он может быть изменен, чтобы игнорировать элементы, созданные другими редакторами HTML.
$('form').each(function () {
if ($(this).data('validator'))
$(this).data('validator').settings.ignore = ".note-editor *";
});
Ответ 2
Вы можете устранить ошибку выше, немного изменив свой код.
var v = $('#myForm').validate({
// exclude it from validation
ignore: ":hidden:not(#summernote),.note-editable.panel-body"
});
var myElement = $('#summernote');
myElement.summernote({
// See: http://summernote.org/deep-dive/
callbacks: {
onChange: function(contents, $editable) {
// Note that at this point, the value of the `textarea` is not the same as the one
// you entered into the summernote editor, so you have to set it yourself to make
// the validation consistent and in sync with the value.
myElement.val(myElement.summernote('isEmpty') ? "" : contents);
// You should re-validate your element after change, because the plugin will have
// no way to know that the value of your `textarea` has been changed if the change
// was done programmatically.
v.element(myElement);
}
}
});
Источник (официальный): https://github.com/jquery-validation/jquery-validation/issues/1875#issuecomment-272667183
Ответ 3
У меня возникла та же проблема с Quill (текстовым редактором), и я решил ее следующим образом:
<div id="quillEditor"></div>
var editorForm = $('.rich-text-editor').closest('form');
if (editorForm.data('validator')) {
// tell jQuery Validate to ignore all child elements of quill
editorForm.data('validator').settings.ignore = ".ql-container *";
}
Ответ 4
Если вы когда-либо сталкивались с этой проблемой с помощью quill (текстового редактора) при проверке форм с помощью валидатора jQuery, просто выполните следующее:
$('#id-of-form-to-validate').validate({
ignore: ".ql-container *"
// continue validation
});
Где "# id-of-form-to-validate" может быть просто элементом id, class или form.
Ответ 5
Я нашел этот поток во время тестирования jQuery TE, и появилась та же ошибка валидатора, которую можно исправить аналогичным решением.
$('#id-of-form-to-validate').validate({
ignore: ".jqte *"
// continue with validation
});
Ответ 6
Я попробовал вышеупомянутые ответы, но не работал в моем случае. Этот работает для меня:
jQuery.validator.setDefaults({ ignore: ":hidden:not(#summernote),.note-editable.panel-body"});
Ответ 7
Самый чистый подход без использования жестко идентифицированных идентификаторов - это обсуждение с помощью JQuery.Validate github:
jQuery.validator.setDefaults({
// This will ignore all hidden elements alongside 'contenteditable' elements
// that have no 'name' attribute
ignore: ":hidden, [contenteditable='true']:not([name])"
});
Souce: https://github.com/jquery-validation/jquery-validation/issues/1875