Перемещение обработчиков событий в функцию javascript

Что мне в основном нужно сделать, это прикрепить строки этого кода к этому файлу. http://mxr.mozilla.org/mozilla-central/source/mobile/android/chrome/content/aboutDownloads.js

window.addEventListener("DOMContentLoaded", function() {handle_events();}, true);
window.addEventListener("unload", function() {Downloads.uninit();}, false);

function handle_events(){
    window.addEventListener("DOMContentLoaded", function() {Downloads.init();}, true);
    document.getElementById("contextmenu-open").addEventListener("click", ContextMenus.open, false);
    document.getElementById("contextmenu-retry").addEventListener("click", ContextMenus.retry, false);
    document.getElementById("contextmenu-remove").addEventListener("click", ContextMenus.remove, false);
    document.getElementById("contextmenu-pause").addEventListener("click", ContextMenus.pause, false);
    document.getElementById("contextmenu-resume").addEventListener("click", ContextMenus.resume, false);
    document.getElementById("contextmenu-cancel").addEventListener("click", ContextMenus.cancel, false);
    document.getElementById("contextmenu-removeall").addEventListener("click", ContextMenus.removeAll, false);
    }

Но когда я это делаю, я получаю сообщение об ошибке JavaScript

JavaScript Error: "TypeError: aElement is undefined" {file: "chrome://browser/content/aboutDownloads.js" line: 435}

Многократно. Как я могу это исправить?. Это часть кода от Firefox для проекта Android.

1 ответ

Решение

Оберните вызовы вашего метода в анонимную функцию следующим образом:

document.getElementById("contextmenu-open").addEventListener("click", ContextMenus.open, false);

к этому:

document.getElementById("contextmenu-open").addEventListener("click", function() {ContextMenus.open()}, false);

Это сохраняет ContextMenus объект в качестве вызывающего метода и убедитесь, что this устанавливается правильно при вызове метода.


Кроме того, я не думаю, что вы хотите установить DOMContentLoaded обработчик события в handle_events ()becauseDOMContentLoadedhas already fired at that point since you're callinghandle_events ()from aDOMContentLoaded` обработчик событий.

За Downloads.init()позвоните прямо в первую строку handle_events(), DOM уже загружен, так что вы можете просто позвонить, вам не нужно ждать события.

Другие вопросы по тегам