Firefox
浏览器测试的时候发现协议没法正常使用(开发使用的是Chrome
浏览器),查看相关代码发现iframe
中内容是在建立iframe
后,经过获取iframe
元素动态插入的。若是是用的src
属性连接的html
是能够正常显示的。Firefox
下的iframe
元素,发现iframe
的src
属性是about:blank
(1)、经过location
修改javascript
var iframe = document.createElement('iframe');
document.body.appendChild(iframe); //插入到须要的位置
iframe.contentWindow.location ='javascript:void((function() {'+ script +'})())';
复制代码
修改后,显示的内容闪烁后消失,说明很大多是这个src属性引发的。
(2)、经过原生的方法设置src
或删除src
属性html
var iframe = document.createElement('iframe');
// 首先是设置src为空,发现依旧闪烁后消失
iframe.src = ''
// 移除src,仍是闪烁后消失
iframe.removeAttrbute('src')
// 设置src为javascript:void(0),仍是闪烁消失
iframe.src = javascript:void(0)
复制代码
思考是不是本身的方向错了?
(3)、尝试更换插入元素的方法 以前使用的是获取iframe
的head
和body
元素,而后使用innerHTML
去设置元素内容。更换其余插入方法
(3.1)首先将原来的待插入的元素字符串,插入到一个新建的html
元素div
中,再使用appendChild
的方法将元素插入到iframe
中,发现结果依旧闪烁后消失;java
const iframeDom = document.getElementById('my-iframe').contentWindow.document
let tempNode = document.createElement('div');
tempNode.innerHTML = style; // style 为样式字符串
iframeDom.getElementsByTagName('head')[0].appendChild(tempNode.firstChild)
复制代码
(3.2)使用DOMParser
,依旧不显示浏览器
function createDocument(txt) {
const template = `<div class='child'>${txt}</div>`;
let doc = new DOMParser().parseFromString(template, 'text/html');
let div = doc.querySelector('.child');
return div;
}
const container = document.getElementById('container');
container.appendChild(createDocument(style));
复制代码
(3.3)使用DocumentFragment
(不行)bash
const template = `<div class='child'>${style}</div>`;
let frag = document.createRange().createContextualFragment(template);
iframeDom.getElementsByTagName('head')[0].appendChild(frag) // frag.firstChild
复制代码
Google
搜索src
的方向应该是对的,从新设置src
为'javascript:'
,再到Firefox
环境中测试,发现协议已经能够打开了。Chrome
中再去打开协议后,发现Chrome
中的协议不显示了,可是dom
元素却存在,因而我使用判断浏览器的方法navigator.userAgent.indexOf("Firefox")
复制代码
判断是否为Firefox
,若是不是就不iframe
加src='javascript:'
,至此才算真的完了。app