XUL кнопка не появляется - PullRequest
3 голосов
/ 13 сентября 2010

Я один из разработчиков TryAgain , дополнения Firefox, которое отображает пользовательскую страницу с ошибкой, когда веб-сайт не загружается.По сути, он заменяет Firefox netError.xhtml настроенной версией.

Однако я столкнулся с некоторыми довольно терминальными проблемами совместимости между 3.0. * - 3.6. * И Fx4b5.(Запись в netError.dtd была переименована, что вызвало ошибку синтаксического анализа XML в одной или другой версии.)

Чтобы исправить это, я решил использовать расширение динамически изменить страницу, вместо полной замены.Одним из элементов, который мне нужно добавить к netError.xhtml в Fx3, является <xul:button>.Однако, добавив его со следующим кодом, на экране ничего не появляется:

var div = document.getElementById("errorContent");
var btn = document.createElement("xul:button");
btn.setAttribute("label", "Hello world");
btn.setAttribute("oncommand", "alert('Hello world!');");
div.appendChild(btn);

Я вижу, что в Центре разработчиков Mozilla есть эта заметка :

Реализация createElement в Gecko не соответствует спецификации DOM для документов XUL и XHTML: localName и namespaceURI не имеют значения null для созданного элемента.Подробности смотрите в bug 280692 .

Что это влечет за собой, и как я могу это исправить?

Кроме того, как я могу выполнить событие oncommandчерез JavaScript?

1 Ответ

1 голос
/ 25 октября 2010

document.createElement () не принимает полные имена.Передаваемая вами строка «xul: button» создает элемент с именем «xul: button» (== его localName), а не элемент «button» XUL.

С другой стороны, при синтаксическом анализе XML,анализируется как полное имя: анализатор ищет пространство имен, соответствующее префиксу xul (из определения xmlns:xul="" в одном из родительских элементов), и создает элемент "button" в найденном им пространстве имен.

Примечание о несоответствии спецификации DOM для XUL и (X) HTML означает, что вы можете использовать обычный document.createElement("buttton") для создания элементов в пространстве имен XUL или HTML в документе XUL или HTML, соответственно.

ИлиВы могли бы пойти трудным путем и использовать:

var XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
document.createElementNS(XUL_NS, "button")

или даже с квалифицированным именем, но нет никаких причин для этого:

document.createElementNS(XUL_NS, "xul:button")
...