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

时间:2016-04-03 09:19:58

标签: javascript jquery forms jquery-validate contenteditable

我准备了 DEMO ,证明[contenteditable]元素没有HTML表单。至于我,这是一个问题,因为jQuery验证插件需要形式。从383行开始查看源代码段from here

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]元素添加表单?

2 个答案:

答案 0 :(得分:1)

这是jquery validator plugin中的已知错误。但是,现在已经在pull request中解决了这个问题,应该很快就会发布。

修复1:

如果您不能等待发布,那么修复方法是将此代码放在delegate()方法的开头。该解决方案由@svrx完成。

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

正如您所看到的,修复只是将表单设置为父元素。

修复2:

正如@chrisAtomixcomments中所说,不要使用最新的jquery validator plugin。而是使用尚未添加contenteditable功能的较低版本。他正在使用v1.14.0

答案 1 :(得分:0)

是否正在探索验证解决问题的忽略选项?

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

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