我正在使用 Peter Higgins 的 pub/sub jQuery 插件。我遇到了 JavaScript 验证问题。
这就是问题的关键...
$.subscribe('/make', function(form_id, fields, path, type) {
for (var i=0; i < fields.length; i++) {
$.publish('/validation/field', [ path+'check_field', $('*[name="'+fields[i]+'"]'), fields ]);
}
if ($('#'+form_id+' .error').length > 0) {
alert('There are errors, please fix the errors before continuing.');
return;
}
/validation/field 会将错误附加到表单字段。当您第一次运行它时出现错误,但一切都运行得如此之快,将发送一个 ajax 请求以保存表单。第二次运行该表单时,该函数会正确停止,因为已对错误类别进行计数。
有解决办法吗?
最佳答案
如果验证是异步的
...处理此问题的通常方法是使用回调。在这种情况下,您将寻找由验证定义的回调,它会告诉您验证何时完成,此时您可以使用您的代码来计算产生的错误。
如果验证是同步
以上假定验证涉及某种异步事件。它看起来不像that pub/sub plugin提供任何异步性,因此这取决于您的 /validation/field
订阅者所做的事情。如果它执行 ajax 调用或 setTimeout
或类似的调用,那么您将需要一个回调。
如果 /validation/field
订阅者同步 进行验证,那么我很惊讶您遇到了字段没有被正确计数的问题。但如果你是,你可能可以通过给浏览器一点喘息时间来解决它:
$.subscribe('/make', function(form_id, fields, path, type) {
for (var i=0; i < fields.length; i++) {
$.publish('/validation/field', [ path+'check_field', $('*[name="'+fields[i]+'"]'), fields ]);
}
// Check results *after* giving the browser a moment to breathe:
setTimeout(function() {
if ($('#'+form_id+' .error').length > 0) {
alert('There are errors, please fix the errors before continuing.');
return;
}
// (...your code left off here, but I'm guessing the rest of the
// function would also need to be within this new anonymous function...)
}, 0);
}
setTimeout
的 0
参数表示“在零毫秒后给我回电话”,但实际上没有浏览器会这样做——通常是在 4-10 毫秒后.重点是它将是异步的,在浏览器有机会 catch 并重新调用 JavaScript 层之后。
不过要小心,确保进行验证的事情是同步进行的。如果不是,如果它正在执行任何异步操作,那么上面的代码会在您的代码中引入竞争条件,有时它似乎可以工作,而其他时候则不会工作。比赛条件会咬你,所以仔细检查。 :-)
关于JavaScript 执行得太快而无法捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4286025/