我正在使用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 /字段会将错误附加到表单字段。当您第一次出现错误但是一切都运行得如此之快时,会发送一个ajax请求来保存表单。第二次运行表单时,由于计算了错误类,函数正确停止。
有解决方法吗?
答案 0 :(得分:1)
...你通常采用的方法是使用回调。在这种情况下,您将寻找由验证定义的回调,该回调告诉您验证何时完成,此时您可以使用您的代码来计算产生的错误。
以上假设验证涉及某种异步活动。它看起来不像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);
}
0
setTimeout
参数意味着“在零毫秒内回复”,但实际上没有浏览器会这样做 - 通常是4-10毫秒之后。重点是,在浏览器有机会赶上并重新调用JavaScript层之后, 将是异步的。
小心但,请确定表明正在进行验证的事情是同步进行的。如果不是,如果它正在执行任何异步操作,那么上面会在您的代码中引入竞争条件,有时它似乎有效,有时则不起作用。比赛条件会咬你,所以仔细检查。 : - )
答案 1 :(得分:1)
订阅使用ajax来调用服务器吗?
如果那么那就是你的问题,因为ajax是异端的。
订阅方法然后在发送调用后立即退出,并在ajax响应上调用该函数。
这意味着订阅之后的任何代码都可能在ajax请求完成之前被调用,并且还没有任何错误。
然后,您需要将订阅调用中的任何代码移动到回调方法中,以确保在ajax调用之后调用它。
要阻止任何其他操作,您可以设置globalvariable,例如。 validating = true,并有任何其他代码检查。