IE中document.write抛SCRIPT1002语法错误,Chrome等浏览器正常
解决方案
问题根源
- HTML实体解析错误:传入的
data包含<、"这类HTML实体,IE执行document.write时会错误地将实体当作JS语法解析,而非还原为原始HTML字符,这就是SCRIPT1002错误指向<link>标签的核心原因。 - eval/execScript兼容性问题:伴随的SCRIPT257错误是IE下执行转义后JS代码的典型问题,本质是转义后的字符串无法被
eval正确解析。
具体修复步骤
1. 先解码HTML实体
处理data前必须将所有HTML实体还原为原始字符,避免IE解析混乱:
function decodeHtmlEntities(str) { const textArea = document.createElement('textarea'); textArea.innerHTML = str; return textArea.value; }
2. 替换document.write为标准DOM操作(推荐)
IE对document.write兼容性极差,改用innerHTML结合手动执行脚本的方式,既避免解析错误,又能完整加载内容:
/** * 创建并配置iframe以访问终端 * @param {String} data 传入的HTML字符串 * @param {String} rootURL 替换旧地址的URL */ function initIframe(data, rootURL) { if (!data || !rootURL) return; // 解码HTML实体 const decodedData = decodeHtmlEntities(data); // 插入base标签(移除IE特有的闭合标签,遵循HTML5标准) const regex = /(<head>)/gi; const baseURL = "$1\n\t\t<base href=\"" + rootURL + "/\" />"; const updatedData = decodedData.replace(regex, baseURL); const iframe = document.getElementById("vtIFrame"); const iframeDoc = iframe.contentDocument || iframe.contentWindow.document; try { // 清空iframe现有内容 iframeDoc.open(); iframeDoc.close(); // 设置完整HTML内容 iframeDoc.documentElement.innerHTML = updatedData; // 手动执行页面中的脚本(innerHTML不会自动执行脚本) executeIframeScripts(iframeDoc); } catch (e) { console.error("IFrame加载失败:", e); console.log("建议使用Chrome并添加启动参数: --args --user-data-dir=\"/tmp/chrome_dev_test\" --disable-web-security"); } } // 提取并执行iframe中的脚本 function executeIframeScripts(doc) { const scripts = doc.querySelectorAll('script'); for (let i = 0; i < scripts.length; i++) { const script = doc.createElement('script'); script.type = scripts[i].type || 'text/javascript'; // 处理外部脚本和内联脚本 if (scripts[i].src) { script.src = scripts[i].src; } else { script.textContent = scripts[i].textContent; } doc.head.appendChild(script); // 移除原脚本标签避免重复执行 scripts[i].remove(); } }
3. 备选方案:使用Blob URL加载(解决跨域+IE10+兼容)
如果上述方法仍有问题,用Blob生成可直接访问的URL,彻底绕开document.write的解析逻辑:
function initIframe(data, rootURL) { if (!data || !rootURL) return; const decodedData = decodeHtmlEntities(data); const regex = /(<head>)/gi; const baseURL = "$1\n\t\t<base href=\"" + rootURL + "/\" />"; const updatedData = decodedData.replace(regex, baseURL); const iframe = document.getElementById("vtIFrame"); // 创建HTML Blob const blob = new Blob([updatedData], { type: 'text/html' }); const blobUrl = window.URL.createObjectURL(blob); // 设置iframe src iframe.src = blobUrl; // 加载完成后释放Blob URL,避免内存泄漏 iframe.onload = () => { window.URL.revokeObjectURL(blobUrl); }; }
关键注意事项
- 移除代码中IE特有的
<!--[if IE]></base><![endif]-->,HTML5中<base>是自闭合标签,IE10+已支持标准语法。 - 避免使用
eval或execScript执行转义后的代码,改用DOM方法注入脚本。 - 确保
<base>标签的href路径正确,否则外部资源(如css、js)会加载失败。
内容的提问来源于stack exchange,提问作者Rohit Banerjee
相关产品推荐
相关产品推荐

