注入<script>标签,为其提供正确的位置</script>

时间:2015-03-18 19:23:00

标签: javascript jquery ajax

用例:使用“遗留”PHP文件我想拦截提交和链接,这样它们不会重写整个页面,而只是替换给定的DIV内容。所以我使用JQ load来加载PHP文件。但是这个注入PHP的东西也必须包含JS / JQ代码来拦截未来的提交和链接。没有问题,只需在页面上使用一个这样的DIV即可。

如果您希望页面上的多个DIV都执行此操作,则需要SCRIPT,当它们运行时(它们都运行相同的'xxx.js'文件),以便能够检测其父DIV。因此,我们的想法是拥有多个SCRIPT,所有SCRIPT都调用'xxx.js',每个都包含在其参考DIV中。

  • 我尝试合并{SCRIPT src ='xxx.js'}标记,以便它由加载的PHP文件生成。
  • 我也尝试在从load()成功返回时调用{SCRIPT src ='xxx.js'},即使用getScript()。
  • 同样从load()返回时,我尝试了append()在我选择的DIV结尾附加字符串“{SCRIPT src ='xxx.js'} {/ SCRIPT}”。

问题是,如果像这样注入SCRIPT,似乎总是看起来父母是HEAD,并且它没有兄弟元素:即当你去的时候:

var this_js_script = $( document.currentScript );
var script_parent = this_js_script.parent();

(注意,我也尝试过最流行的答案here中列出的其他技术,尝试从“内部”访问SCRIPT元素。)

然后证明,当脚本文件运行时,找不到它的位置,从而获得对其DIV(理论上是它的父级)的引用。

可能有人知道我在说什么,并有解决方案!另一方面,有人可能会让我做一个JS小提琴。我从来没有做过,我想这不会是最简单的。

2 个答案:

答案 0 :(得分:1)

我想我有一个解决方案。

遗留代码中的函数调用main函数会发生什么。 main函数将调用者的函数体作为字符串获取,然后查找页面上的所有script个对象,试图查看它是否可以与其中任何一个匹配。如果找到匹配项,则会突出显示父div

请注意,如果调用函数是匿名的,我认为这不会起作用。

.code-block
{
  border: solid 1px #000;
  width: 100px;
  height: 100px;
  border-radius: 5px;
  float: left;
  margin: 5px;
}

.johnny
{
  border-color: #f00;
}
<script>
  function main(param)
  {
	var script = arguments.callee.caller.toString();

	var scripts = document.getElementsByTagName("script");

	for(var i = 0; i < scripts.length; ++i)
	{
	  if(typeof scripts[i].parentElement != "undefined")
	  {
		if(scripts[i].innerText.indexOf(script) != -1)
		{
		  scripts[i].parentNode.className = scripts[i].parentNode.className + " johnny";
		}
	  }						
	}
  };
</script>
<div class="code-block">
  <script>
	function doSomething(){}
  </script>
</div>
<div class="code-block">
  <script>
	function doSomethingElse(){}
  </script>
</div>
<div class="code-block">
  <script>
	function doSomethingRandom(){}
  </script>
</div>
<div class="code-block">
  <script>
	function heresJohnny(){main("");}
  </script>
</div>
<script>
  heresJohnny();
</script>

答案 1 :(得分:0)

我认为Hayko Koryun是一个很好的方法。

最后,我找到了两种重新设计问题的方法,避免了脚本标记在特定位置的需要。

一个涉及以相当聪明的方式传递params here(Naeem Sarfraz的回答)。

但事实上,最后,我所做的是设计它,以便在从JQ load()拦截提交成功返回后,单个脚本最终运行自己的main()函数...所以我避免了脚本标记实际位于何处的问题,并且赞成处理所有内容的JQ“框架”的想法,而不是“切换”对PHP代码的控制。

相关问题