Почему я не могу отключить этот пункт меню XUL? - PullRequest
3 голосов
/ 23 апреля 2009

Я в своем уме, и это, вероятно, что-то действительно простое. В основном у меня есть этот код:

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

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

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

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

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

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

Ответы [ 6 ]

2 голосов
/ 21 ноября 2010

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

1 голос
/ 29 сентября 2011

У меня была та же проблема. Я использовал знаковые пункты меню вместе с командами. Подсказка заключалась в том, чтобы установить для отключенного атрибута пункта меню И команды значение true или false. Я также должен был установить отключенный атрибут после открытия родительского меню, т.е. onpopupshown. Теперь я могу обновлять свои пункты меню динамически.

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

Кстати:

  1. мой xul внутри расширения firebug
1 голос
/ 24 апреля 2009

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

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

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

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

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

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

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

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

1 голос
/ 23 апреля 2009

Я полагаю, что setAttribute будет искать строку "true" / "false", как вы изначально это делали.

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

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

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

var menuitem = document.getElementById('mymenuitem');
alert(menuitem);
alert(varImChecking == null);
if(null==varImChecking){
   menuitem.setAttribute('disabled', 'true');
}else{
   menuitem.removeAttribute('disabled');
}
0 голосов
/ 21 августа 2009

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


Accesskey =
"Т" InsertAfter = "контекстно-стоп" OnCommand = "onAssertionMenu (событие)" />

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

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

0 голосов
/ 23 апреля 2009

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

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

Я использовал true и false вместо «true» и «false»

...