gpt4 book ai didi

javascript - 如何确定调用脚本元素?

转载 作者:行者123 更新时间:2023-12-03 03:33:24 25 4
gpt4 key购买 nike

我手头的任务是创建一个代理 document.write() 以使此功能在 XHTML 下可用。通常,此函数无法避免 XHTML 被写入文档的无意义数据破坏,但在某些情况下,可以使用 JavaScript 来模拟此函数,即获取字符串并解析它以创建 DOM可以插入到现有文档中的树。但是,为了找到插入这个新创建的树的位置,我必须在文档中找到调用脚本节点的位置。

将函数附加到文档节点不是问题,因为在 XHTML 下它是可扩展的,并且解析输入字符串也不是问题。如果遇到错误,它们会记录到控制台,并引发异常。

考虑从外部文件加载 document.write 的精简版本:

document.write = function (p_arg)
{
// X

// Do something with p_arg here
};

由于该函数应该从文档正文中的任何位置调用,因此我必须在位置 X 插入什么来找出对该函数的调用来自何处(即调用该调用的脚本节点)?

需要考虑以下标准:

  • 正在使用 XHTML,因此没有可用的 document.write。
  • innerHTML 也不是一个选项,因为它也会破坏 XHTML 的一致性。
  • scriptlet 的父节点可以具有任意 ID(包括根本没有 ID)。
  • 脚本节点不应有 ID(原始 document.write 也不必依赖该 ID)。
  • 不应使用辅助元素来查找 JavaScript 的位置。
  • 不能选择 jQuery 和其他库。

我希望尽可能接近原始 document.write,除非 XHTML 固有的限制适用,以允许使用依赖于该函数的预先存在的代码。

现在,我如何找到插入此函数生成的 DOM 树的位置(该位置将位于 JavaScript 后面的节点之前,或者如果不存在后继节点,则位于末尾)?

最佳答案

以下是我认为您的追求。

它基本上获取正在运行的 currentScript,找到它的父级并附加元素。我还没有完成解析部分,所以在这种情况下只是假装 <b>there</b>已被解析并且您已完成所有 createElement 位..

<script>
function docWrite(s) {
//lets pretend we have parsed the s..
//and it's <b>there</b>
let b = document.createElement('b');
b.textContent = 'there';
let scr = document.currentScript;
scr.parentNode.insertBefore(b, scr);
}
</script>


<h1>Hello</h1>
<script>docWrite('<b>there</b>');</script>
<span>After</span>

关于javascript - 如何确定调用脚本元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45983476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com