如何在Ext.Window组件内的iframe中设置JavaScript超时?
给嵌入PDF的iframe添加超时处理方案
要给这个iframe设置1秒超时,我们没法直接用iframe的ontimeout(这个属性其实是针对XMLHttpRequest的),但可以通过JavaScript的setTimeout结合iframe的加载状态来实现。核心思路是:启动一个1秒的定时器,若iframe在1秒内没加载完成,就终止它的请求并销毁窗口;如果加载成功了,就清除这个定时器。
下面是修改后的完整代码:
function handlePdfRequest(value) { let timeoutTimer; // 定义超时定时器变量 var win = new Ext.Window({ id: 'window', width: 290, height: 440, shim: false, hidden: true, closeAction: 'destroy', waitMsg: "fetching", html: `<iframe style="width:100%; height:100%;" src="/index.php/abc/xyz?value=${value}" onload=" // 加载成功后清除超时定时器 clearTimeout(window.timeoutTimer); this.contentWindow.print(); // 直接销毁ExtJS窗口替代contentWindow.close(跨源时后者可能失效) Ext.getCmp('window').destroy(); "/>` }); win.show(); win.hide(); // 保留你原有的后台加载逻辑,不需要可移除 // 启动1秒超时定时器 timeoutTimer = setTimeout(() => { // 终止iframe的请求 const iframe = win.getEl().down('iframe').dom; iframe.src = 'about:blank'; // 销毁窗口释放资源 win.destroy(); // 可选:添加超时提示 // Ext.MessageBox.alert('提示', '请求超时,请稍后重试'); }, 1000); // 将定时器挂载到全局,让iframe的onload能访问到 window.timeoutTimer = timeoutTimer; }
关键细节说明:
- 定时器的清除逻辑:必须在iframe的
onload事件里调用clearTimeout,否则即使加载成功,定时器到点还是会执行销毁操作。 - 终止请求的方式:设置
iframe.src = 'about:blank'可以立即中断当前的请求,避免浏览器持续等待响应。 - 窗口销毁:超时后直接销毁ExtJS的Window组件,既终止了iframe的加载,也能避免内存泄漏。
- 跨源兼容:如果你的iframe页面和主页面不同源,
contentWindow.close()会被浏览器安全策略阻止,直接销毁ExtJS窗口是更可靠的收尾方式。
内容的提问来源于stack exchange,提问作者Nagarajan Shanmuganathan
相关产品推荐
相关产品推荐

