Почему мой dispatchEvent работает для событий мыши, а не для ключевых событий - PullRequest
1 голос
/ 10 марта 2011

Я думаю о том, чтобы сделать собственное дополнение для Firefox и провести несколько экспериментов с функциональностью, которую я мог бы добавить в него.

Пока я просто проверяю осуществимость, я только что получил скелет, созданный из компоновщика дополнений Mozilla, и начал работать над ним. Сейчас я пытаюсь отправить события щелчка мышью или нажатия клавиши.

Я перепробовал доступные способы отправки события, но почему-то он не работает для ключевых событий

Я попробовал это с помощью dispatchEvent:

onMenuItemCommand: function(e) {  

    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');


    var evt1 = document.createEvent("MouseEvents");
    evt1.initMouseEvent("click", true, true, window,
        0, 0, 0, 0, 0, false, false, false, false, 0, null);

    //it's returning me null for document.getElementById... so I changed it.
    var cb1 =  gBrowser.selectedBrowser.contentDocument.getElementById("strict");
    var canceled1 = !cb1.dispatchEvent(evt1);


    var evt = document.createEvent("KeyEvents");
    evt.initKeyEvent("keydown", true, false, window,
                 false, false, false, false, 0x42, 0);
    var cb =  gBrowser.selectedBrowser.contentDocument.getElementById("filter"); 
    var canceled = !cb.dispatchEvent(evt);
    if(canceled) 
    {
        // A handler called preventDefault
        alert("canceled");
    } 
    else 
    {
        // None of the handlers called preventDefault
        alert("not canceled");
    }       
}   

Когда я попробовал этот код в Firefox, он обновил флажок, который означает, что событие нажатия работало, но ничего не произошло в текстовом поле, где я ожидал, что он напечатает символ. Но он показал окно с предупреждением «не отменено», доказывающее, что событие не было отменено!

Поскольку событие не было отменено, я решил добавить обработчик нажатой клавиши в window.document ... и он вызывался, когда дополнение отправляло эти события! Это означает, что события генерируются, а также кипят.

Тогда почему работают только события мыши, а ключевые события - нет? Я что-то здесь упускаю?

(Я также пробовал sendKeyEvent с nsIDOMWindowUtils. Мне все еще не повезло.)

Кстати, я использую Firefox 3.6.15 с Gecko: 1.9.2.15

1 Ответ

0 голосов
/ 12 марта 2011

Вы должны сфокусировать элемент, прежде чем отправите ему ключевое событие.

РЕДАКТИРОВАТЬ:

Это верно только для веб-страниц.Расширения могут отправлять события нажатия клавиш в любое текстовое поле.

РЕДАКТИРОВАТЬ:

Ввод текста осуществляется с помощью событий нажатия клавиш, а не событий нажатия клавиш.

РЕДАКТИРОВАНИЕ:

Вы не вставите никаких символов, если не предоставите код символа.(Извините за упущение этого, это должно было быть очевидно.) Также, хотя это, кажется, работает с вашим окном, вы должны передать в contentWindow браузера как defaultView.

...