使用dispatchEvent聚焦事件

时间:2011-07-05 04:03:22

标签: javascript events javascript-events focus setfocus

当我在输入框中触发focus dispatchEvent事件时,会调用其onfocus,但在UI上输入框不会聚焦。 这种行为有什么理由吗?

var test = document.getElementById("test");
test.onfocus = function(event) {
  console.log('focused');
}
var e = document.createEvent('Event');
e.initEvent("focus", true, true);
test.dispatchEvent(e);

另一方面,这可以按预期工作。

var test = document.getElementById("test");
test.focus();

我正在研究这个问题的原因是我使用ZeptoJS触发事件并使用dispatchEvent

1 个答案:

答案 0 :(得分:3)

触发事件的元素不一定要监听该事件,因为父元素可能也在监听该事件。

请注意,手动触发事件不会生成与该事件关联的默认操作。例如,手动触发focus事件不会导致元素获得焦点(您必须使用其focus()方法),手动触发submit事件不会提交表单(使用submit()方法),手动触发键事件不会导致该字母出现在焦点文本输入中,并且手动触发链接上的单击事件不会导致链接被激活等。在UI事件的情况下,出于安全原因这很重要,因为它可以防止脚本模拟与浏览器本身交互的用户操作。

另请注意,如果您正在使用IE,则应使用fireEvent()。此外,dispatchEventfireEvent方法之间的主要区别在于dispatchEvent方法调用事件的默认操作,而fireEvent方法则不会。

所以对于解决方案,请尝试这个

test.onfocus = function(event) {
  console.log('focused');
  if( ! test.hasFocus() ) {
    test.focus();
  }
}