Проблема с панелью инструментов Firefox XUL с getElementById javascript

Я пишу свою первую панель инструментов Firefox XUL и получаю странное поведение - чтобы отладить свой код, я вызываю одну и ту же функцию js как из панели инструментов Firefox, так и из кнопки в очень простом HTML-файле, который я создал.

Функция javascript отображает окно предупреждения, получает элемент с помощью document.getElementById, меняет его цвет и отображает другое окно предупреждения.

Функция javascript хорошо работает при вызове с помощью кнопки HTML, но при использовании кнопки панели инструментов 'document.getElementById' возвращает значение null, и функция завершается (отображается только первое окно предупреждения).

Есть предположения, что может быть не так? Я предоставляю (очень простой) код ниже для справки.

Спасибо заранее!

Файл javascript - facebrew.js

function FaceBrew_rtlSelection() {
    alert('Before!'); 
  sel_node = document.getElementById("header");
    sel_node.style.color = 'blue';
    alert('After!'); 
}

HTML-файл

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>Test</title>
    <script type="text/javascript" src="http://localhost/Sandbox/FaceBrew/chrome/content/facebrew.js"> </script>
</head>

<body>
<input type="button" value="Click me" id="select" onclick="FaceBrew_rtlSelection()" />
<div id="header">
  <h1>Hello world!< /h1>
</div>
</body>
</html>

Файл XUL - facebrew.xul

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://facebrew/skin/facebrew.css" type="text/css"?>

<overlay id="FaceBrew-Overlay"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

    <script type="application/x-javascript"
            src="chrome://facebrew/content/facebrew.js" />
         
    <toolbox id="navigator-toolbox">
        <toolbar id="FaceBrew-Toolbar" toolbarname="FaceBrew Toolbar" accesskey="F"
                 class="chromeclass-toolbar" context="toolbar-context-menu" 
                 hidden="false" persist="hidden">
            <toolbaritem flex="0">            
                <toolbarbutton id="FaceBrew-Web-Button" tooltiptext=""
                               label="Run" oncommand="FaceBrew_rtlSelection()" />
            </toolbaritem>
        </toolbar>
    </toolbox>
</overlay>

Файл CSS - facbrew.css

#FaceBrew-Web-Button {
    list-style-image: url("chrome://facebrew/skin/web.png");
}

person Omri Allouche    schedule 21.01.2010    source источник
comment
Возможно, объект документа, используемый панелью инструментов, не совпадает с загруженной в данный момент страницей.   -  person amphetamachine    schedule 22.01.2010
comment
Я забыл упомянуть - код панели инструментов работает успешно, если удалить теги ‹h1› в файле HTML. Итак, я предполагаю, что объект документа одинаков для панели инструментов и кнопки HTML.   -  person Omri Allouche    schedule 22.01.2010


Ответы (2)


как сказал Пол, когда функция вызывается из панели инструментов, контекст документа отличается. получить выбранный в данный момент объект HTML-документа с помощью:

var doc = gBrowser.selectedBrowser.contentDocument;
doc.getElementById(...);

Кроме того, вы всегда можете взглянуть на консоль ошибок, чтобы узнать, почему ваш код не работает (Инструменты -> Консоль ошибок).

person parserr    schedule 24.01.2010

Ваша панель инструментов - это наложение, поэтому контекст (документ и окно) - это browser.xul, а не ваш html-файл.

person Paul Rouget    schedule 23.01.2010