Javascript:访问 iframe 内容时出现无法理解的行为

Javascript: Incomprehensible behavior when acessing iframe content

我有以下 html 代码:

<pre id="js-code"><iframe src="sass/main.sass.html" frameborder="0" id="c-frame"></iframe></pre>

... 和 js:

document.addEventListener('DOMContentLoaded', function(){

  var code = window.frames[0].document.body.innerHTML;
  alert(window.frames[0].document.body.innerHTML);

  alert(document.getElementById("c-frame").contentDocument.body.innerHTML);
  alert(document.getElementById("c-frame").contentDocument.body.innerHTML.indexOf('\n'));
  document.getElementById("c-frame").contentDocument.body.innerHTML = document.getElementById("c-frame").contentDocument.body.innerHTML.replace(/\n/g, '<br>');


});

我想获取 iframe 内容并将 '\n' 替换为
。但是当 运行 这个时候我看到了难以理解的行为:
- html 页面上显示的(Chrome、Opera、Firefox)内容。
- (Chrome, Opera) 警报 1: '';警报 2:'';警报 3:“-1”;替换无效;
- (Firefox 64.0) 警报 1: '';警报 2:'';警报 3:“28”;替换工作;
注意:在 Firefox 运行 中使用此代码:

  document.addEventListener('DOMContentLoaded', function(){

  alert(document.getElementById("c-frame").contentDocument.body.innerHTML.indexOf('\n'));
  document.getElementById("c-frame").contentDocument.body.innerHTML = document.getElementById("c-frame").contentDocument.body.innerHTML.replace(/\n/g, '<br>');


});

导致警报结果为“-1”,但替换有效。

此代码在浏览器中作为本地文件 运行 进行了测试,并在浏览器同步和远程服务器上进行了测试 - 结果相似。

主页中的 DOMContentLoaded 事件在加载 iframe 之前触发。您应该使用 iframe 的 DOMContentLoaded 事件。

document.addEventListener('DOMContentLoaded', function(){
    var iframe = document.getElementById("c-frame").contentDocument;
    iframe.addEventListener('DOMContentLoaded', function() {
        this.body.innerHTML = this.body.innerHTML.replace(/\n/g, "<br>");
    });
});

但是,我想知道这个替换操作。只要内容在 HTML 元素之间有换行符,而不仅仅是在它们的文本中,这将添加一个 <br>。其中一些可能在无效的地方,例如

<table>
<tr>
<td>Cell contents</td>
</tr>
</table>

将变为:

<table><br><tr><br><td>Cell contents</td><br></tr><br></table>

如果您有任何 HTML 元素跨行拆分,它将把 <br> 放在里面:

<input type="text"
       name="foo">

会变成

<input type="text" <br> name="foo">

我找到了使用 ajax 且不使用 iframe 来加载我需要的文件的替代方法。也许对某些人来说它可能有用。这样就不需要用 '
' 替换 '\n' - 内容显示正确。 HTML代码:

<pre id="js-code"></pre>

JS代码:

function loadFile(file) {

  var xhttp = new XMLHttpRequest();

  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {

      var codeHolder = document.getElementById("js-code");          
      codeHolder.innerHTML = this.responseText;          
    }        
  };

  xhttp.open("GET", file, true);
  xhttp.send();
}

document.addEventListener('DOMContentLoaded', function(){
   loadFile("sass/main.sass.html");
});