【问题标题】:Does dispatchEvent trigger `default` handler?dispatchEvent 是否触发“默认”处理程序?
【发布时间】:2016-06-02 06:04:37
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: javascript dom javascript-events


    【解决方案1】:

    不幸的是,浏览器确实会忽略 不可信 事件的默认事件处理程序。

    3.4 Trusted events in the W3C UI Events Specification

    由用户代理生成的事件,或者是由于 用户交互,或作为 DOM 更改的直接结果,是 受用户代理信任,具有不被授予的权限 通过脚本生成的事件 DocumentEvent.createEvent("Event") 方法,使用 Event.initEvent() 方法,或通过 EventTarget.dispatchEvent() 方法。可信的 isTrusted 属性 events 的值为 true,而不受信任的事件的值为 isTrusted 属性值为false。

    大多数不受信任的事件不应触发默认操作, 点击事件除外。这个事件总是触发默认的 操作,即使 isTrusted 属性为假(此行为是 为向后兼容而保留)。所有其他不受信任的事件必须 表现得好像 Event.preventDefault() 方法已被调用 事件。

    【讨论】:

    • 谢谢。这似乎就是答案。
    • 他们为什么这样做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2011-12-12
    • 1970-01-01
    • 2011-08-12
    • 2016-09-02
    相关资源
    最近更新 更多