Может установить атрибут mouseover html с помощью javascript, но не может назначить функцию свойству mouseover в Firefox

#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 в расширении, он не работает с окном…