当使用window.open将数据从父级传递到子级时,为什么我会得到'无法读取属性'元素'的未定

When passing data from parent to child with window.open, why do I get 'Cannot read property 'elements' of undefined'?

本文关键字:元素 读取 属性 数据 open window 为什么      更新时间:2023-09-26

请耐心听我说,我是Javascript的新手。

这是我的父脚本:

var title = document.title;
var url = window.location.href;
var popForm;
function get_elements() {
    formObject = popForm.document.forms["link_form"];
    formObject.elements["id_title"].value = title;
    formObject.elements["id_url"].value = url;
    }
function bookmark() {
    popForm = window.open("form.html","aWindow","height=500,width=400");
    popForm.window.onload=get_elements()
    }

我的孩子只是看起来像这样:

Title:</br>     
<input id="id_title" type="text" name="title" maxlength="50" />
</p>
Description:</br>
<textarea id="id_descrip" rows="10" cols="40" name="descrip"></textarea>
</p>
Url: <input id="id_url" type="text" name="url" maxlength="100" />
</p>
<input type="submit" value="Submit" />

我正在尝试创建一个小的"共享"书签,但无法将数据从父文档传递到弹出窗口的元素。Chrome控制台中的错误为Uncaught TypeError: Cannot read property 'elements' of undefined

我错过了什么?!

popForm.window.onload=get_elements();

^这是在执行get_elements,而不是将其分配给onload事件。

popForm.window.onload=get_elements;

^这就是您将函数分配给onload处理程序的方式,但这是您在文档头中要做的事情,而不是您试图做的事情

popForm = window.open("form.html","aWindow","height=500,width=400");
popForm.window.onload = get_elements;

^在这个代码中,您有一个竞赛条件。在某些情况下,popForm.window将在执行第二行之前由第一行加载。onload事件只会激发一次,所以如果在它激发之前不分配处理程序,第二行就没用了。在其他情况下,当第2行执行时,popForm.window甚至还不存在,因此无法将函数分配给onload事件处理程序。

如果您可以控制子窗口中的内容,则处理这种情况的正常方法是将以下代码放入子窗口中:

formObject = document.forms["link_form"];
formObject.elements["id_title"].value = window.opener.title;
formObject.elements["id_url"].value = window.opener.url;

如果您无法控制子窗口的内容,则需要等待iframe中的文档完全加载。除了不断检查之外,没有办法从父母那里知道这一点。使用如下代码。

popForm = window.open("form.html","aWindow","height=500,width=400");
function waitForChild() {
    if (! popForm.window ) setTimeout(waitForChild, 1000);
    else get_elements();
}
waitForChild();

传递函数意味着调用它:

popForm.window.onload = get_elements; // no parens

目前您正在调用函数并分配返回值(undefined)。CCD_ 6此时尚未加载,因此CCD_。