Javascript, вызов функции дочернего окна из opener не работает
Я разрабатываю веб-приложение, которое открывает всплывающее окно с помощью Windows.открытый.(.). Мне нужно вызвать функцию, в открывшемся окне, используя дескриптор, возвращенный окна".открыть", но я всегда получаю сообщение об ошибке "addWindow.getMaskElements не является функцией", как будто он не может получить доступ к функции, объявленной в дочернем окне. Это поведение как в IE, так и в FF. Мой код выглядит так:
function AddEmail(target,category)
{
if(addWindow == null)
{
currentCategory = category;
var left = getDialogPos(400,220)[0];
var top = getDialogPos(400,220)[1];
addWindow = window.open("adicionar_email.htm",null,"height=220px, width=400px, status=no, resizable=no");
addWindow.moveTo(left,top);
addWindow.getMaskElements ();
}
}
я гуглил и читал из разных надежных источников и, по-видимому, это должен работать, но не работает. Еще одна вещь, функции в дочернем окне объявляются в отдельном .JS-файл, который включен в adicionar_email.файл htm. Разве это имеет значение? Не должно.. Итак, если кто-то столкнулся с подобной проблемой или имеет представление о том, что я делаю неправильно, пожалуйста, ответьте на это сообщение. Спасибо заранее.
Кения
4 ответов
создание окна не является блокирующей операцией; сценарий продолжает выполняться, пока это окно открывается и загружает HTML & javascript и анализирует его.
Если вы были, чтобы добавить ссылку на исходную страницу, как это:
<a href="#" onclick="addWindow.getMaskElements();">Test</a>
вы увидите, что это работает. (Я попробовал на всякий случай.)
* * EDIT**
кто-то еще опубликовал обходной путь, вызвав onload в целевом документе, вот еще подход:
function AddEmail()
{
if(addWindow == null) {
addWindow = window.open("test2.html",null,"height=220px, width=400px, status=no, resizable=no");
}
if(!addWindow.myRemoteFunction) {
setTimeout(AddEmail,1000);
} else { addWindow.myRemoteFunction(); }
}
Это продолжает пытаться вызвать addWindow.myRemoteFunction каждые 1 секунду, пока ему не удастся успешно вызвать его.
проблема в этом окне.open возвращает довольно быстро, документ, который запрашивается, а затем любые другие элементы, на которые этот документ может впоследствии ссылаться, еще не будут загружены в окно.
следовательно, попытка вызвать этот метод так рано не удастся. Вы должны прикрепить функцию к событию load открытого окна и попытаться выполнить вызовы из этой функции.
проблема с нижеприведенным:
когда javascript выполняется в Родительском окне, дочернее окно не загружается. Следовательно, вызывающая функция из родительского окна находится в бесконечном цикле, и это приводит к сбою окна.
создание окна не является блокирующей операцией; сценарий продолжается чтобы выполнить, пока это окно открывается и загружает HTML & javascript и его синтаксический анализ.
Если бы вы добавьте ссылку на исходную страницу следующим образом:
<a href="#" onclick="addWindow.getMaskElements();">Test</a>
вы увидите, что это работает. (Я попробовал на всякий случай.)
* * EDIT**
кто-то еще опубликовал обходной путь, вызвав onload в цели документ, вот еще один подход:
function AddEmail() { if(addWindow == null) { addWindow = window.open("test2.html",null,"height=220px, width=400px, status=no, resizable=no"); } if(!addWindow.myRemoteFunction) { setTimeout(AddEmail,1000); } else { addWindow.myRemoteFunction(); } }
Это продолжает пытаться вызвать addWindow.myRemoteFunction каждые 1 секунду пока ему удается успешно назвать.
вы вызываете функцию сразу после открытия окна; страница во всплывающем окне может быть еще не загружена, поэтому функция не может быть определена в этот момент.