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