You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IE中document.write抛SCRIPT1002语法错误,Chrome等浏览器正常

解决方案

问题根源

  1. HTML实体解析错误:传入的data包含&lt;、&quot;这类HTML实体,IE执行document.write时会错误地将实体当作JS语法解析,而非还原为原始HTML字符,这就是SCRIPT1002错误指向<link>标签的核心原因。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:42:04