4

私は知恵が尽きており、おそらくそれは本当に単純なことです。基本的に私はこのコードを持っています:

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

「mymenuitem」メニュー項目を無効にする必要がありますが、効果はありません。実行すると、アラートは '[Object XulElement]' の後に 'true' を表示します。menuitem変数へのonclickバインディングが機能するため、getElementByIdが正しいmenuitem要素を選択していることはわかっています。

私が試したいくつかの代替案:

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

では、setAttribute が効果を発揮しないのはなぜでしょうか。メニュー項目がグレーアウトすることさえありません。これを行う別の方法はありますか?

編集: 言い忘れましたが、コンソールに警告やエラーは表示されません。

4

6 に答える 6

2

無効化の問題について: menuitem にコマンドが含まれている場合、menuitem は、そのコマンドの "disabled" 属性を設定することによってのみ無効にできます。menuitem に oncommand が含まれている場合、無効化は menuitem 自体で機能するはずです。

于 2010-11-21T01:56:46.983 に答える
1

あなたが最初に持っていたように、setAttribute文字列「true」/「false」を探していると思います。

無効にできない理由にすぐにバグは見られませんが。テストのために、単純に menuitem.setAttribute('disabled', 'true'); を試しましたか? ? それが機能しない場合は、おそらく何も機能しません。メニュー項目を無効にするのは奇妙に思えます - 本当にメニューリストを無効にしたくないのですか?

有効化コードに問題があります。それに関する優れたドキュメントは見つかりませんが、以前にこれに対処しました。bugzilla で見つけることができる 1 つの例は、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 ファイルにハードコードされたアイテムの disabled 属性は絶対に変更できます。

さらに多くのデバッグを行い、問題をコア要素に切り詰め、髪を引っ張るなどした後、それは.... タイプミスであることが判明しました。うーん..ごめんなさい。

私の document.getElementById('menuitem') は、要素ではなく XUL 要素を取得していたことがわかりました。onclick メソッドが正しく発火しているように見えたのは、イベントのバブリングのおかげのようです (私は推測しますか?)。setAttribute('label', 'changed') を試してみたときになぜ機能したのかはまだわかりませんが、残念ながら、デバッグの熱狂の中で、もう一度確認するバージョンがありません。

とにかく、メニュー項目を動的に作成しなくても、現在は機能しています。助けてくれてありがとう!

于 2009-04-24T02:27:01.987 に答える
1

私はまったく同じ問題を抱えていました。コマンドと一緒に象徴的なメニュー項目を使用しました。手がかりは、menuitem の disabled 属性とコマンドを true または false に設定することでした。また、親 menupopup が開かれた後、無効な属性を設定する必要がありました。ei onpopupshown 。これで、メニュー項目を動的に更新できます。

私はこの問題を解決するのに 1 時間以上を費やしました xD これが人々の時間的支出を最小限に抑えるのに役立つことを願っています.

ところで:

  1. 私のxulはfirebug拡張機能の中にあります
于 2011-09-29T00:26:31.390 に答える
0

タグを使用してカスタム コンテキスト メニューを追加しています。「onpopupshowing」イベントを使用してメニュー項目の有効化/無効化を処理すると、追加するつもりのない多くのメニュー項目がコンテキスト メニューに表示されます。これは、overlay.xul に追加した新しい popup タグです。

<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 に答える
0

これはうまくいくかもしれません:

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

「true」と「false」ではなく、true と false を使用しました

于 2009-04-23T01:15:35.470 に答える