Javascript事件处理程序订单

问题描述:

我有一个输入字段,其中绑定了两个事件处理程序。Javascript事件处理程序订单

验证&自动保存

很显然,我想验证我之前保存。如果验证失败,则将“无效”类添加到输入中,自动保存将在它继续之前检查该类。

这工作得不错,但有没有一种方法可以保证在所有情况下自动保存之前验证运行?

如果你使用jQuery来绑定你的事件,它保证了处理器在相同的顺序,他们被束缚解雇。否则,订单是官方未定义的。

如果您不能使用JQuery或类似的框架,你可以很容易地使用自己的自定义甚至绑定,你的通用处理器是保持功能的数组,并按照顺序调用它们的函数模拟此。

为什么不附加一个处理程序 - Validate - 并从里面调用AutoSave

对于您的问题的答案,这也不是一个问题,请参阅this postthis onethis one

+4

因为它们代表单独的模块,它们可能会或可能不会一起发生。将它们写成单个函数(这是显而易见的)具有过度耦合代码的效果。 – 2011-02-28 15:33:02

+2

我不同意。他们*是耦合的,证明你希望只有在另一个运行之后才发生。把它们放在一个函数中不会创建那个耦合。它承认它。 (其次,仅仅因为你叫他们都有些函数内部并不意味着他们必须始终* *以这种方式被调用。他们每个人都能仍然在保持其独立性的方式来写。) – 2016-12-15 22:32:18

+0

我知道这是永远以前,但添加到这一点,你可以重命名验证到ValidateAndAutoSave因为它看起来像验证意味着自动保存自动保存,但可以在没有隐含的关联独立发生,以更好地暗示其用途。 – 2017-03-01 15:05:28

通常情况下,如果一切正常并且可以保存,您将会保存事件处理函数调用Validate(),它将返回true。

function onSaved() { 
    if (!validate()) { 
    // set class 
    return; 
    } 

    // do the save 
} 

已经回答 - 只是为了增加这方面的知识,不能依赖事件处理程序的顺序。它可以在任何给定的实现中是可预测的,但是这可以从一个(Javascript)实现改变到下一个和/或随着时间的推移。唯一可以肯定的是,他们都会被执行 - 但不是以什么顺序。

注意的情况是类似的,当有一个DOM对象的事件处理程序,另一个用于儿童或父母相同的事件 - 这是那些首先执行的并不总是很清楚为好。见http://www.quirksmode.org/js/events_order.html