我准备了 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]
元素添加表单?
答案 0 :(得分:1)
这是jquery validator plugin
中的已知错误。但是,现在已经在pull request中解决了这个问题,应该很快就会发布。
如果您不能等待发布,那么修复方法是将此代码放在delegate()
方法的开头。该解决方案由@svrx
完成。
// Set form expando on contenteditable
if ( !this.form && this.hasAttribute( "contenteditable" ) ) {
this.form = $( this ).closest( "form" )[ 0 ];
}
正如您所看到的,修复只是将表单设置为父元素。
正如@chrisAtomix
在comments中所说,不要使用最新的jquery validator plugin
。而是使用尚未添加contenteditable
功能的较低版本。他正在使用v1.14.0
。
答案 1 :(得分:0)