关键词

JS实现直接运行html代码的方法

JS 实现直接运行 html 代码的方法其实比较简单,一般步骤如下:

  1. 创建一个 iframe,将需要运行的 html 代码动态插入到 iframe 中;
  2. 通过 iframe contentWindow 属性获取 iframe 文档 window 对象;
  3. 将要执行的代码放在 window.onload 回调函数中,保证代码执行在页面元素都已经加载完毕后;
  4. 在 iframe 加载完成后,执行代码即可。

下面是具体操作过程:

  1. 创建 iframe

创建一个 id 为 iframeId 的 iframe,并将其插入到当前页面中:

<!-- HTML 代码 -->
<iframe id="iframeId"></iframe>
// JavaScript 代码
var iframe = document.createElement('iframe');
iframe.id = 'iframeId';
document.body.appendChild(iframe);
  1. 插入需要运行的 html 代码

获取 iframe 的文档对象,通过 innerHTML 添加需要运行的 html 代码:

var htmlCode = '<html><head><title>测试代码</title></head><body><p>这是一个测试页面</p></body></html>';
var iframe = document.getElementById('iframeId');
var iframeDoc = iframe.contentWindow.document;
iframeDoc.open();
iframeDoc.write(htmlCode);
iframeDoc.close();
  1. 编写执行代码

通过 iframe 的 contentWindow 属性,获取 iframe 的 window 对象,并将需要执行的代码放在 window.onload 回调函数中:

var iframe = document.getElementById('iframeId');
var iframeWin = iframe.contentWindow;
iframeWin.onload = function() {
  var textNode = document.createTextNode('这是通过 JS 添加的文本节点');
  document.body.appendChild(textNode);
};
  1. 执行代码

最后,通过设置 iframe 的 src 属性来加载页面,等待 iframe 的 onload 事件触发后执行代码:

iframe.src = 'about:blank';

示例1:

下面是一个通过 JS 动态创建一个 iframe 并在其中运行代码的示例:

function runHtmlCode(htmlCode) {
  var iframe = document.createElement('iframe');
  iframe.style.display = 'none';
  document.body.appendChild(iframe);

  var iframeDoc = iframe.contentWindow.document;
  iframeDoc.open();
  iframeDoc.write(htmlCode);
  iframeDoc.close();

  var iframeWin = iframe.contentWindow;
  iframeWin.onload = function() {
    var textNode = document.createTextNode('这是通过 JS 添加的文本节点');
    document.body.appendChild(textNode);
  };

  iframe.src = 'about:blank';
}

runHtmlCode('<html><head><title>测试代码</title></head><body><p>这是一个测试页面</p></body></html>');

示例2:

下面是一个通过 AJAX 获取需要运行的 html 代码并动态创建 iframe 的示例:

function loadHtmlFile(url) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
      runHtmlCode(xhr.responseText);
    }
  };
  xhr.send();
}

function runHtmlCode(htmlCode) {
  var iframe = document.createElement('iframe');
  iframe.style.display = 'none';
  document.body.appendChild(iframe);

  var iframeDoc = iframe.contentWindow.document;
  iframeDoc.open();
  iframeDoc.write(htmlCode);
  iframeDoc.close();

  var iframeWin = iframe.contentWindow;
  iframeWin.onload = function() {
    var textNode = document.createTextNode('这是通过 JS 添加的文本节点');
    document.body.appendChild(textNode);
  };

  iframe.src = 'about:blank';
}

loadHtmlFile('test.html');

本文链接:http://task.lmcjl.com/news/11682.html

展开阅读全文