Вызов функции родительского окна из дочернего окна не работает - PullRequest
0 голосов
/ 10 июня 2018

У меня есть два HTML файла в одном каталоге:

parent.html

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<script type="text/javascript">
function open_child_window() {
    var sayHello = function(name) {
        alert('Hello ' + name + '!');
    }
    var win = window.open('child.html');
    win.onload = function() {
        win.myCallbackFunction = sayHello;
    };
}
</script>
</head>
<body>
    <a href="#" onclick="open_child_window();">Open Child Window</a>
</body>
</html>

child.html

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<script type="text/javascript">
function sayHelloParent() {
    myCallbackFunction('Susan');
}
</script>
</head>
<body>
    <a href="#" onclick="sayHelloParent();return false;">Say Hello on the Parent Window</a>
</body>
</html>

С двумя кодами выше, я нажимаю: Open Child Window в родительском окне.Затем, когда я нажимаю на ссылку: Say Hello on Parent Window в дочернем окне, я получаю предупреждение в родительском окне с соответствующим сообщением.

Теперь моя цель состоит в том, чтобы это делалось автоматически, не нажимаяссылка.

Я пробовал разные способы, такие как <body onload="..." ...> и т. д., но безуспешно.

Есть идеи, как получить эту работу?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Но вы говорите, что хотите сделать это без щелчка.Родительское окно создает дочернее окно, когда родительское окно еще не полностью загружено.Когда дочернее окно вызывает parent, родитель может быть еще не инициализирован.Чтобы убедиться, что родительский объект инициализирован, создайте дочерний элемент не из HEAD, а из тела после его загрузки.

0 голосов
/ 10 июня 2018

Проблема с вызовом обратного вызова при загрузке страницы состоит в том, что обратный вызов даже не был добавлен в дочернее окно, вы можете добавить setTimeout, чтобы немного подождать, пока функция не будет добавлена.

Этопотому что код parent.html запускается после загрузки содержимого страницы, а также после запуска кода при загрузке.

document.addEventListener('DOMContentLoaded', function() {
    setTimeout(function() {
        myCallbackFunction('Susan');
    }, 10)
});

Я использовал функцию addEventListener вместо onLoad, они должны иметь такую ​​же функциональность

0 голосов
/ 10 июня 2018

Когда дочернее окно вызывает функцию, родительский объект может быть еще не инициализирован.

Вот почему вы должны поместить обе функции в onLoad в их окнах, а нетолько в дочернем окне.

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