防止同一触发器功能执行两次的最佳方法是什么?

时间:2011-08-26 06:51:50

标签: javascript javascript-events triggers

可以在表单级别和/或项目级别应用触发器。 第二次执行的最佳方式是什么?

<form id='f'>
  <input id='i' type='text' />
</form>

<script>
validate = function(e) { ... }
reformat = function(e) { ... }
document.getElementById('f').addListener('change',validate,true);
document.getElementById('i').addListener('change',validate,true);
document.getElementById('i').addListener('change',reformat,true);
</script>

上下文:数据字典表示项目i需要立即验证,并且应用程序编写者应该立即验证表单中的所有项目。

它是相同的功能,通常称为一次,但有时两次。

保持validate函数不执行两次的最佳方法是什么?

注意:e.stopPropagation()停止所有click事件的进一步调用,以便不再调用reformat触发器。

2 个答案:

答案 0 :(得分:2)

您可以在事件参数中添加道具以确保它运行一次:

validate = function(e) { if (e.done) return; /* code */ e.done = true; }
document.getElementById('f').addListener('change',validate,true);
document.getElementById('i').addListener('change',validate,true);

DEMO

虽然我不明白为什么你要两次约束事件

编辑:对于跨浏览器(读取:IE),将其更改为:

validate = function(e) {
    if ((e = e || window.event).done) return;
    /* code */ 
    e.done = true;
}
document.getElementById('f').addListener('change',validate,true);
document.getElementById('i').addListener('change',validate,true);

Edited DEMO

答案 1 :(得分:1)

基本理念(基于http://www.quirksmode.org/js/events_order.html):

function cancelBubbling(e) {
    if (!e) var e = window.event;

    e.cancelBubble = true;

    if (e.stopPropagation) e.stopPropagation();
}

var validate = function(e) {
    cancelBubbling(e); // important!

    ...
};