Javascript, вызов функции дочернего окна с открывателя не работает
Я разрабатываю веб-приложение, которое открывает всплывающее окно с использованием windows.open(..). Мне нужно вызвать функцию в открывшемся окне с помощью дескриптора, возвращаемого "window.open", но я всегда получаю сообщение об ошибке "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 ();
}
}
Я искал google и читал из разных надежных источников, и, видимо, это должно работать, но это не так.
Кроме того, функции в дочернем окне объявляются в отдельном файле .js, который включен в файл adicionar_email.htm. Это имеет значение? Это не должно...
Итак, если кто-то сталкивался с подобной проблемой или имеет какое-либо представление о том, что я делаю неправильно, ответьте на это сообщение.
Заранее спасибо.
Kenia
Ответы
Ответ 1
Создание окна не является блокировкой; script продолжает выполняться, пока это окно открывается и загружает HTML и javascript и анализирует его.
Если вам нужно добавить ссылку на исходную страницу, например:
<a href="#" onclick="addWindow.getMaskElements();">Test</a>
Вы увидите, что это работает. (Я попробовал это, чтобы быть уверенным.)
** РЕДАКТИРОВАТЬ **
Кто-то еще отправил обходной путь, вызвав 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 секунду, пока ему не удастся его успешно вызвать.
Ответ 2
Проблема заключается в том, что window.open возвращается довольно быстро, запрашиваемый документ, а затем любые другие элементы, которые этот документ может впоследствии ссылаться, еще не загружены в окно.
Следовательно, попытка вызвать этот метод так рано не удастся. Вы должны приложить функцию к событию загрузки открытого окна и попытаться выполнить вызовы с этой функции.
Ответ 3
Проблема с приведенным ниже:
Когда javascript выполняется в родительском окне, дочернее окно не загружается. Следовательно, вызывающая функция из родительского окна находится в бесконечном цикле и приводит к сбою окна.
Создание окна не является блокировкой; script продолжается для выполнения, пока это окно открывает и загружает HTML & javascript и разбор его.
Если вам нужно добавить ссылку на исходную страницу, например:
<a href="#" onclick="addWindow.getMaskElements();">Test</a>
Вы увидите, что это работает. (Я попробовал это, чтобы быть уверенным.)
** РЕДАКТИРОВАТЬ **
Кто-то еще отправил обходной путь, вызвав 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 секунду пока ему не удастся его назвать.
Ответ 4
Вы вызываете функцию сразу после открытия окна; страница всплывающего окна может еще не загрузиться, поэтому функция не может быть определена в этой точке.