为什么我不能禁用这个XUL menuitem?

时间:2009-04-23 00:52:05

标签: xul menuitem setattribute

我的智慧结束了,这可能非常简单。基本上我已经有了这段代码:

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 个答案:

答案 0 :(得分:2)

关于禁用问题: 如果menuitem包含命令,则只能通过设置该命令的“disabled”属性来禁用menuitem。 如果menuitem包含oncommand,则禁用应该适用于menuitem本身。

答案 1 :(得分:1)

我相信setAttribute 寻找字符串“true”/“false”,就像你原来的那样。

虽然我没有立即看到一个错误,为什么你不能禁用。对于测试,你试过简单吗? menuitem.setAttribute('disabled','true'); ? 如果这不起作用 - 也许什么都不会。禁用menuitem似乎很奇怪 - 你确定你不想禁用menulist吗?

我确实发现您的启用代码存在问题。我找不到很好的文档,但我之前确实处理过这个问题。您可以在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');
}

答案 2 :(得分:1)

我想我终于搞清楚了。问题是,我尝试编辑的菜单项是在.xul文件中进行硬编码。无论出于何种原因,这使得无法更改已禁用或隐藏的属性。

所以我从.xul文件中删除了menuitem,而在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')在我尝试的时候有效,但不幸的是,在调试的狂热中,我没有那个版本再次检查。

无论如何,它现在正在工作,无需动态创建menuitem。谢谢你的帮助!

答案 3 :(得分:1)

我遇到了同样的问题。我已将标志性菜单项与命令一起使用。线索是将menuitem和命令的disabled属性设置为true或false。我还必须在打开父menupopup后设置禁用的属性,e.i。 onpopupshown。现在我可以动态更新我的菜单项。

我花了一个多小时来解决这个问题xD我希望这能帮助人们减少他们的时间费用。

BTW:

  1. 我的xul在firebug扩展名

答案 4 :(得分:0)

可能会有效:

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

我使用了真假而不是'真'和'假'

答案 5 :(得分:0)

我正在使用标签添加自定义上下文菜单。当我使用“onpopupshowing”事件来处理菜单项的启用/禁用时,我的上下文菜单中会填充很多我不打算添加的菜单项。这是我在overlay.xul中添加的新popup标记

< popup onpopupshowing =“isAssertTextEnabled(this)”id =“contentAreaContextMenu”>
    < menuitem id =“context-recorderpopup”label =“断言文字存在”
              ACCESSKEY = “T”
              insertafter =“上下文一站式”               按需= “onAssertionMenu(事件)”               />
   < /弹出>

如果我错过了某些内容,请告诉我

谢谢, 维奈