2

在 MDC 的网站上,他们有一个很酷的 dispatchEvent 演示,在我的 Chrome 15 中运行良好。

我正在尝试获取一个事件对象并将其传递给dispatchEvent,并在此处设置了一个简单的案例,您将事件记录为一个数组,然后将重播它们。

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

我无法确定为什么来自事件侦听器的事件对象不会initMouseEvent以与 MDC 示例中的事件相同的方式执行。

我并不真的担心让它工作,我想知道为什么这不起作用,在阅读有趣的手册后似乎暗示它应该。

4

1 回答 1

3

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

编辑-等待-您是否担心它返回的事实true就像调用了“preventDefault()”一样?如果是这样,那么我现在理解你的困惑。

编辑终于确定了,我想我看到了这个问题。当你调度事件时,你总是从window. 相反,如果您跟踪所涉及的元素,那么它就可以工作。

这是有效的代码(在 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);

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

于 2011-11-10T19:26:43.083 回答