Создание обратного вызова JavaScript в iframe - PullRequest
0 голосов
/ 15 ноября 2010

ОБНОВЛЕНИЕ: Внутренняя служба работала на прокси-сервере веб-службы ASP.Net AJAX.

1) На главной странице есть два глобальных объекта: один для внутренних подключений (Svc), а другой для обработки DOM (Main). Он также динамически загружает документы в iframe.

2) Этим фреймам необходим доступ к сервисам, предоставляемым Svc, а также функция обратного вызова.

3) Проблема - передача функции, созданной в iframe, в родительский фрейм, она рассматривается как объект, а не функция и не может быть вызвана.

Может кто-нибудь предложить лучшее решение, чем то, что у меня есть в iframe:

var Main = parent.Main,
    Svc = parent.Svc;

Svc.method(data, Main.createCallback(
    function(response) {}
));

и в родительском фрейме:

Main.createCallback = function(func) {
    return function() {
        func.apply(func, arguments);
    }
}

Ответы [ 4 ]

1 голос
/ 18 января 2011

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

document.getElementById('yourFrameID').contentWindow.targetFunctionInFrame = targetFunctionInMain;

Bonus :если вы можете изменить код iFrame, я бы предложил:

В кадре:

  • сделать функцию-заполнитель callbackParent(){}
  • добавить вызов к этомуфункция в вашем коде iframe, так что вам просто нужно переопределить callbackParent из вашего основного.

В основном:

  • сделать функцию, которая должна быть вызванаfunction doStuff(){}
  • переопределить функцию, как описано выше document.getElementById('yourFrameID').contentWindow.callBackParent = doStuff();
0 голосов
/ 03 августа 2012

Мой гость в том, что Svc.method делает некоторые проверки, чтобы увидеть, есть ли у обратного вызова некоторые критерии, прежде чем вызывать его. Этот критерий может заключаться в том, что функция обратного вызова должна создаваться той же платформой (здесь это ASP.Net). Вы должны найти, что это за критерии. если «Main.createCallback» работает, то это потому, что он соответствует этим критериям.

0 голосов
/ 23 ноября 2010

Проблема в том, что прокси-серверы ASP.Net AJAX Web Service не поддерживают вызов веб-службы из iframe со встроенной функцией обратного вызова.

0 голосов
/ 15 ноября 2010

Я также использую iframes для модуляции своего приложения.
Они являются своего рода включением всех CSS, HTML и JS для модуля.

Моими первыми попытками было также вернуть функцию, но потом я обнаружил, что делить области видимости довольно сложно. Теперь я делаю прямую ссылку на основной родительский объект в iframe.

например:

var Svc = parent.Svc, JSON = parent.JSON, $ = parent.$;
Svc.module1 = {
  method1:function(arg){
    ...
  },
  ...
}

Здесь есть глобальные ссылки на JSON и jQuery, чтобы они были доступны внутри методов.

...