当调用框架(和执行上下文)消失时处理回调
Handle a callback when the calling frame (and execution context) has disappeared
让我们假设你有两个框架,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. framload并带回调。在回调运行之前,iframe src被更改为www.google.com,从而破坏回调的执行上下文。回调函数运行并创建一个错误。
在尝试执行回调之前,我们如何检查回调(或者调用函数)的执行上下文?
(忽略格式化,全局变量的使用,jquery会比文档更好地处理它的事实。getElementById等等。这只是一个测试)
我不知道如何检查执行上下文是否消失,但我想到的两个变通方法是:
-
将回调调用放在try/catch中,忽略任何异常。
-
将回调函数定义在与
frameLoad
函数相同的帧中,因此从iframe中对frameLoad
的调用将看起来像这样:top.frameLoad(top.someCallbackFunction);
如果你知道frameLoad
函数的全部要点是替换定义回调的iframe的内容,那么为什么要使用回调呢?任何重要的回调都想要与原始内容交互,不是吗?您是否可以通过在最初位于iframe内的文档中定义onunload
来实现类似的目标?
当我建议一个try/catch时,我的意思是在你的父文档脚本中像这样:
var frameLoad = function(cb) {
// kill the frame and then callback
document.getElementById("iframe").src = "http://www.google.com";
try {
cb();
} catch(e) {
// callback didn't work; do something if necessary
}
};
您也可以尝试if (cb != undefined) cb();
或类似的
- 可以't让我的if语句处理js中的html表单输入
- keyup事件处理程序更改焦点不适用于快速键入
- 如何使用jquery处理php循环通过元素
- angular.js没有'无法在PhoneGap中处理视图标记
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- facebook”;添加评论“;popup获胜'不要消失
- 提示使用服务器端事件处理程序激活JavaScript
- javascript:如何在antlr生成的Lexer中进行错误处理
- 如何编写一个具有公共标头的批处理
- 为什么js事件消失了
- 在同一个服务工作者中处理service-worker.js有任何影响吗
- 如何处理node.js节点mongodb中的连接和查询队列
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- 如何处理10页以上的静态页眉/页脚
- 将事件处理程序绑定到任何可能的事件
- 元素在使用 jQuery 对相对包装宽度进行动画处理时消失
- 某些全局(类)变量在 JavaScript 中消失了?(照片处理)
- 为什么当我对其父元素进行动画处理时,我的 UL 消失了
- 确定事件处理程序在DOM元素上消失的原因
- 当调用框架(和执行上下文)消失时处理回调