2013-05-22 53 views
3

我需要將當前頁面中的某些文本傳遞到彈出窗口,而不必打開服務器。這些信息(這裏用90表示)已經在父窗體中可用(它就像一段長文本,它存儲在一個隱藏的變量中)。我只需要將它顯示爲一個彈出窗口。使用Javascript將變量傳遞給彈出窗口

這是我試過的,這在一定程度上起作用,但如果我傳遞文本而不是數字,則不起作用。我的第二個擔心是解決方案看起來很醜。有小費嗎?謝謝。

這是SCCE,你可以直接在你的機器上運行它。

<html> 
<head> 
<title>A New Window</title> 

<script type="text/javascript"> 
var newWindow; 
var data; 


function makeNewWindow(param) { 
    data = param; 

    if (!newWindow || newWindow.closed) { 
     newWindow = window.open("","sub","status,height=200,width=300"); 
     setTimeout("writeToWindow()", 50); /* wait a bit to give time for the window to be created */ 
    } else if (newWindow.focus) { 
     newWindow.focus(); /* means window is already open*/ 
    } 
} 


function writeToWindow() { 
    var k = data; 
    alert(data); 
    var newContent = "<html><head><title>Additional Info</title></head>"; 
    newContent += "<body><h1>Some Additional Info</h1>"; 
    newContent += "<scr"+"ipt type='text/javascript' language='javascript'> var localVar; localVar = "+ k +"; document.write('localVar value: '+localVar);</scr"+"ipt>"; 
    newContent += "</body></html>"; 
    // write HTML to new window document 
    newWindow.document.write(newContent); 
    newWindow.document.close(); // close layout stream 
} 
</script> 
</head> 

<body> 
<form> 
<input type="button" value="Create New Window" onclick="makeNewWindow('90');" /> 
</form> 
</body> 
</html> 

其實,我用Google搜索,發現使用window.opener.document.forms.element一些其他的方法,但在這裏,窗口有提前一下,有從父看了就知道了。我需要能夠通過它,因爲它可能會有所不同:

<textarea rows="15" name="projectcontent" id="projectcontent" cols="87"></textarea> 
<a href="javascript:;" onclick="window.open('viewcon.asp', 'my_new_window','toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=yes, width=625, height=400');"><b>View Content</b></a> 

<head> 
<title>View Project Content</title> 
</head> 
<body> 
<img src="/images/toplogo.jpg"><br/> 
<script language="Javascript"> 
document.write(window.opener.document.forms['yourformname'].elements['projectcontent'].value) 
</script> 
<img src="/images/bottomlogo.jpg"> 
</body> 
</html> 
+0

這是使用'setTimeout'非常危險的方法。擺脫引號和括號! –

+0

爲什麼要使用cookies? –

+0

模態對話框如何? 'window.open'是90多歲,很多用戶由於彈出窗口攔截器而無法看到它。 – elclanrs

回答

2

使用window.opener

從Mozilla開發者網絡: 當從另一個窗口中打開一個窗口,它保持一個參考 作爲window.opener作爲第一個窗口。如果當前窗口沒有 開啓者,則此方法返回NULL。

https://developer.mozilla.org/en-US/docs/Web/API/window.opener

這樣你可以有你的原來的窗口上的回調,你可以通知它的負載和準備,而不是等待一個隨機延遲窗口...

你添加

window.popupReady = function (callbackToPopup) { 
     callbackToPopup(newData); 
    } 

然後彈出可以告訴它已經準備好父窗口,並通過它回調的數據來更新它..

:原來的窗口函數

,並在彈出的嘗試是這樣的:

window.dataReady(newData) 
{ 
    alert(newData); 
} 

document.addEventListener("load", function() { window.opener.popupReady (dataReady); } 

我沒有測試此代碼,但我會採取這樣的路徑,因爲這應確保popupWindow是爲你準備好,並沿的JavaScript精神。

+0

這個問題,它是如何告訴新窗口關於從父母讀什麼?請參閱更新的問題.. –

+0

回調man..it是Js設計的方式..我很快會編輯我的答案。 –

+0

如果你可以給一些原型運行,這個正確的答案是你的。請?!不知道回調尚未。 –

1

在您的onclick屬性中,您將'90'傳遞給該函數,但該函數未設置爲接受參數。因此,改變你的功能像這樣的第一行:

function writeToWindow(data) { 

你不需要全球var data;或本地var k = data;,所以擺脫他們。而不是+ k ++ data +

這應該會讓你的數據通過。

+0

發送直接的HTML /或超時字符串是非常糟糕的..不做它..通過數據,它是更安全.. –

+1

@DoryZidon,有很多錯誤的東西OP的代碼,但我提供了一個特定問題的具體答案,而不是一般的代碼。 –

+0

雅我也看到你的評論,我同意,如果有一個解決方案,不涉及安全風險,我將被列入建議。 –

1

使用此代碼,它適用於所有瀏覽器。

#desc = parent text area id 
#desc_textarea = popup 

$("#desc_textarea").val(window.opener.$("#desc").val()) 
相關問題