You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:09:27