[contenteditable]元素和jQuery验证插件的问题

Problems with [contenteditable] elements and jQuery validation plugin

本文关键字:验证 插件 问题 jQuery contenteditable 元素      更新时间:2023-11-17

我准备了一个DEMO,它演示了[contenteditable]元素没有HTML表单。对我来说,这是一个问题,因为jQuery验证插件需要表单。看看从383行开始的源代码片段:

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 );

在这里我们可以看到,个元素,其中一个是[contenteditable]侦听事件,然后调用delegate事件处理程序。

[contenteditable]触发该列表中的某个事件时,delegate方法尝试从元素var validator = $.data( this.form, "validator" )获取验证器,但正如我前面所说,[contenteditable]没有形式(请参见DEMO)。

有什么办法解决这个问题吗?是否可以为所有[contenteditable]元素添加表单?

这是jquery validator plugin中的一个已知错误。然而,这已经在这个拉取请求中得到了修复,应该很快就会发布。

修复1:

如果您不能等待发布,则修复方法是将此代码放在delegate()方法的开头。用CCD_ 11进行了求解。

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

正如您所看到的,修复方法只是将窗体设置为父元素。

修复2:

正如@chrisAtomix在评论中所说,不要使用最新的jquery validator plugin。相反,使用未添加contenteditable功能的较低版本。他正在使用v1.14.0

探索验证的忽略选项能解决问题吗?

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

更新的小提琴-https://jsfiddle.net/z6eLvk0b/2/