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 секунду пока ему удается успешно назвать.


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