dispatchEvent不会执行事件,但返回true

时间:2011-11-10 19:09:32

标签: javascript javascript-events event-dispatching

在MDC的网站上,他们有一个cool demo of dispatchEvent可以在我的Chrome 15中正常工作。

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

本质上,我设置了一个窗口监听器进行点击,然后预先形成window.dispatchEvent(recordedEvent)

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

我并不担心让它发挥作用,我想知道为什么这不起作用,当reading the funny manual之后似乎意味着它应该发挥作用。

1 个答案:

答案 0 :(得分:3)

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

编辑 - 等待 - 您是否关注它正在返回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);

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