Код для поиска элемента с правильным событием - PullRequest
0 голосов
/ 21 марта 2011

У меня есть некоторый код для firefox, который запускается, чтобы проверить, существует ли элемент на странице с определенным обработчиком событий, в этом случае onclick. С тех пор, как вышел FF4, я получал NS_ERROR_NOT_AVAILABLE, и я предполагаю, что это связано с XPCNativeWrapper вокруг элементов. Вот код, который я использую:

<code>
var elem = null;
var elems = doc.getElementsByTagName('td');
var firefoxWindow = window;
for (a = 0; a < elems.length; a++) {
    if (((elems[a] != null && elems[a].hasAttributes() == true && elems[a].getAttribute('onclick') != null && elems[a].getAttribute('onclick').toString().match(/Goodbye Wonderful/gim) != null && elems[a].getAttribute('onclick').toString().match(/Goodbye Wonderful/gim).length >= 0) || (elems[a] != null && elems[a].onclick != null && elems[a].onclick.toString().match(/Goodbye Wonderful/gim) != null && elems[a].onclick.toString().match(/Goodbye Wonderful/gim).length >= 0))) elem = elems[a];
}
var found = false;
var window = null;
for (var i = 0; i < firefoxWindow.frames.length; i++) {
    if (firefoxWindow.frames[i].toString().toLowerCase().indexOf('object window') > -1) {
        window = firefoxWindow.frames[i];
        break;
    }
}</p>

<p>function recursiveSearch(frames) {
    for (var i = 0; i < frames.length; i++) {
        var elems = frames[i].document.getElementsByTagName('td');
        for (a = 0; a < elems.length; a++) {
            if (((elems[a] != null && elems[a].hasAttributes() == true && elems[a].getAttribute('onclick') != null && elems[a].getAttribute('onclick').toString().match(/Goodbye Wonderful/gim) != null && elems[a].getAttribute('onclick').toString().match(/Goodbye Wonderful/gim).length >= 0) || (elems[a] != null && elems[a].onclick != null && elems[a].onclick.toString().match(/Goodbye Wonderful/gim) != null && elems[a].onclick.toString().match(/Goodbye Wonderful/gim).length >= 0))) elem = elems[a];
        }
        if (elem) {
            found = true;
            return;
        } else {
            if (frames[i].frames.length > 0) {
                recursiveSearch(frames[i].frames);
            }
        }
    }
}
if (!elem && window.frames.length > 0) {
    recursiveSearch(window.frames);
}
if (elem != null) {
    print('##Result##' + elem.tagName);
} else {
    print('failed');

Я прошу прощения за длинную строку посередине, но хорошо, чтобы убедиться, что нет нулевых ссылок. Я не смог найти что-либо об изменениях, внесенных в события, так как это прекрасно работает в FF 3.6. Я обнаружил, что назначение событий отличается, но нет упоминания о чтении свойств события.

1 Ответ

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

Оказывается, что контекст, в котором был запущен javascript, был неправильным и работал в firefoxwindow (именно поэтому он не мог получить доступ к обработчикам событий) вместо выполнения в документе окна.

...