Javascript, вызов дочерней оконной функции из новичка не работает - PullRequest
13 голосов
/ 22 января 2010

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

Ответы [ 4 ]

11 голосов
/ 22 января 2010

Создание окна не является операцией блокировки; скрипт продолжает выполняться, пока это окно открывается, загружает 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 секунду, пока ей не удастся успешно вызвать его.

5 голосов
/ 22 января 2010

Проблема в том, что window.open возвращает довольно быстро, запрашиваемый документ, а затем любые другие элементы, на которые впоследствии может ссылаться этот документ, еще не загружены в окно.

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

3 голосов
/ 13 декабря 2016

Проблема с приведенным ниже:

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

Создание окна не является операцией блокировки; сценарий продолжается выполнить во время открытия и загрузки этого окна 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 секунду пока это удастся успешно назвать это.

1 голос
/ 22 января 2010

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

...