Мой код расширения Firefox уничтожает панель навигации

Я хочу добавить кнопку панели инструментов перед контейнером поиска 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/


person Dr Deo    schedule 13.05.2012    source источник


Ответы (2)


Я не совсем понимаю, почему панель навигации была удалена, но я думаю, что было бы лучше подойти к этому с другой точки зрения. Вместо того, чтобы возиться с массивом строк, попробуйте вместо этого использовать методы DOM.

e.g.

var sC=navBar.querySelector("#search-container");
navBar.insertBefore(btn, sC);
person Yansky    schedule 13.05.2012
comment
Кнопка, добавленная таким образом, не будет настраиваемой — пользователь не сможет переместить ее в другое место. Это явный критерий отклонения для addons.mozilla.org. - person Wladimir Palant; 14.05.2012

Код, который у вас здесь, кажется, работает, но панель инструментов должна каким-то образом найти вашу кнопку. Ваш текущий код даже не вставляет кнопку в документ, а это означает, что панель инструментов не имеет шансов найти ее по ее идентификатору. Она должна находиться в палитре панели инструментов, однако палитра также определяет, какие кнопки пользователь может выбирать при настройке панели инструментов. Итак, вы, вероятно, захотите сначала сделать что-то вроде этого:

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> element в документ, к которому вы прикрепите слушателя.

Примечание: в XUL обычно требуется событие command, а не click, если только вы не заинтересованы только в щелчках мыши и не хотите игнорировать нажатие кнопки с помощью клавиатуры или других средств.

person Wladimir Palant    schedule 14.05.2012