当我在输入框中触发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
。
答案 0 :(得分:3)
触发事件的元素不一定要监听该事件,因为父元素可能也在监听该事件。
请注意,手动触发事件不会生成与该事件关联的默认操作。例如,手动触发focus
事件不会导致元素获得焦点(您必须使用其focus()
方法),手动触发submit
事件不会提交表单(使用submit()
方法),手动触发键事件不会导致该字母出现在焦点文本输入中,并且手动触发链接上的单击事件不会导致链接被激活等。在UI事件的情况下,出于安全原因这很重要,因为它可以防止脚本模拟与浏览器本身交互的用户操作。
另请注意,如果您正在使用IE,则应使用fireEvent()
。此外,dispatchEvent
和fireEvent
方法之间的主要区别在于dispatchEvent
方法调用事件的默认操作,而fireEvent
方法则不会。
所以对于解决方案,请尝试这个
test.onfocus = function(event) {
console.log('focused');
if( ! test.hasFocus() ) {
test.focus();
}
}