2

MDCのサイトには、 Chrome15で正常に機能するdispatchEventのクールなデモがあります。

イベントオブジェクトを取得してに渡そうとしています。ここでは、イベントを配列として記録してから再生する簡単なケースdispatchEventを設定しました。

基本的に、クリック用のウィンドウリスナーを設定してから、を実行しますwindow.dispatchEvent(recordedEvent)

イベントリスナーからのイベントオブジェクトがinitMouseEvent、MDCの例のイベントと同じように実行されない理由を特定できません。

私はそれを機能させることについてはあまり心配していません。なぜこれが機能しないのか知りたいのですが、面白いマニュアルを読んだ後、それが必要であると示唆しているようです。

4

1 に答える 1

3

それは私にはうまく機能しているようです。ここに更新があります。

編集true—待機— 「preventDefault()」が呼び出されたかのように返されるという事実について懸念がありますか?もしそうなら、私はあなたの混乱を今理解しています。

最後に編集OK問題が発生したと思います。イベントをディスパッチするときは、常にからディスパッチし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 に答える