Подтвердить что ты не робот

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

4b9b3361

Ответ 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

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