3

我需要将一些文本从当前页面传递到弹出窗口,而不需要访问服务器。信息(这里用 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>

实际上,我用谷歌搜索并看到了其他一些使用 的方法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>
4

3 回答 3

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 的精神。

于 2013-05-22T00:57:13.900 回答
1

Use this code, it works perfectly in all browsers .

#desc = parent text area id
#desc_textarea = popup 

$("#desc_textarea").val(window.opener.$("#desc").val())
于 2013-06-28T23:43:37.560 回答
1

在您的onclick属性中,您将“90”传递给函数,但该函数未设置为接受参数。因此,像这样更改函数的第一行:

function writeToWindow(data) {

你不需要 globalvar data;或 local var k = data;,所以摆脱它们。

而不是+ k +write + data +

那应该可以让您的数据通过。

于 2013-05-22T00:57:24.200 回答