在iframe中创建JavaScript回调

时间:2010-11-15 04:35:22

标签: javascript iframe asp.net-ajax callback

更新:后端服务由ASP.Net AJAX Web服务代理提供支持。

1)主页面有两个全局对象,一个用于后端连接(Svc),另一个用于处理DOM(Main)。它还会将文档动态加载到iframe中。

2)这些iframe需要访问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 个答案:

答案 0 :(得分:1)

如果从main覆盖iFrame的功能,则将使用主范围。 可以看到反问题here,在你的情况下,你只是覆盖框架的函数本身,即:

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

奖金:如果你可以修改iFrame的代码,我建议:

在框架中:

  • 制作占位符函数callbackParent(){}
  • 将此函数的调用添加到您的iframe代码中,这样您就必须覆盖主要内容中的callbackParent

主要:

  • 制作应调用的函数function doStuff(){}
  • 覆盖上述document.getElementById('yourFrameID').contentWindow.callBackParent = doStuff();
  • 所述的功能

答案 1 :(得分:0)

我也使用iframe模块化我的应用程序。
它们包括为模块嵌入所有CSS,HTML和JS。

我的第一次尝试也是通过返回一个函数,但后来发现共享范围很难。 现在我直接引用iframe中的主要父对象。

例如:

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

全局var JSON和jQuery引用在这里可以在方法中使用它们。

答案 2 :(得分:0)

我的客人是Svc.method在调用之前正在进行一些检查以查看回调是否有一些标准。这个标准可能是回调函数必须由同一个框架(这里是ASP.Net)创建。你必须找到那个标准。如果“Main.createCallback”有效,那是因为它符合该标准。

答案 3 :(得分:-1)

问题是ASP.Net AJAX Web服务代理,它似乎不支持从具有内联回调函数的iframe调用Web服务。