4

我束手无策,这可能很简单。基本上我有这个代码:

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 没有任何效果呢?它甚至不会使菜单项变灰。我应该这样做吗?

编辑: 忘了提,控制台中没有显示警告或错误。

4

6 回答 6

2

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

于 2010-11-21T01:56:46.983 回答
1

我相信 setAttribute像您最初那样寻找字符串“true”/“false”。

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

我确实看到您的启用代码有问题。我找不到很好的文档,但我之前确实处理过这个问题。您可以在 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');
}
于 2009-04-23T03:54:42.420 回答
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') 在我尝试这样做时会起作用,但不幸的是,在疯狂的调试中,我没有该版本可以再次检查。

无论如何,它现在正在工作,而无需动态创建菜单项。感谢所有的帮助!

于 2009-04-24T02:27:01.987 回答
1

我有同样的问题。我将标志性菜单项与命令一起使用。线索是将菜单项的禁用属性和命令设置为真或假。在打开父菜单弹出窗口后,我还必须设置禁用属性,即 onpopupshown 。现在我可以动态更新我的菜单项。

我已经花了一个多小时来解决这个问题 xD 我希望这将帮助人们最大限度地减少他们的时间开支。

顺便提一句:

  1. 我的 xul 在 firebug 扩展中
于 2011-09-29T00:26:31.390 回答
0

可能这会起作用:

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

我用的是真假而不是“真”和“假”

于 2009-04-23T01:15:35.470 回答
0

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

<popup onpopupshowing="isAssertTextEnabled(this)" id="contentAreaContextMenu">
<menuitem id="context-recorderpopup" label="Assert text present"
accesskey="T"
insertafter="context-stop" oncommand="onAssertionMenu(event )" />
</popup>

如果我错过了什么,请告诉我

谢谢, 维奈

于 2009-08-21T05:26:43.333 回答