При передаче данных от родителя к потомку с помощью window.open, почему я получаю 'Не удается прочитать свойства' элементов 'из неопределенного'? - PullRequest
2 голосов
/ 29 февраля 2012

Терпите меня, я новичок в 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" />

Я пытаюсь создать небольшой букмарклет 'share', но не могу передать данные из родительского документа в элементы всплывающего окна. Ошибка в консоли Chrome Uncaught TypeError: Cannot read property 'elements' of undefined

Чего мне не хватает?!

Ответы [ 2 ]

1 голос
/ 01 марта 2012
popForm.window.onload=get_elements();

^ Это выполняет get_elements, а не присваивает его событию onload.

popForm.window.onload=get_elements;

^ Это то, как вы назначаете функцию обработчику загрузки, но это то, что вы должны делать в заголовке документа, а не так, как пытаетесь.

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

^ В этом коде у вас есть условие гонки.В некоторых случаях popForm.window будет загружен 1-й строкой перед выполнением 2-й строки.Событие onload сработает только один раз, поэтому, если вы не назначите обработчик до его запуска, вторая строка бесполезна.В других случаях popForm.window даже не будет существовать при выполнении 2-й строки, что делает невозможным присвоение функции обработчику события 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();
0 голосов
/ 29 февраля 2012

Передача функции означает , а не ее вызов:

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

В настоящее время вы вызываете функцию и присваиваете возвращаемое значение (undefined). popForm не был загружен в то время, поэтому popForm.document.forms пусто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...