Problems with [contenteditable] elements and jQuery validation plugin

纵然是瞬间 提交于 2019-12-13 19:07:22

问题


I prepared a DEMO which demonstrates [contenteditable] element has no HTML form. As for me, it's a problem, because jQuery validation plugin need form. Look at the source code snippet from here starting from 383 line:

function delegate( event ) {
    var validator = $.data( this.form, "validator" ),
        eventType = "on" + event.type.replace( /^validate/, "" ),
        settings = validator.settings;
    if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
        settings[ eventType ].call( validator, this, event );
    }
}

$( this.currentForm )
    .on( "focusin.validate focusout.validate keyup.validate",
        ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
        "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
        "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
        "[type='radio'], [type='checkbox'], [contenteditable]", delegate )

    // Support: Chrome, oldIE
    // "select" is provided as event.target when clicking a option
    .on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );

Here we can see, elements, one of which is a [contenteditable] listen to events and then call delegate event handler.

When [contenteditable] trigger some event from this list, delegate method try to get validator from element var validator = $.data( this.form, "validator" ) but as I said earlier [contenteditable] has no form (see DEMO).

Is there any way to solve this problem? May be it's possible to add form to all [contenteditable] elements?


回答1:


This is a known bug in jquery validator plugin. However, this has been fixed now in this pull request, and should be released soon.

Fix 1:

If you cannot wait for a release, the fix is to put this code at the start of delegate() method. The solution has been made by @svrx.

// Set form expando on contenteditable
if ( !this.form && this.hasAttribute( "contenteditable" ) ) {
    this.form = $( this ).closest( "form" )[ 0 ];
}

As you can see the fix is simply to set the form to the parent element.

Fix 2:

As @chrisAtomix said in his comments, don't use the latest jquery validator plugin. Instead use a lower version where contenteditable feature has not been added. He is using v1.14.0.




回答2:


does exploring the ignore option of validate solve your problem?

ignore: ":hidden:not('#summernote')"

Updated fiddle - https://jsfiddle.net/z6eLvk0b/2/



来源:https://stackoverflow.com/questions/36383647/problems-with-contenteditable-elements-and-jquery-validation-plugin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!