dispatchEvent не формирует событие, но возвращает true - PullRequest
2 голосов
/ 10 ноября 2011

На сайте MDC у них есть классная демонстрация dispatchEvent , которая прекрасно работает в моем chrome 15.

Я пытаюсь взять объект события и передать его в dispatchEvent, и у меня естьнастройте простой случай здесь , где вы записываете события в виде массива, а затем воспроизводите их.

По сути, я настроил оконный приемник для щелчка, а затем преформировал window.dispatchEvent(recordedEvent).

Я не могу определить, почему мой объект события из прослушивателя событий не будет преобразовываться так же, как событие из initMouseEvent в примере MDC.

Меня не очень беспокоитчтобы это работало, я хочу знать , почему это не работает, когда после чтения забавного руководства кажется, что оно должно.

1 Ответ

3 голосов
/ 10 ноября 2011

Кажется, что это работает очень хорошо для меня; здесь - это обновление.

изменить & mdash; подождите - вы беспокоитесь о том, что он возвращает true, как если бы был вызван "protectDefault ()"? Если так, то теперь я понимаю ваше замешательство.

редактировать окончательно ОК Я думаю, что вижу проблему. Когда вы отправляете событие, вы всегда отправляете с 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);

Также обратите внимание, что не следует сохранять события "click" на самой кнопке "Replay".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...