#javascript #firefox #dom
#javascript #firefox #dom
Вопрос:
Очевидно, я делаю что-то глупое.
processTextNodes: function processTextNodes(node) {
node = node || content.document.body; // base node
var children = node.childNodes, i = 0;
while (node = children[i]) {
if (node.nodeType == 3 amp;amp; node.textContent) { // text node found, replace enclosed text.
if (node.nodeName == "script") continue;
/*node.parentNode.setAttribute("onmouseover", "alert("AAA");");*/
node.parentNode.onmouseover = function(){ alert("AAA") };
node.textContent = aatel.transliterate(node.textContent);
}
if (node.nodeType == 1) {
if (node.title) node.title = aatel.transliterate(node.title);
if (node.alt) node.alt = aatel.transliterate(node.alt);
}
processTextNodes(node);
i ;
}
},
Приведенный выше метод из расширения, которое я пишу. При запуске, как указано выше, я получаю следующее в консоли ошибок
Error: uncaught exception: [Exception... "Component is not available" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: chrome://aatel/content/overlay.js :: processTextNodes :: line 97" data: no]
В случае какой-либо двусмысленности строка 97:
node.parentNode.onmouseover = function(){ alert("AAA")};
Если я закомментирую строку, присваивающую функцию .onmouseover, и раскомментирую строку setAttribute прямо над ней, она работает так, как вы ожидаете. Большое уродливое непрозрачное сообщение об исключении мне не очень помогает. Что я делаю не так? Javascript не является моей сильной стороной.
Ответ №1:
Похоже, вы пытаетесь использовать события в приложении Firefox. Попробуйте использовать addEventListener
для добавления событий:
node.parentNode.addEventListener("mouseover", function () {
alert("AAA");
}, false);
Комментарии:
1. Странно, я могу поклясться, что все примеры, которые я нашел в Интернете, создавали впечатление, что onmouseover — это свойство, которому вы можете присвоить значение. Я думаю, расширения — это своеобразно.
2. Теперь, когда я думаю об этом, я помню, что назначение напрямую через свойство было устаревшим способом добавления обработчиков событий в javascript. Это было бы подвержено коллизиям в расширении, поэтому вполне логично, что они запретили бы это. Спасибо.
Ответ №2:
onmouseover
Установщик делает определенные предположения. Например, предполагается, что вызывающий его скрипт выполняется для объекта Window. Если это не так, он выдаст.
Если ваш приведенный выше скрипт находится в компоненте JS в расширении, он не работает с окном…