Javascript, вызов функции дочернего окна из opener не работает

StackOverflow https://stackoverflow.com/questions/2117887

Вопрос

Я разрабатываю веб-приложение, которое открывает всплывающее окно с помощью 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 секунду пока ему не удастся успешно вызвать ее.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top