🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 前言 > 大家都知道这个地方都会有内存泄漏的时候,那么怎么做才是最好的。将src设置为 about:blank 。 ``` <iframe name="contentFrame" id="g_iframe" class="g-iframe" scrolling="auto" frameborder="0" src="about:blank" allowfullscreen="true"></iframe> ``` ### 问题 > 那么问题就来了,不使用src添加地址,怎么渲染数据了?使获取 iframe dom window对象,进行渲染进去吗?确实是这个思路。进行做了一些操作渲染方法 #### ~~【不能使用】使用 innerHTML~~ > 此方案不通,通过ajax请求,将dom都获取到了,然后在插入 iframe里面: - 能够将之前的内容替换掉 - 里面的添加的在当前html中脚本不执行(这个就是巨大问题了) ```js $.ajax({ url: 'xxxxxxxxxxx', success(html) { var doc = iframe.contentDocument || iframe.contentWindow.document; doc.documentElement.querySelector('body').innerHTML = html // doc.documentElement.innerHTML = html } }) ``` #### ~~【不能使用】使用 document.write()~~ > 此方案不通。缺点: - window对象中的 onload、onerror等事件都为null。造成jquery的 $(function () {}) - 如果在执行 document.write() 方法的话,之前的数据还是保留了下来。 ```js $.ajax({ url: 'xxxxxxxxxxx', success(html) { var doc = iframe.contentDocument || iframe.contentWindow.document; // doc.documentElement.body.write(html) doc.write(html) } }) ``` #### 【能使用】 使用 location.replace(url) > 此方案是能解决问题,但是不能使用 location.replace(true) 。缺点: - 每次都会进行加载新的dom,解决方案:(需要什么模块,通过组页面进行请求,然后在回调,挂在到子对象上。那么这样得封装下模块请求方法了) ``` var doc = iframe.contentDocument || iframe.contentWindow.document; doc.location.replace(url) ``` - 在子页面,最后做一个判断是否是嵌入到当前的域名下的。