Расширение FF - не сохраняются значения глобальных переменных - PullRequest
4 голосов
/ 10 сентября 2010

Я работаю над расширением FF, которое вкратце загружает динамические изображения в боковую панель. Идентификаторы, которые я получаю, взяты из ответа JSON и хранятся в глобальной переменной, объявленной в том же файле .js, который я собираюсь использовать. Моя проблема в том, что я пытаюсь смоделировать просмотр результатов. Я загружаю боковую панель, используя мою глобальную переменную, и все в порядке. Когда я пытаюсь перейти к следующему набору изображений для отображения с использованием идентификаторов, которые я сохранил в своей глобальной переменной, происходит сбой из-за того, что моя переменная была полностью сброшена. Я посмотрю, смогу ли я дать грубое представление о моем коде:

var searchVars = {
     'keyword': "", 
     'totalResults': 0, 
     'imgIds': [], 
     'cIds': [],
     'curPg': "1",
     'dispStartIdx': 0,
     'dispEndIdx': 4,
     'dispPerPg': 5,

      toString: function() {
           return this.keyword + ", " +
                this.totalResults + ", " +
                this.imgIds + ", " +
                this.cIds + ", " +
                this.curPg + ", " +
                this.dispStartIdx + ", " +
                this.dispEndIdx + ", " +
                this.dispPerPg;
      }    
 };

 var corbisquicksearch = {
 onSearch: function () {
    cqsearch.resetSearch(); //Resets my global variable every search

    searchVars.keyword = cqsearch.getSelectedText(); //searchVars is my global variable im having trouble with
    cqsearch.extendImageCache();
}

extendImageCache: function() {
    var postToURL = 'http://www.agenericurl.com/Search?';
    var keyword = searchVars.keyword;
    var p = 1; //Page Offset for ID's returned
    var size = 200; //Number of ID's returned in the response set
    var query = "searchQuery=" + encodeURIComponent("q=" + keyword + "&p= " + p +"&s=" + size);

    var request = new XMLHttpRequest();  
    request.open('post', postToURL + query, true);    
    request.onreadystatechange = function (aEvt) {
        if (request.readyState == 4) {  
            alert(1);
            if(request.status == 200) {
                alert(2);
                var responseInJSON = JSON.parse(request.responseText);
                searchVars.totalResults = responseInJSON.ResultsCount;

                var i = searchVars.imgIds.length;
                var lastResult = i + responseInJSON.SearchResultImages.length;

                while (i < lastResult) {
                    searchVars.imgIds[i] = responseInJSON.SearchResultImages[i].ImageId;
                    searchVars.cIds[i] = responseInJSON.SearchResultImages[i].CorbisId;                        
                    i++;
                }

                cqsearch.loadSidebar();
            }
            else {
                dump("Error loading page\n");  
            }
        }  
    };  
    request.send();
},

loadSidebar: function() {
    //Initializing Env Variables
    var sidebar = document.getElementById("sidebar");
    var sidebarDoc = sidebar.contentDocument || document;

    var searchInfoBox = sidebarDoc.getElementById("search_info");
    var resultsBox = sidebarDoc.getElementById("img_results");
    var pagingInfoBox = sidebarDoc.getElementById("paging_info");

    //Loading up the search information
    var searchInfo = "Displaying Results for <b>{0}<b/><br>Showing <b>{1} - {2}</b> of <b>{3}</b>";
    var args = [searchVars.keyword, searchVars.dispStartIdx, searchVars.dispEndIdx, searchVars.totalResults];

    var infoLbl = document.createElement("label");
    infoLbl.setAttribute("value", cqsearch.strFormat(searchInfo, args));

    searchInfoBox.appendChild(infoLbl);

    while (resultsBox.firstChild) {
        resultsBox.removeChild(resultsBox.firstChild);
    }

    //Loading up the image results
    var i = searchVars.dispPerPg * (searchVars.curPg - 1);
    var lastDisplayed = (searchVars.curPg * searchVars.dispPerPg) - 1;
    alert("length" + searchVars.toString());        
    while (i <= lastDisplayed) {
        var imageID = searchVars.imgIds[i]; 
        var cID = searchVars.cIds[i];


        var imgSrc = cqsearch.createMediaUrlParams(imageID, 'thumb', cID, false).url; //thumb, 170, hover
        var img = document.createElement("image");
        img.setAttribute("src", imgSrc);
        alert(imgSrc);
        img.setAttribute("class", "img");

        var idDelimiter = "_image";
        var id = cID + idDelimiter;
        img.id = id;
        img.addEventListener("click", function () {
            cqsearch.openEnlargementPage(this.id.substring(0, this.id.indexOf(idDelimiter)));
        }, false); 

        var imgBox = document.createElement("box");
        imgBox.setAttribute("class", "imgContainer");

        imgBox.appendChild(img);
        resultsBox.appendChild(imgBox);

        i++;
    }

    //Loading up paging info and functionality
    var prevBtn = document.createElement("button");
    prevBtn.setAttribute("label", "Previous");
    prevBtn.setAttribute("oncommand", "cqsearch.prevPage()");
    var nextBtn = document.createElement("button");
    nextBtn.setAttribute("label", "Next");
    nextBtn.setAttribute("oncommand", "cqsearch.nextPage()");

    pagingInfoBox.appendChild(prevBtn);
    pagingInfoBox.appendChild(nextBtn);
},

nextPage: function() {
    searchVars.curPg++;

    alert(searchVars.imgIds);

    cqsearch.loadSidebar();
},

};

Я понимаю, что в нем много кода, и я не публиковал все функции, которые у меня есть, и нет, этот конкретный URL не работает. Все, что не включено, работает нормально, и делает именно то, что предполагалось, и ничего более, поэтому я оставил это. Но если бы кто-нибудь мог пролить некоторый свет на то, почему моя глобальная переменная очищается между моей начальной загрузкой боковой панели и когда я нажимаю, чтобы перейти на следующую страницу, я был бы очень признателен.

Если вам нужно, чтобы я что-то добавил или уточнить, пожалуйста, дайте мне знать, и я сделаю это! Я, вероятно, закончу сужением этого кода и удалением ненужных частей.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

Если вам просто нужно место для хранения глобальных переменных для сеанса, тогда Модуль JavaScript , вероятно, будет работать.

1 голос
/ 16 марта 2011

Сможете ли вы использовать хранилище на стороне клиента для хранения глобальной переменной? тогда вы не потеряете его при загрузке страницы или обновлении. Вы можете использовать это для отладки и посмотреть, получаете ли вы обновление страницы, потому что иногда расширения нестабильны, и вы даже не замечаете обновления, но если вы сохраните переменную как пару значений ключа в веб-хранилище, вы можете обойти это .

localStorage.setItem('imgId', '5');

для установки пары ключ / значение

localStorage.getItem('imgId');

для получения пары ключ / значение

Затем вы можете установить новое локальное хранилище для каждой серии изображений, которые были показаны клиенту, на основе последнего номера, установленного в локальном хранилище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...