我需要将一些文本从当前页面传递到弹出窗口而不需要服务器命中。信息(此处由90表示)已经在父表格中可用(它类似于存储在隐藏变量中的段落长文本)。我只需将其显示为弹出窗口。
这是我尝试过的,这在某种程度上起作用,但如果我传递文字而不是数字则不起作用。我的第二个问题是解决方案有点难看。有小费吗?谢谢。
这是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 :(得分:2)
使用window.opener
来自Mozilla开发者网络: 从另一个窗口打开窗口时,它会保留一个引用 到window.opener的第一个窗口。如果当前窗口没有 在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的精神。
答案 1 :(得分:1)
在onclick
属性中,您将'90'传递给函数,但该函数未设置为参数。所以,改变你的函数的第一行:
function writeToWindow(data) {
您不需要全局var data;
或本地var k = data;
,因此请删除它们。
而不是+ k +
写+ data +
。
这应该可以让您的数据通过。
答案 2 :(得分:1)
使用此代码,它可以在所有浏览器中完美运行。
#desc = parent text area id
#desc_textarea = popup
$("#desc_textarea").val(window.opener.$("#desc").val())