在Firefox Bootstrapped Addons中,必须手动插入/删除,启用/禁用以及隐藏/取消隐藏上下文菜单项。
我想知道是否可以将它们组合成一个元素(作为该元素的子元素),以便可以将该组处理为一个,即可以删除父节点,从而删除其所有子节点。
例如:
<some parent element for grouping>
<menuseparator/>
<menuitem .... />
<menuitem .... />
<menuseparator/>
<menuitem .... />
<menuseparator/>
</some parent element for grouping>
我尝试将它们放在<menu> ... </menu>
内但缩进了menuitem
更新
我注意到Flashgot overlay有一个混合menuitem
和menupopup
的分组
<popup id="contentAreaContextMenu">
<menu id="flashgot-submenu" hidden="true" persist="hidden" label="FlashGot" class="menu-iconic flashgot-icon-lnk" accesskey="&flashgotLink.accesskey;" insertbefore="context-sep-selectall,context-sep-stop,context-sep-copylink" >
<menupopup>
<menuseparator id="flashgot-submenu-anchor" hidden="true" />
<menuitem id="flashgot-menuitem-it" label="&flashgotLink;" accesskey="&flashgotLink.accesskey;" oncommand="gFlashGot.downloadPopupLink()" key="flashgot-link-key" class="menuitem-iconic flashgot-icon-lnk" />
<menuitem id="flashgot-menuitem-sel" label="&flashgotSel;" accesskey="&flashgotSel.accesskey;" oncommand="gFlashGot.delayCmd('Sel')" key="flashgot-sel-key" class="menuitem-iconic flashgot-icon-sel" />
<menuitem id="flashgot-menuitem-all" label="&flashgotAll;" accesskey="&flashgotAll.accesskey;" oncommand="gFlashGot.delayCmd('All')" key="flashgot-all-key" class="menuitem-iconic flashgot-icon-all" />
<menuitem id="flashgot-menuitem-tabs" label="&flashgotTabs;" accesskey="&flashgotTabs.accesskey;" oncommand="gFlashGot.delayCmd('Tabs')" key="flashgot-tabs-key" class="menuitem-iconic flashgot-icon-tabs" />
<menuitem id="flashgot-menuitem-media" label="&flashgotMedia;" oncommand="gFlashGot.downloadMedia()" key="flashgot-media-key" class="menuitem-iconic flashgot-icon-media" />
<menuitem id="flashgot-menuitem-buildGallery" label="&flashgotBuildGallery;" class="menuitem-iconic flashgot-icon-buildGallery" oncommand="gFlashGot.buildGallery()" />
<menu id="flashgot-menu-options" class="menu-iconic flashgot-icon-opts" label="&flashgotOptions;" >
<menupopup id="flashgot-menupopup-options" onpopupshowing="gFlashGot.prepareOptsMenu(event.target)">
<menuitem id="flashgot-ctx-menuitem-nodms" hidden="true" label="&flashgotNoDMS;" oncommand="gFlashGotService.showDMSReference()" />
<menuseparator id="flashgot-ctx-sep-nodms" />
<menuitem id="flashgot-ctx-menuitem-opt-autoStart" label="&flashgotAutostart;" type="checkbox" oncommand="gFlashGot.switchOption('autoStart')" />
<menuitem id="flashgot-ctx-menuitem-opt-includeImages" label="&includeImages.label;" type="checkbox" oncommand="gFlashGot.switchOption('includeImages')" />
<menuitem id="flashgot-ctx-menuitem-opts" label="&flashgotMoreOpts;" oncommand="gFlashGot.openOptionsDialog()" />
<menuseparator id="flashgot-ctx-sep-about" />
<menuitem id="flashgot-ctx-menuitem-about" label="&flashgotAbout;" oncommand="gFlashGot.openAboutDialog()" />
<menuitem id="flashgot-ctx-homepage" label="&flashgotVisitHomepage;" oncommand="gFlashGot.browseHomePage()" />
</menupopup>
</menu>
</menupopup>
</menu>
<menuseparator id="flashgot-context-separator" hidden="true" insertbefore="context-sep-selectall,context-sep-stop,context-sep-copylink" />
<menuseparator id="flashgot-context-separator2" hidden="true" insertbefore="context-sep-selectall,context-sep-stop,context-sep-copylink" />
</popup>
第一个是正常的。第二个是在menuitem
<menu class="menu-iconic>
之后
答案 0 :(得分:1)
我找到了你。将其围绕在<menu><menupopup>
。
在此处查看此要点,它会将菜单创建为一个项目: Noitidart / _ff-addon-snippet-CreateMenuWithSubmenuAndAttachToWidget.js
您的加载项通过分配innerHTML或通过类似方式从包含可能未经过清理的数据的HTML字符串创建DOM节点。除了效率低下,这是一个主要的安全风险。有关详情,请参阅 https://developer.mozilla.org/en/XUL_School/DOM_Building_and_HTML_Insertion。
<menu>
<menupopup>
<menuseparator/>
<menuitem .... />
<menuitem .... />
<menuseparator/>
<menuitem .... />
<menuseparator/>
<keyset>
<key id="sample-key1" .... />
<key id="sample-key2" .... />
<key id="sample-key3" .... />
</keyset>
</menupopup>
</menu>
答案 1 :(得分:1)
像<menupopup>
这样的contentAreaContextMenu
期望包含单独的项目(元素),所以即使有一个可以跨平台可靠运行的黑客,它也只是一个黑客攻击,随时都可能破解。所以不,你不能可靠地逻辑地将菜单项组合在一起,这些菜单项仍会作为单独的项目显示在UI中。
此外,您不应将<keyset>
等其他无关内容添加到<menupopup>
中。同样的道理:可能在任何时候都会破裂。 (虽然<keyset>
是一种至少在逻辑上对<key>
元素进行分组的方法......)