更新:后端服务由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);
}
}
答案 0 :(得分:1)
如果从main覆盖iFrame的功能,则将使用主范围。 可以看到反问题here,在你的情况下,你只是覆盖框架的函数本身,即:
document.getElementById('yourFrameID').contentWindow.targetFunctionInFrame = targetFunctionInMain;
奖金:如果你可以修改iFrame的代码,我建议:
在框架中:
callbackParent(){}
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服务。