我创建了这个简短的代码段来测试是否可以在javascript事件中触发default
处理程序。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script></script>
document.addEventListener('mousedown', function (e){
console.log('mousedown', e);
if (e.target === document.getElementById('target')) {
if (!e.__redispatched) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
var ne = new MouseEvent('mousedown', e);
ne.__redispatched = true;
setTimeout(function (){
e.target.focus();
e.target.dispatchEvent(ne);
}, 1000);
}
}
}, true);
</head>
<body>
<input type="text" id="target"/>
<input type="text"/>
</body>
</html>
我希望target
输入会接收事件并正常处理它,从而将插入符号移动到正确的位置(就像mousedown
上的正常位置一样)。但没有任何反应。
我的问题:
我在使用dispatchEvent
做错了什么或浏览器在处理合成事件时是否忽略默认处理程序?那有什么材料/证明吗?
感谢。
答案 0 :(得分:4)
不幸的是,浏览器会忽略不受信任的事件的默认事件处理程序。
请参阅3.4 Trusted events in the W3C UI Events Specification
由用户代理生成的事件 用户交互,或者作为DOM更改的直接结果 由用户代理信任,具有未提供的权限 脚本通过的事件生成的事件 DocumentEvent.createEvent(&#34; Event&#34;)方法,使用修改 Event.initEvent()方法,或通过 EventTarget.dispatchEvent()方法。受信任的isTrusted属性 events的值为true,而不受信任的事件的值为isTrusted 属性值为false。
大多数不受信任的事件都不应该触发默认操作 click事件的例外。此事件始终触发默认值 action,即使isTrusted属性为false(此行为为 保留以实现向后兼容性)。所有其他不受信任的事件必须 表现就好像已经调用了Event.preventDefault()方法一样 事件