1

我想在我的插件中的 Firefox 搜索容器之前添加一个工具栏按钮。但它完全清除了我的导航栏。 在此处输入图像描述 我怀疑有问题的代码是由于空数组或其他原因造成的,但我不能确定。

//insert before search container
if(navBar && navBar.currentSet.indexOf("mybutton-id")== -1 )//navBar exist and our button doesnt
{
    var arrayCurrentSet= navBar.currentSet.split(',');
    var arrayFinalSet= [];//empty at first
    if(arrayCurrentSet.indexOf("search-container") != -1)//if search-container exists in current set
    {
        // check item by item in current set
        var i= null;
        while(i=arrayCurrentSet.shift() != undefined)
        {
            if(i == "search-container")//"search-container" found !!
            {
                /*insert our button after it but only if our button does not already exist*/
                if(arrayFinalSet.indexOf("mybutton-id") == -1) arrayFinalSet.push("mybutton-id");
            }
            arrayFinalSet.push(i); 
            dump("arrayFinalSet "+ i);
        }
    }
    else //damn search-container doesnt exist
    {
        arrayFinalSet= arrayCurrentSet;
        arrayFinalSet.push("mybutton-id");//add our button to the end of whatever is available in nav bar
    }
    //set new navBar
    navBar.currentSet= arrayFinalSet.join(',');  
}

完整代码可用

https://builder.addons.mozilla.org/addon/1052494/latest/

http://jsfiddle.net/CQ4wA/

4

2 回答 2

2

我不太清楚为什么导航栏被移除了,但我认为从不同的角度来处理这个会更好。与其乱用字符串数组,不如尝试使用 DOM 方法。

例如

var sC=navBar.querySelector("#search-container");
navBar.insertBefore(btn, sC);
于 2012-05-13T23:10:20.907 回答
2

您在这里的代码似乎可以工作 - 但工具栏需要以某种方式找到您的按钮。您当前的代码甚至没有将按钮插入到文档中,这意味着工具栏没有机会通过其 ID 找到它。它应该在工具栏调色板调色板中,但是,调色板还确定用户在自定义工具栏时可以选择哪些按钮。所以你可能想先做这样的事情:

var toolbox = navBar.toolbox;
toolbox.palette.appendChild(btn);

您可能还想简化代码:

var arrayCurrentSet = navBar.currentSet.split(',');
var insertionPoint = arrayCurrentSet.indexOf("search-container");
if (insertionPoint >= 0)
  arrayCurrentSet.splice(insertionPoint, 0, "mybutton-id");
else
  arrayCurrentSet.push("mybutton-id");
navBar.currentSet = arrayCurrentSet.join(',');

最后,您可能想让浏览器记住当前的按钮集,它不会自动发生:

document.persist(navBar.id, "currentset");

请注意,将插入工具栏中的按钮与您添加到调色板的按钮不同 - 工具栏代码克隆按钮,在调色板中留下一个副本。因此,通过添加的事件侦听器addEventListener将很遗憾地丢失。最好使用command属性并将<command>元素插入到您将附加侦听器的文档中。

注意:在 XUL 中,您通常需要command而不是click事件 - 除非您真的只对鼠标点击感兴趣并且想要忽略由键盘或其他方式触发的按钮。

于 2012-05-14T08:58:30.823 回答