2012-04-26 80 views
0

我正在使用XMLHttpRequest在服務器和Firefox擴展之間交換數據。不幸的是,這些請求似乎與當前打開的頁面有某種聯繫 - 如果我在當前選項卡關閉時嘗試發出請求,它將失敗並顯示錯誤。我怎樣才能使我的請求源於擴展本身,而不依賴於標籤中發生了什麼?來自Firefox擴展的XMLHttpRequest

編輯:這是重現此問題的代碼。它作爲主擴展機構運行(我的設計基於「Hello world」教程,來自http://kb.mozillazine.org/Getting_started_with_extension_development,因此沒有附加SDK)。這意味着它與上面教程中的「overlay.js」的代碼在相同的位置執行。

function createXMLHttpRequest() { 
    return Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] 
     .createInstance(Components.interfaces.nsIXMLHttpRequest);  
} 

function issueRequest() { 
    var req = createXMLHttpRequest(); 
    req.open("GET", "http://google.com", true); 
    req.addEventListener("load", function(event) { 
     alert("SUCCES"); 
    }); 
    req.addEventListener("error", function(event) { 
     alert("ERROR"); 
    }); 
    req.send(); 
}; 

window.addEventListener("DOMContentLoaded", function(event) { 
    issueRequest(); 

    var doc = event.originalTarget; 
    var win = doc.defaultView; 

    win.addEventListener("unload", function(event) { 
     issueRequest(); 
    }); 
}); 

這會導致在打開新選項卡後顯示「SUCCESS」,關閉後顯示「ERROR」。我寧願有兩個成功。

+0

請向我們展示一些代碼 - 您如何/在哪裏創建XMLHttpRequest?我猜你使用附加SDK並從內容腳本執行它? – 2012-04-27 06:05:46

+0

@WladimirPalant我製作了一個簡化的測試案例來展示問題。我沒有使用附加SDK,並且就我對上述教程的理解而言,此代碼作爲內容腳本運行。 – 2012-04-27 14:17:17

+0

請在代碼中檢查'win.location.href'的值 - 我很確定它是瀏覽器窗口,而不是內容頁面。因此,您正在等待瀏覽器窗口關閉而不是選項卡。 – 2012-04-27 21:00:12

回答

1

如果該腳本正在瀏覽器窗口覆蓋中運行,那麼您將DOMContentLoaded處理程序附加到了錯誤的節點 - 只有當瀏覽器窗口本身加載時纔會收到通知。因此,您的unload處理程序等待瀏覽器窗口關閉,您可能打算等待選項卡關閉。正確的代碼如下所示:

// Wait for the browser window to load before doing anything 
window.addEventListener("load", function() { 
    // Attach a listener to the tabbrowser to get notified about new pages 
    window.gBrowser.addEventListener("DOMContentLoaded", function(event) { 
    issueRequest(); 

    var doc = event.originalTarget; 
    var win = doc.defaultView; 

    win.addEventListener("unload", function(event) { 
     issueRequest(); 
    }); 
    }, false); 
}, false) 
+0

的確,我正在監聽來自整個瀏覽器的事件 - 但是標籤中的DOMContentLoaded事件一路上漲,所以我得到了與代碼相同的事件+與加載chrome元素相關的事件。 我試過你的代碼,它不會像我一樣工作 - 關閉選項卡警報錯誤。 win和win.location.href在我和你的版本中分別是相同的(同時打開谷歌):「窗www.google.com」和「http://www.google.com/」 – 2012-04-27 21:33:17