【发布时间】:2011-08-17 22:55:57
【问题描述】:
假设您有两个框架,A 和 B(或一个带有 iframe 的页面)。 A 中有一个函数foo(),它在完成时调用回调。 B 中的脚本从 A 调用 foo(),但在它完成之前(并从 B 调用回调),B 的 src 被完全替换,因此回调不再具有执行上下文。在大多数浏览器中,这会产生某种错误。
有什么方法可以检测到回调来自不再具有执行上下文的运行时,因此不应被调用?
这是包装页:
<html>
<head>
<script>
var load = function() {
document.getElementById("link").onclick = function(){
document.getElementById("iframe").src = "test-exec-context-frame-src.html";
return(false);
};
};
var frameLoad = function(cb) {
// kill the frame and then callback
document.getElementById("iframe").src = "http://www.google.com";
cb();
};
</script>
</head>
<body onload="load();">
<div>This is the first div, click <a id="link" href="#">here</a> to start</div>
<iframe id="iframe"></iframe>
</body>
这里是 iframe src 页面:
<html>
<head>
<script>
var load2 = function() {
document.getElementById("link").onclick = function(){
top.frameLoad(function(){
console.log("I am done");
});
};
};
</script>
</head>
<body onload="load2();">
<div>This is the internal frame. Click <a href="#" id="link">here</a> to force the callback.</div>
</body>
点击第一个页面中的链接,iframe 加载第二个源页面。单击第二页中的链接,它会通过回调调用 top.frameLoad。在运行回调之前,iframe src 被更改为 www.google.com,从而破坏了回调的执行上下文。回调运行并产生错误。
在尝试执行回调之前,我们如何检查回调的执行上下文 - 或者可能是调用函数的执行上下文?
(忽略格式、全局变量的使用、jquery 比 document.getElementById 处理得更好等事实。这只是一个测试。)
【问题讨论】:
标签: javascript callback scope frames