2009-04-23 3 views
3

Я нахожусь на своем конце, и это, вероятно, что-то очень простое. В основном я есть этот код:Почему я не могу отключить этот элемент меню XUL?

var menuitem = document.getElementById('mymenuitem'); 
alert(menuitem); 
alert(varImChecking == null); 
menuitem.setAttribute('disabled', (varImChecking == null) ? 'true' : 'false'); 

Он должен быть отключающий пункт меню «mymenuitem», но не имеет никакого эффекта. При запуске предупреждения говорят: «[Объект XulElement]», за которым следует «true». Я знаю, что getElementById выбирает правильный элемент menuitem, потому что onclick привязывается к переменной menuitem.

Некоторые альтернативы я пробовал:

menuitem.setAttribute('disabled', (varImChecking == null)); 
menuitem.disabled = (varImChecking == null); 

Так почему же не SetAttribute имея никакого эффекта? Он даже не затушевывает пункт меню. Есть ли другой способ, которым я должен это делать?

Редактировать: Вспомните, никаких предупреждений и ошибок не отображается в консоли.

ответ

1

Я думаю, что я, наконец, понял это. Проблема в том, что у меня был элемент меню, который я пытался изменить, был жестко закодированный внутри .xul файла. По какой-то причине это сделало невозможным изменение отключенных или скрытых атрибутов.

Так что я удалил menuitem из .xul файла и динамически создал его в javascript вместо этого. Сейчас он работает так, как ожидалось:

var menuitem = document.getElementById('mypopupitem').appendChild(document.createElement('menuitem')); 
menuitem.setAttribute('disabled', 'true'); // Works. 
menuitem.removeAttribute('disabled'); // Also works. 

Кто-нибудь знает, это особенность/причуда XUL, или я просто делаю неправильно?

ОБНОВЛЕНИЕ: Как отмечалось многими замечаниями, приведенное выше неверно. Вы абсолютно можете изменить отключенный атрибут на элементе, жестко закодированном в XUL-файле.

После гораздо большей отладки, обработки проблемы вплоть до ее основных элементов, потянув волосы и т. Д., Оказалось, что это опечатка. Grrr .. Извините.

Оказывается, мой document.getElementById ('menuitem') захватывал элемент XUL, а не элемент. Тот факт, что метод onclick, похоже, правильно срабатывал, похоже, был вызван пузырями событий (я думаю?). Я до сих пор не знаю, почему setAttribute ('label', 'changed') работал, когда я это пробовал, но, к сожалению, в безумии отладки у меня нет этой версии, чтобы проверить ее снова.

Во всяком случае, сейчас он работает без необходимости динамического создания элемента меню. Спасибо за помощь!

+1

Это странно, он должен работать, даже если файл меню жестко закодирован в файле xul. – 2009-04-24 13:01:33

+0

Согласен. mrdrbob, возможно, вы могли бы опубликовать xul, с которым вы работали? Рад слышать, что это работает на вас, но вы определенно должны * не * добавлять его, манипулируя DOM. – pc1oad1etter

+0

Является ли menuitem в меню, menupopup или menubutton?У вас есть это внутри объекта menupopup внутри любого родителя, который вы используете? –

0

может быть это будет работать:

var menuitem = document.getElementById('mymenuitem'); 
alert(menuitem); 
alert(varImChecking == null); 
menuitem.setAttribute('disabled', (varImChecking == null) ? true : false); 

Я использовал истинные и ложные, а не «истина» и «ложь»

+0

Спасибо за предложение, но, к сожалению, она по-прежнему дает мне тот же результат. – mrdrbob

1

Я считаю, что SetAttribute будет искать строку «истинный»/"false", как вы изначально имели.

Хотя я не вижу ошибки сразу, почему вы не можете отключить. Для теста попробуйте просто menuitem.setAttribute ('disabled', 'true'); ? Если это не сработает - возможно, ничего не будет. Кажется странным отключить элемент меню - вы уверены, что не хотите отключать менулиста?

Я вижу проблему с вашим кодом включения. Я не могу найти для него отличную документацию, но я уже об этом разбирался. Одним из примеров, который вы можете найти в bugzilla, является тот факт, что параметр disabled = false actually disables items on Linux. Рекомендуемым способом из Mozilla является удаление атрибута, когда вы хотите его включить.

Таким образом, хотя ваше решение является более кратким, вероятно, вы должны смотреть на что-то больше, как это:

var menuitem = document.getElementById('mymenuitem'); 
alert(menuitem); 
alert(varImChecking == null); 
if(null==varImChecking){ 
    menuitem.setAttribute('disabled', 'true'); 
}else{ 
    menuitem.removeAttribute('disabled'); 
} 
+0

Спасибо за информацию. Я просто отключил элемент в контекстном меню в создаваемом мной надстройке, аналогично тому, как назад, вперед и т. Д. Отключен, когда вы щелкните правой кнопкой мыши веб-страницу, но не имеете истории в Firefox. Я вроде как XUL n00b, поэтому, если есть другой способ, я должен это делать, я был бы рад услышать это. – mrdrbob

0

Я использую тег, чтобы добавить настраиваемое контекстное меню. Когда я использую событие onpopupshowing для управления включением/отключением элемента меню, мое контекстное меню заполняется множеством элементов меню, которые я не собирался добавлять. Вот что я добавил в overlay.xul

< всплывающей onpopupshowing = "isAssertTextEnabled (это)" ID = "contentAreaContextMenu" >
< MenuItem ID = "Контекст-recorderpopup" метка = "Утверждают текст нового всплывающего тега настоящее»
Accesskey = "Т"
InsertAfter = "контекстно-стоп" OnCommand = "onAssertionMenu (событие)" />
</всплывающее окно >

пожалуйста, л и др мне знать, если я пропускаю что-то

Спасибо, Вины

2

Что касается вопроса инвалидизирующего: Если пункт меню содержит команды, пункт меню можно отключить только путем установки «заблокирован» атрибута этой команды , Если элемент меню содержит oncommand, то отключение должно работать над самим элементом меню.

1

У меня была такая же проблема. Я использовал знаковые пункты меню вместе с командами. Подсказка заключалась в том, чтобы установить атрибут disabled элемента menu, а команда - true или false. Мне также пришлось установить отключенный атрибут после того, как родительский menupopup был открыт, e.i. onpopupshown. Теперь я могу обновлять свои элементы меню динамически.

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

КСТАТИ:

  1. мой XUL внутри расширение Firebug