【问题标题】:dispatchEvent not preforming event, but returns truedispatchEvent 不执行事件,但返回 true
【发布时间】:2011-11-10 19:09:31
【问题描述】:

在 MDC 的网站上,他们有一个 cool demo of dispatchEvent 在我的 Chrome 15 中运行良好。

我正在尝试获取一个事件对象并将其传递给dispatchEvent,并设置了a simple case here,您将在其中将事件记录为数组,然后将重播它们。

本质上,我为点击设置了一个窗口监听器,然后执行window.dispatchEvent(recordedEvent)

我无法确定为什么来自事件侦听器的事件对象不会像 MDC 示例中来自 initMouseEvent 的事件那样执行。

我并不担心让它工作,我想知道为什么这不起作用,reading the funny manual 之后似乎暗示它应该起作用。

【问题讨论】:

    标签: javascript dom-events event-dispatching


    【解决方案1】:

    对我来说似乎效果很好; here 是一个更新。

    edit - 等等 - 你是否担心它返回 true 就像调用了“preventDefault()”一样?如果是这样,那么我现在明白你的困惑了。

    最后编辑好的,我想我明白了。当您发送事件时,您总是从window 发送。相反,如果您 keep track of the elements 参与其中,那么它可以工作。

    这是有效的好代码(在 Firefox 7 中对我来说):

    //Vars for the elements we're working with
    var replay = document.getElementById("replay");
    var replaying = false;
    
    //Handler to record events into a data array.
    var handler = function (e) {
        if (replaying) {
            console.log("replay " + e.type);
        }
        else if (e.target.tagName.toLowerCase() !== 'input') {
            return;
                }
        else {
            handler.data.push({elem: e.target, event: e});
            console.log(handler.data);
        }
    };
    handler.data = [];
    
    //Listen for the click on the replay button   
    replay.addEventListener("click", function(){
        //Remove listeners so we don't create some crazy
        //infinite paradox with turtles all the way down
        // window.removeEventListener("click", handler);
        replaying = true;
    
        //Clear the textbox out
        var status = [], obj;
        //Dispatch a bunch of stored up events
        for (var i=0; i<handler.data.length;i++){
            obj = handler.data[i];
            status.push(obj.elem.dispatchEvent(obj.event));
        }
        console.log(status);
        replaying = false;
    });
    
    //Listen for some specific events
    //window.addEventListener("keyup", handler);
    window.addEventListener("click", handler);
    

    还要注意,最好避免将“点击”事件保存在“重播”按钮本身上。

    【讨论】:

    • 我很高兴我不是唯一一个被它的行为方式所吸引的人。您使用的是哪个浏览器?根据 MDN 示例,我似乎无法获得点击事件来选中/取消选中这些框。
    • 请注意,MDN 示例 (here) 以相反的方式解释状态值!换句话说,它认为true 意味着没有一个处理程序称为“preventDefault()”。
    • 哦,当您分派事件时,您可能应该从目标元素分派事件 - 我会将其添加到我的答案中。
    • 真棒回答人,你让我走上了正确的轨道。它在 FF 中工作,现在我必须弄清楚为什么它在据称支持此功能的浏览器之间不一致。
    猜你喜欢
    • 2019-01-06
    • 2016-02-22
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    相关资源
    最近更新 更多