IE浏览器中无法显式设置document.domain的问题求助
IE浏览器document.domain修改及iframe兼容解决方案
IE对document.domain的修改有严格的安全限制:仅允许将域名修改为当前域名的上级父域名,且两个域名必须共享相同的根域名。你当前要将www.xyz.com修改为完全无关的www.abc.com,不符合IE的安全规则,因此会抛出invalid argument error,这是IE的内置安全限制,无法直接绕过。
针对你阻塞的iframe加载需求,可按以下方案适配IE:
- 替换
srcdoc实现:IE全版本均不支持srcdoc属性,这是你之前逻辑无法运行的核心原因之一,改用iframe文档流写入的方式加载内容:
var printIframe = CI_jQuery('#print-frame')[0]; var iframeDoc = printIframe.contentDocument || printIframe.contentWindow.document; iframeDoc.open(); iframeDoc.write(data); // data为你准备的iframe完整HTML内容 iframeDoc.close();
- 调整
sandbox属性的兼容逻辑:IE10及以上才部分支持sandbox属性,低版本IE完全不支持,且不支持allow-downloads等参数,如果你需要兼容低版本IE,建议去掉sandbox属性的设置,改用其他安全规则限制iframe行为。 - 跨域通信走兼容版postMessage:你之前postMessage未生效大概率是未做IE兼容,按以下逻辑调整即可:
- 仅传递字符串类型的消息,如需传递结构化数据,先调用
JSON.stringify()序列化,接收端再调用JSON.parse()解析 - 事件监听兼容IE的
attachEvent写法:
// 消息接收逻辑兼容写法 function receiveMessage(e) { // 此处添加e.origin校验逻辑,避免安全问题 var msg = JSON.parse(e.data); // 处理消息逻辑 } if (window.addEventListener) { window.addEventListener('message', receiveMessage, false); } else { window.attachEvent('onmessage', receiveMessage); } // 消息发送逻辑 printIframe.contentWindow.postMessage(JSON.stringify(yourMsg), 'https://www.abc.com'); // 第二个参数替换为实际目标域名,生产环境不要用* - 仅传递字符串类型的消息,如需传递结构化数据,先调用
内容的提问来源于stack exchange,提问作者Amaarockz
相关产品推荐
相关产品推荐

