Проблемы с использованием window.opener - PullRequest
0 голосов
/ 14 мая 2009

У меня есть простое приложение ajax

Отсюда запускается всплывающее окно с формой.

Как у страницы результатов формы, так и у приложения ajax общий файл javascript.

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

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

Страница результатов во всплывающем окне имеет

<script type="text/javascript" src="x.js">window.opener.updateLayer("Layer3", "380118179930"); </script>

перед любым html.

В родительском окне ничего не происходит. Я также попробовал window.parent.

Какова причина и решение для / к этому?

Ответы [ 6 ]

3 голосов
/ 20 мая 2009

Я предполагаю, что это связано с этим вопросом , заданным другим пользователем, которого также называют Джош.

В своем ответе на этот вопрос я попытался объяснить, что функции из файла Javascript, включенного в ваше родительское окно, будут присоединены к объекту окна, поэтому вы используете window.opener, чтобы получить доступ к этому объекту окна и вызвать их .

Похоже, вы почти решили эту проблему, но проблема здесь в том, что, включив src="x.js" в тег сценария из ответа формы, вы фактически перезаписываете любой код, помещенный в сценарий. Кроме того, поскольку x.js включен в родительское окно, его вообще нет необходимости во всплывающем окне.

Код ответа формы должен выглядеть следующим образом:

<script type="text/javascript">
window.opener.updateLayer("Layer3", "380118179930");
</script>

Я удалил атрибут src="x.js", который в противном случае препятствовал бы выполнению кода между тегами <script></script>.

0 голосов
/ 21 мая 2009

Попробуйте следующее:

parent.window.updateLayer();

в отдельном теге <script>.

Я не совсем уверен, работает ли он одновременно с src = some.js и встроенным скриптом.

0 голосов
/ 19 мая 2009

Josh

Можете ли вы определить, запущена ли функция вообще, как предлагает Аннаката? Например. поместив окно предупреждения в первую строку функции?

В противном случае: как определяется функция updateLayer в x.js?

Если это определено так:

function updateLayer(layer, result) {
  // ...
}

... тогда все должно работать нормально.

Если оно определено следующим образом:

var updateLayer = function(layer, result) {
  // ...
}

тогда не будет быть доступным как свойство объекта window (и, следовательно, также не будет доступно как свойство window.opener). По крайней мере, в Firefox; Я не проверял это в IE или других браузерах.

Редактировать: почему этот вопрос помечен как «ajax»? AFAICS, вся проблема находится на стороне клиента приложения; никакой ajax не задействован.

0 голосов
/ 19 мая 2009

Ваша проблема может заключаться в том, что у вас есть два файла JavaScript с одинаковым содержимым, в то время как пространства имен не применяются.

Во-первых, ваш родительский файл включает файл.js, в котором определен ваш updateLayer (). Затем родитель открывает дочернее окно, которое также включает этот файл.js. Если вы сделаете это, у вас будет запущено два потока, каждый из которых может иметь свои собственные функции и объекты, не мешая другим. Я предполагаю, что ваша функция является глобальной. Это может вызвать проблемы, если пространства имен не используются. Также может случиться, что ваша большая библиотека ajax создает фреймы iframe и тому подобное, и вы ничего из этого не увидите, потому что это происходит под капотом.

Так что попробуйте: top.window.opener.updateLayer ("Layer3", "380118179930");

Если это не поможет, попробуйте открыть пустое окно без включенного файла file.js и вызвать эту функцию из средства открытия. Если это сработает, оберните содержимое этого file.js в пространство имен, например myNamespace = {.... big file content inbetween ....}, сделайте две версии этого (или лучше динамически включите содержимое) и убедитесь, что вы есть два разных пространства имен. JavaScript чаще всего работает не так, как вы думаете.

Кроме того, убедитесь, что URL для вашего открытого окна имеет точно того же домена. Это может вызвать проблемы с безопасностью, так что браузер запрещает доступ из дочернего окна к его родительскому.

0 голосов
/ 14 мая 2009

Поскольку вы дали элементу script атрибут src, результаты x.js будут проанализированы как JS, а текстовое содержимое элемента будет игнорироваться.

<script type="text/javascript" src="x.js"></script>
<script type="text/javascript">
    window.opener.updateLayer("Layer3", "380118179930");
</script>
0 голосов
/ 14 мая 2009

Создайте новую функцию updateLayer в родительском html-файле. Переименуйте его в другое и назовите оригинальный updateLayer из него. например,

function updateLayerPage(arg1, arg2)
{
    updateLayer(arg1, arg2);
}

, а затем вызвать эту новую функцию с дочерней страницы

window.opener.updateLayerPage("Layer3", "380118179930");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...