我的单元格上有不同的验证器。当一个单元格正在验证时,我需要重新验证其组中的其他单元格。验证会导致模糊'事件所以我必须触发'模糊'组中所有单元格的事件:
element.attr('validated', true);
var validityGroup = getValidityGroupElements();
validityGroup.each(function() {
$(this).blur();
});
element.attr('validated', false);
此处element
是当前单元格,函数getValidityGroupElements()
为我提供了当前组whith validated="false"
属性的元素数组。我设置此属性是为了避免无限循环,因为每个单元格将验证其中的所有单元格等等。但问题是:如何等待在.each
循环中运行的所有回调,并且仅在此之后将当前元素的验证属性设置为false
?
答案 0 :(得分:1)
您正在滥用blur
事件来触发导致问题的验证:在您的浏览器中,"发送blur
事件"是同步的(所以事件是立即发送的)但是处理程序当时没有被执行。浏览器只是在堆栈上推送一个事件,然后最终开始执行它们。由于JS不支持并行执行,因此第一个blur
事件将在上述代码之后执行 - 即在validated
重置为false
之后执行。
更好的设计是将验证功能附加到元素:
e.data('validate', function(){...});
在blur()
和其他任何地方,您现在可以编写:e.data('validate')();
来调用验证函数(双括号不是拼写错误 - e.data('validate')
返回一个函数)。
这将允许您以明确定义的顺序进行验证并同步,无任何事件或validated
黑客。