Подтвердить что ты не робот

Функция родительского вызова JavaScript window.opener

Я пытаюсь вызвать функцию javascript, определенную родителем из дочернего окна. У меня есть два файла:

Родитель:

<html>
<head>
<title>Test</title>
<script type="text/javascript">
function foo () {
alert ("Hello from parent!");
}
function doStuff () {
var w = window.open("testa.html");
}
</script>
</head>
<body>
<input type="button" value="open" onClick="doStuff();" />
</body>
</html>

И ребенок:

<html>
<head>
<title>Test A</title>
<script type="text/javascript">
function get() {
window.opener.foo();
}
</script>
</head>
<body>
<input type="button" value="Call Parent" onClick="get();" />
</body>
</html>

Я не могу, для жизни меня, вызвать функцию foo из дочернего процесса. Я думал, что это должно быть возможно с помощью объекта window.opener, но я не могу сделать эту работу. Любые предложения?

4b9b3361

Ответ 1

Убедитесь, что вы получаете доступ к этому через http://, поэтому проходит политика одного и того же происхождения, и вы можете получить доступ к открывающему устройству от дочернего элемента. Это не сработает, если вы просто используете файл://.

Ответ 2

Отвечая на вопрос Рахула:

Каждый браузер может загружать страницы с сервера или из локальной файловой системы. Чтобы загрузить файл из локальной файловой системы, вы должны поместить в браузер адрес, подобный этому file://[path], где [путь] - это абсолютный путь к файлу в файловой системе (включая букву диска в Windows, см. http://blogs.msdn.com/b/ie/archive/2006/12/06/file-uris-in-windows.aspx).

Чтобы загрузить файл с локального HTTP-сервера (если он у вас есть), вы должны указать для него что-то вроде http://localhost:[port]/[path], где [порт] - это порт, на котором работает ваш сервер (по умолчанию - 80), а [путь] путь к файлу относительно корневой папки документа сервера. Корневая папка документа зависит от конфигурации сервера.

Итак, как вы видите, один и тот же локальный файл может быть загружен в браузер двумя способами. Между этими двумя способами существует большая разница. В первом случае браузер не использует HTTP-протокол для загрузки файла и поэтому пропускает много вещей, необходимых для правильной работы различных механизмов. Например, AJAX не работает с локальными файлами, поскольку статус ответа HTTP не равен 200 и т.д.

В этом конкретном примере механизм безопасности браузера не получил информацию о происхождении и препятствовал доступу к родительскому окну.