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

发布于 2021-11-06 14:55:55 字数 3329 浏览 1155 评论 0

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

实现长连接和服务端推技术

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

跨域通信

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

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

纯前端的 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 接口了。

无刷新文件上传

在 FormData 不可用时作为替代方案

移动端从网页调起客户端应用

比如想在网页中调起支付宝,我们可以创建一个 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);
};

创建一个全新的独立的宿主环境

iframe 还可以用于创建新的宿主环境,用于隔离或者访问原始接口及对象,比如有些前端安全的防范会覆盖一些原生的方法防止恶意调用,那我们就能通过创建一个 iframe,然后从iframe中取回原始对象和方法来破解这种防范。类似的还有 JavaScript 裸对象创建中的一种方法:如何创建一个JavaScript裸对象 ,一般所见即所得编辑器也是由 iframe 创建的。

IE6下用于遮罩select

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
366 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文