dispatchEvent是否会触发`default`处理程序?

时间:2016-02-20 16:46:23

标签: javascript dom javascript-events

我创建了这个简短的代码段来测试是否可以在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做错了什么或浏览器在处理合成事件时是否忽略默认处理程序?那有什么材料/证明吗?

感谢。

1 个答案:

答案 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()方法一样   事件