2013-07-22 135 views
29

我目前有一些代碼運行window.open(urlWithGetParams)行。據我所知,這將迫使我使用GET請求。我想用POST請求來做到這一點。有沒有解決方法?如何用POST替換window.open(...)

我還沒有和window.open()結婚。我打開幾乎任何可以讓我通過POST請求而不是GET來產生新窗口的替代方法。

+1

請參閱http://stackoverflow.com/questions/5554896/window-open-post或http://stackoverflow.com/questions/3951768/window-open-and-pass-parameters-by-post-method -problem –

+2

「複製」中的操作對我來說不會真正起作用 - 我必須以某種方式將這些參數放到新窗口中,並且這需要通過......將它們發送出去。 GET請求? O_o – corsiKa

回答

91

其實我在崗位上做出了一個小的「庫」只爲這,打開一個新窗口:

// Arguments : 
// verb : 'GET'|'POST' 
// target : an optional opening target (a name, or "_blank"), defaults to "_self" 
open = function(verb, url, data, target) { 
    var form = document.createElement("form"); 
    form.action = url; 
    form.method = verb; 
    form.target = target || "_self"; 
    if (data) { 
    for (var key in data) { 
     var input = document.createElement("textarea"); 
     input.name = key; 
     input.value = typeof data[key] === "object" ? JSON.stringify(data[key]) : data[key]; 
     form.appendChild(input); 
    } 
    } 
    form.style.display = 'none'; 
    document.body.appendChild(form); 
    form.submit(); 
}; 

實施例:

open('POST', 'fileServer.jsp', {request: {key:"42", cols:[2, 3, 34]}}); 

要在新窗口中打開,設置target參數:

open('POST', someURL, someArgs, 'newwin'); 

,或者確保它是一個新的窗口/選項卡每個時間:

open('POST', someURL, someArgs, '_blank'); 

很顯然,你應該給它比open,這樣你就不會影着現有的其他名稱。理想情況下,你應該命名空間。

+0

我喜歡它,它確實運行了一個帖子,但它並沒有打開一個新窗口(至少在IE 9.0.8112.16421 – corsiKa

+0

@corsiKa中,如果你設置目標參數,它會打開一個新窗口:open(' POST',url,{},'newwin')' –

+0

美麗!我做了var reportWindowName = Math.random()。toString(36).substr(2,9);'如果我多次點擊它,每個報告都會在新窗口中打開(很好,可能是:-)) – corsiKa

6

我所做的是我做了一個JavaScript AJAX帖子,然後我把我得到的內容放到一個新窗口中。

這樣的事情(使用jQuery,但是你可以使用任何AJAX實現):

$.post(URL, DATA, function(d){ 
    var new_window = window.open(); 
    $(new_window.document.body).append(d); 
}); 
+0

我應該指出,我嘗試過這一點,它的工作原理減一件事:關於水晶報告(這是我這樣做的)不會傳遞參數。不過,這可能是我實施該建議的方式。 – corsiKa

+3

我在Chrome 38版本中使用此建議代碼,並被彈出式窗口攔截器攔截! –