outerHTML 数据不完整

Posted

技术标签:

【中文标题】outerHTML 数据不完整【英文标题】:outerHTML data is not complete 【发布时间】:2016-11-18 15:27:20 【问题描述】:

HTML:

<div id="WholeNew">
    <script>func2()</script>
    <img src="x" onerror=func1() />
</div>

JS:

function func1()

    console.log(arguments.callee.caller.arguments[0].target.parentNode.outerhtml);


function func2()

    console.log(document.currentScript.parentNode.outerHTML);

现在查看控制台中的输出:

对于 func1():

<div id="WholeNew">
    <script>func2()</script>
    <img src="x" onerror=func1() />
</div>

对于 func2():

<div id="WholeNew">
    <script>func2()</script>
</div>

为什么两个输出存在差异,因为 document.callee.caller.arguments[0].targetfunc1() document.currentScript.parentNodefunc2() 中的元素是相同的 &lt;div&gt;?我需要来自func2()&lt;div&gt; 的完整outerHTML。

【问题讨论】:

您使用的是哪个浏览器?由于错误,我无法在 IE11 或 Chrome51 中复制该问题。可能与该被调用者已弃用有关。不是迂腐,而是你试图用这段代码解决的问题是什么,因为这看起来不像是最好的设计恕我直言。 我可以在 Chrome 51 和 Firefox 47 中成功运行代码。由于使用了target,IE 无法运行。使用srcElement。你得到什么错误?我只是在试验这种特定的代码行为。 根据我放置函数定义的位置,我得到调用者或被调用者未定义。您将包含函数的脚本放置在什么位置?您是否使用实际的图片网址尝试过此操作?也许 src 是 'x' 搞砸了。 我用arguments.callee.caller.arguments[0].target.parentNode.outerHTML 替换了document.callee.caller.arguments[0].target.outerHTML,现在我复制了您遇到的问题。我找不到任何关于 document.callee 的文档。无论如何,既然我看到了这个问题,就看看为什么 outerHTML 有所不同。 好的。由于您在解析 DOM 时立即触发 func2() ,因此 DOM 仍在加载。当我从地方切换 script 标签和 img 标签时,两者 fn 给出相同的结果。 (包括 img 标签)所以我正在考虑 img 标签在加载时不会出现在 DOM 中的方向。 【参考方案1】:

问题是当请求document.currentScript.parentNode 时,文档还没有准备好。尝试在DOMContentLoaded 上检索outerHTML

function func2()

    currentScriptReference = document.currentScript;
    document.addEventListener('DOMContentLoaded', function()
      console.log(currentScriptReference.parentNode.outerHTML);
    , false);

工作人员:https://plnkr.co/edit/koZ1xDlpFacm7r9uY8lC?p=preview

控制台日志结果:

<div id="WholeNew">
    <script>func2()</script>
    <img src="x">
</div>

【讨论】:

以上是关于outerHTML 数据不完整的主要内容,如果未能解决你的问题,请参考以下文章

jQuery outerHTML 关闭标签

如何在不使用outerHTML的情况下在javascript中将标签作为文本? [复制]

jquery 获取 outerHtml

outerHTML.search(/\> *\</) ;// 在 outerHTML 上的正则表达式搜索有时会产生“错误”索引

SVG 元素的 outerHTML

innerHTML和outerHTML有什么区别