2008-08-30 45 views
6

我試圖用POST請求的結果打開一個新的瀏覽器選項卡。我試圖這樣做使用包含以下代碼的函數:如何使用JavaScript/XUL向新的瀏覽器選項卡發佈發佈請求?

var windowManager = Components.classes["@mozilla.org/appshell/window-mediator;1"] 
    .getService(Components.interface 
s.nsIWindowMediator); 
var browserWindow = windowManager.getMostRecentWindow("navigator:browser"); 
var browser = browserWindow.getBrowser(); 
if(browser.mCurrentBrowser.currentURI.spec == "about:blank") 
    browserWindow.loadURI(url, null, postData, false); 
else 
    browser.loadOneTab(url, null, null, postData, false, false); 

我使用一個字符串作爲url和JSON數據作爲postData。有什麼我做錯了嗎?

會發生什麼,是一個新的選項卡被創建,位置顯示我想要發佈到的URL,但文檔是空白的。瀏覽器上的後退,前進和重新加載按鈕全部變灰。它看起來像做了除了執行POST之外的所有內容。如果我關閉postData參數,那麼它會正確運行GET。

構建標識:Mozilla的/ 5.0(在Macintosh; U;英特爾的Mac OS X 10.5; EN-US; rv中:1.9.0.1)的Gecko/2008070206火狐/ 3.0.1

回答

0

與addTab代替loadOneTab嘗試,並刪除最後一個參數。

在Mozilla開發中心查看this page瞭解如何打開製表符。

您可以使用此功能,例如:

function openAndReuseOneTabPerURL(url) { 
    var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] 
        .getService(Components.interfaces.nsIWindowMediator); 
    var browserEnumerator = wm.getEnumerator("navigator:browser"); 

    // Check each browser instance for our URL 
    var found = false; 
    while (!found && browserEnumerator.hasMoreElements()) { 
    var browserInstance = browserEnumerator.getNext().getBrowser(); 

    // Check each tab of this browser instance 
    var numTabs = browserInstance.tabContainer.childNodes.length; 
    for(var index=0; index<numTabs; index++) { 
     var currentBrowser = browserInstance.getBrowserAtIndex(index); 
     if ("about:blank" == currentBrowser.currentURI.spec) { 

     // The URL is already opened. Select this tab. 
     browserInstance.selectedTab = browserInstance.tabContainer.childNodes[index]; 

     // Focus *this* browser 
     browserInstance.focus(); 
     found = true; 
     break; 
     } 
    } 
    } 

    // Our URL isn't open. Open it now. 
    if (!found) { 
    var recentWindow = wm.getMostRecentWindow("navigator:browser"); 
    if (recentWindow) { 
     // Use an existing browser window 
     recentWindow.delayedOpenTab(url, null, null, null, null); 
    } 
    else { 
     // No browser windows are open, so open a new one. 
     window.open(url); 
    } 
    } 
} 
4

東西是不太Mozilla的具體,並應與大多數的瀏覽器很好地工作:

  • 創建一個隱藏的形式與領域設置你需要的方式
  • 確保表單的「目標」屬性設置爲「_BLANK」
  • 以編程方式提交表單
3

對此的回答發現於shog9。 postData參數需要爲nsIMIMEInputStream對象,詳見here