自动将toolbarbutton安装到firefox导航栏,不使用insertItem

Automatically install toolbarbutton to firefox nav-bar, not working with insertItem

本文关键字:insertItem 导航 firefox toolbarbutton 安装      更新时间:2023-09-26

所以我已经阅读了我在MDN、stackoverflow等网站上能找到的几乎所有内容,但它们似乎都过时了和/或不起作用。问题是:

我想在安装扩展时自动将其"toolbarbutton"放在导航栏上,类似于Chrome。用户在那之后做什么取决于他们,尽管如果你删除了按钮(带有这个特定的扩展名),你也可以只删除扩展名,因为没有按钮是无用的。无论如何。。。

似乎有两种方法可以做到这一点。您可以将其附加到"currentSet"并使其持久化,如下所示:

var currentset = document.getElementById("nav-bar").currentSet;
currentset=currentset + ",MYBUTTON_ID";
document.getElementById("nav-bar").setAttribute("currentset",currentset);
document.getElementById("nav-bar").currentSet = currentset;
document.persist("nav-bar","currentset");

或者,您可以像这样使用"insertItem":

var toolbar = document.getElementById("nav-bar");
toolbar.insertItem("MYBUTTON_ID", null);  
toolbar.setAttribute("currentset", toolbar.currentSet);  
document.persist(toolbar.id, "currentset");

现在,如果我使用第一个方法,它是有效的,但由于某种原因,它完全删除了导航栏上的所有其他内容。当"currentSet"覆盖它时,它似乎没有其他导航栏按钮,所以我只得到了默认的导航栏和我的图标。删除用户的所有其他按钮是不好的。。。

第二个选项不会删除其他选项,但无论出于何种原因,"insertItem"的方法都根本不起作用。我的按钮从未出现在导航栏中,句号。

有什么想法吗?

好吧,就像我想的那样,我的代码没有任何问题,问题与我描述的完全一样。

当加载扩展并执行安装按钮的脚本时,操作完成得太早。在执行时,"currentSet"只包含默认按钮。尚未加载其他扩展按钮。因此,如果修改currentSet并保存(持久化)它,则会擦除所有其他按钮

(对我来说)解决方案是强制我的"安装"脚本等待更长的时间。我发现一旦页面被加载,所有其他按钮都有足够的时间出现。所以,我只是这么做了:

function installButton() {
    var navbar = document.getElementById("nav-bar");
    var newset = navbar.currentSet + ",MYBUTTONID";
    navbar.currentSet = newset;
    navbar.setAttribute("currentset", newset );
    document.persist("nav-bar", "currentset");
}
window.addEventListener("load", function () { installButton(); }, false);

我用这段代码在navbar中添加工具栏按钮,但这只适用于新安装的第一次,而不适用于下一次安装,即升级插件,因为用户可以将图标移动/拖动到不同的位置。因此,您需要在新的firefox配置文件中尝试此操作。这是代码:

//plcae toolbar icon
var navbar = document.getElementById("nav-bar");
var newset = navbar.currentSet + ",MYBUTTON_ID";
navbar.currentSet = newset;
navbar.setAttribute("currentset", newset );
document.persist("nav-bar", "currentset"); 


这是XUL Overlay的代码:

<toolbarpalette id="BrowserToolbarPalette">
<toolbarbutton id="MYBUTTON_ID" inserbefore="searchBar" class="toolbarbutton-1 chromeclass-toolbar-additional"
    label="MYBUTTON_ID" tooltiptext="MYBUTTON_ID"
    onclick="MYBUTTON_ID()"/>
</toolbarpalette>



您可以违背用户意愿强制图标显示在导航栏中,这将在每次萤火虫重启后生效,但不建议

var navbar = document.getElementById("nav-bar");
    var newset = navbar.currentSet;
    if (newset.indexOf("MYBUTTON_ID") == -1)
    {
        if (newset.indexOf("reload-button,stop-button,") > -1)
            newset = newset.replace("reload-button,stop-button,", "reload-button,stop-button,MYBUTTON_ID,");
        else
            newset = newset + ",MYBUTTON_ID";
        navbar.currentSet = newset;
        navbar.setAttribute("currentset", newset );
        document.persist("nav-bar", "currentset"); 
    }