【发布时间】:2011-08-31 13:27:44
【问题描述】:
如果change 侦听器附加到项目,则可以使用item.onchange() 调用它。但是,如果更改触发器来自父节点怎么办?
上下文:使用 input 事件来捕获 INPUT type='number' 项目的向上/向下变化,因为 change不捕获它们。
操作原理:使用input进行捕获,但在调用普通change侦听器之前等待500毫秒。当change 侦听器直接附加到目标元素时很容易。这个问题也需要调用 inherited 更改触发器 - 我如何知道是否存在,以及如何调用它们?
HTML:
<form id='f'>
<input type='number' id='i' />
</form>
Javascript:
// attach main onchange trigger to form
document.getElementById('f').addEventListener('change',changeFunc,true);
// if user "scrolls" number value, do same as change trigger after 500 ms
var inputCt = 0;
function inputToChange(e) {
inputCt++;
setTimeout( next, 500 );
function next() {
inputCt--;
if( !inputCt ) {
// if element has it's own change trigger, call it
if( e.target.onchange ) e.target.onchange(e);
// PROBLEM - how to call inherited change triggers
}
}
}
document.getElementById('f').addEventListener('input',inputChange,true);
我看到的唯一方法是手动检查祖先,检查存在并在我去的时候调用。但这导致了下一个问题:这些侦听器函数中的任何一个都可能以e.stopPropagation 发出,但我现在看到了确定是否确实如此的方法——这意味着攀登祖先将不起作用。
根据@Andy E 对How can I trigger an onchange event manually? 的回答,解决方案如下:
Javascript:
// attach main onchange trigger to form
document.getElementById('f').addEventListener('change',changeFunc,false);
// if user "scrolls" number value, do same as change trigger after 500 ms
var inputCt = 0;
function inputToChange(e) {
inputCt++;
setTimeout( next, 500 );
function next() {
inputCt--;
if( inputCt ) return;
var change = var change = document.createEvent("Event");
change.initEvent('change',true,true);
e.target.dispatchEvent(change);
}
}
document.getElementById('f').addEventListener('input',inputChange,false);
注意 1:useCapture(第三个)arg 到 addEventListener 是错误的 - 需要为 false,因此在表单触发器之前调用项目触发器。
注意 2:这个函数可能更适合“点击”而不是“输入”——“点击”的问题是需要将焦点和文本定位点击与点击更改值区分开来。
【问题讨论】:
-
"我怎么知道是否有退出"你的意思是退出还是存在?在这种情况下完全不同。
-
@Mark Schultheiss - “存在” - 谢谢
-
您正在处理事件。您不需要在祖先上“调用”事件,他们应该有事件处理程序来“处理”事件,尽管您可能会考虑“触发”这些事件 - 该事件的作者出于某种原因存在 stopPropagation,因此我会预见到适合父元素处理的“新”事件的触发器,尽管在这里我更愿意看到事件气泡并重构事件传播。
-
@Mark Schultheiss - 我想我们有点绕圈子了。你知道如何为我们创建一个聊天 - 也就是说,如果你愿意花时间吗?
标签: javascript html input dom-events