[contenteditable] 元素和 jQuery 验证插件的问题
Problems with [contenteditable] elements and jQuery validation plugin
我准备了一个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从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]
个元素添加表单?
探索验证的忽略选项是否解决了您的问题?
ignore: ":hidden:not('#summernote')"
已更新 fiddle - https://jsfiddle.net/z6eLvk0b/2/
这是 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:
正如@chrisAtomix
在他的comments中所说,不要使用最新的jquery validator plugin
。而是使用未添加 contenteditable
功能的较低版本。他正在使用 v1.14.0
.
我准备了一个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从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]
个元素添加表单?
探索验证的忽略选项是否解决了您的问题?
ignore: ":hidden:not('#summernote')"
已更新 fiddle - https://jsfiddle.net/z6eLvk0b/2/
这是 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:
正如@chrisAtomix
在他的comments中所说,不要使用最新的jquery validator plugin
。而是使用未添加 contenteditable
功能的较低版本。他正在使用 v1.14.0
.