如何确定调用脚本元素?

时间:2017-08-31 14:06:19

标签: javascript dom document.write

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

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

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

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

// Do something with p_arg here
  };

由于这个函数应该从文档体内的任何地方调用,我需要在X点插入什么才能找出调用此函数的位置(即调用该调用的脚本节点)? / p>

需要考虑以下标准:

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

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

现在,我如何找到插入由此函数生成的DOM树的位置(在JavaScript之后的节点之前,或者如果没有后继节点则在最后)?

1 个答案:

答案 0 :(得分:1)

以下是我的想法。

它基本上可以运行正在运行的当前脚本,查找它的父级并附加元素。我还没有完成解析部分,所以在这个例子中只是假装已解析<b>there</b>并且您已完成所有createElement位..

&#13;
&#13;
<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>
&#13;
&#13;
&#13;