Iframe 有什么好处,有什么坏处?

本文介绍了iframe在现代Web开发中的多种创新应用,包括实现长连接、跨域通信、历史记录管理等,同时展示了如何使用iframe进行文件上传、客户端应用调用以及创建独立宿主环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iframe原本的用法在现在看来是不合时宜的,问题太多了,不一一列举,但是它的其他功能却是不错的黑魔法,这里列举一些,想到了再更新:

  1. 用来实现长连接,在websocket不可用的时候作为一种替代,最开始由google发明。Comet:基于 HTTP 长连接的“服务器推”技术

  2. 跨域通信。JavaScript跨域总结与解决办法 ,类似的还有浏览器多页面通信,比如音乐播放器,用户如果打开了多个tab页,应该只有一个在播放。

  3. 历史记录管理,解决ajax化网站响应浏览器前进后退按钮的方案,在html5的history api不可用时作为一种替代。

  4. 纯 前端的utf8和gbk编码互转。比如在utf8页面需要生成一个gbk的encodeURIComponent字符串,可以通过页面加载一个gbk的 iframe,然后主页面与子页面通信的方式实现转换,这样就不用在页面上插入一个非常巨大的编码映射表文件了,其中子页面内容:

    <!doctype html><html>
      <head>
        <meta charset="gbk">
        <script>
          window.encoding = function(str){
            //利用a元素的href属性来encode
            var a = document.createElement("a");
            a.href = "/?q=" + str;
            var url = a.href; //这里读取的时候会自动编码
            a.href = "/?q=";
            return url.replace(a.href, "");
          };
        </script>
      </head></html>

    把这个iframe部署到父页面的同源服务上,就能在父页面直接调用iframe中的encoding接口了。

  5. 评论里有提到,用iframe实现无刷新文件上传,在FormData不可用时作为替代方案

  6. 在移动端用于从网页调起客户端应用。比如想在网页中调起支付宝,我们可以创建一个iframe,src为:

    alipayqr://platformapi/startapp?saId=10000007&clientVersion=3.7.0.0718&qrcode={支付二维码扫描的url}

    浏览器接收到这个url请求发现未知协议,会交给系统处理,系统就能调起支付宝客户端了。我们还能趁机检查一下用 户是否安装客户端:给iframe设置一个3-5秒的css3的transition过渡动画,然后监听动画完成事件,如果用户安装了客户端,那么系统会 调起,并将浏览器转入后台运行,进入后台的浏览器一般不会再执行css动画,这样,我们就能通过判断css动画执行的时长是否超过预设来判断用户是否安装 某个客户端了:

    /** * 调起客户端 * @param url {String} * @param onSuccess {Function} * @param onFail {Function} */module.exports = function(url, onSuccess, onFail){
        // 记录起始时间
        var last = Date.now();
    
        // 创建一个iframe
        var ifr = document.createElement('IFRAME');
        ifr.src = url;
        // 飘出屏幕外
        ifr.style.position = 'absolute';
        ifr.style.left = '-1000px';
        ifr.style.top = '-1000px';
        ifr.style.width = '1px';
        ifr.style.height = '1px';
        // 设置一个4秒的动画用于检查客户端是否被调起
        ifr.style.webkitTransition = 'all 4s';
        document.body.appendChild(ifr);
        setTimeout(function(){
            // 监听动画完成时间
            ifr.addEventListener('webkitTransitionEnd', function(){
                document.body.removeChild(ifr);
                if(Date.now() - last < 6000){
                    // 如果动画执行时间在预设范围内,就认为没有调起客户端
                    if(typeof onFail === 'function'){
                        onFail();
                    }
                } else if(typeof onSuccess === 'function') {
                    // 动画执行超过预设范围,认为调起成功
                    onSuccess();
                }
            }, false);
            // 启动动画
            ifr.style.left = '-10px';
        }, 0);};
  7. 创建一个全新的独立的宿主环境。经 @EtherDream 大神提醒,iframe还可以用于创建新的宿主环境,用于隔离或者访问原始接口及对象,比如有些前端安全的防范会覆盖一些原生的方法防止恶意调用,那我们就能通过创建一个iframe,然后从iframe中取回原始对象和方法来破解这种防范。类似的还有  @贺师俊 曾经提到的javascript裸对象创建中的一种方法:如何创建一个JavaScript裸对象 ,一般所见即所得编辑器也是由iframe创建的, @Dion 的回答有提到

  8. IE6下用于遮罩select。经 @yaniv 提醒想起来的。曾经在ie6时代,想搞一个模态窗口,如果窗口叠加在select元素上面,是遮不住select的,为了解决这个问题,可以通过在模态窗口元素下面垫一个iframe来实现遮罩,好坑爹的ie6,还我青春韶华~~



转载于:https://my.oschina.net/sheila/blog/389728

### DIV嵌入与iframe嵌入的主要差异 #### 差异分析 在HTML中,`<div>`标签用于定义文档中的分区或节(section),而`<iframe>`则用来创建一个内联框架,在其中可以加载另一个完整的HTML页面。两者的用途和实现方式存在显著不同。 对于`<div>`而言,其主要用于布局网页结构,通过CSS样式控制显示效果,并借助JavaScript动态修改内容[^2]。当不使用`<iframe>`时,可以通过AJAX请求获取远程数据并填充至指定的`<div>`容器内;也可以利用jQuery等库简化操作流程,例如: ```javascript $('#targetDiv').load('externalPage.html'); ``` 相比之下,`<iframe>`提供了一种更为直接的方法来展示外部资源,无需额外编写脚本来处理跨域访问等问题。设置好源URL后即可立即呈现目标站点的内容,同时支持独立滚动条等功能特性[^1]。 #### 自适应调整 为了让包含于`<div>`内的子元素能够自动适配父级尺寸变化,通常会采用相对单位如百分比设定宽度高度属性值,并配合盒模型相关参数确保内部留白合理分布。而对于`<iframe>`来说,则可通过绝对定位技术使其完全覆盖宿主区域,从而达到同步伸缩的效果。 ```css /* 对应于DIV */ #container { position: relative; } .innerContent { width: 100%; height: 100%; } ``` ```css /* 对应于IFRAME */ #iframeContainer { position: relative; width: 750px; height: 600px; } #innerFrame { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } ``` #### 各自适用场景 - **`<div>`适用于**:需要在同一域名下的多个模块间共享状态变量、事件监听器等情况;或是希望保持统一的主题风格设计而不受第三方网站影响的时候。 - **`<iframe>`更适合**:想要快速简便地引入其他服务器上的静态/动态内容片段;或者是出于安全考虑避免潜在恶意代码污染当前页面环境的情形下[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值