可以在表单级别和/或项目级别应用触发器。 不第二次执行的最佳方式是什么?
<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
触发器。
答案 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);
虽然我不明白为什么你要两次约束事件
编辑:对于跨浏览器(读取: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);
答案 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!
...
};