用例:使用“遗留”PHP文件我想拦截提交和链接,这样它们不会重写整个页面,而只是替换给定的DIV内容。所以我使用JQ load来加载PHP文件。但是这个注入PHP的东西也必须包含JS / JQ代码来拦截未来的提交和链接。没有问题,只需在页面上使用一个这样的DIV即可。
如果您希望页面上的多个DIV都执行此操作,则需要SCRIPT,当它们运行时(它们都运行相同的'xxx.js'文件),以便能够检测其父DIV。因此,我们的想法是拥有多个SCRIPT,所有SCRIPT都调用'xxx.js',每个都包含在其参考DIV中。
问题是,如果像这样注入SCRIPT,似乎总是看起来父母是HEAD,并且它没有兄弟元素:即当你去的时候:
var this_js_script = $( document.currentScript );
var script_parent = this_js_script.parent();
(注意,我也尝试过最流行的答案here中列出的其他技术,尝试从“内部”访问SCRIPT元素。)
然后证明,当脚本文件运行时,找不到它的位置,从而获得对其DIV(理论上是它的父级)的引用。
可能有人知道我在说什么,并有解决方案!另一方面,有人可能会让我做一个JS小提琴。我从来没有做过,我想这不会是最简单的。
答案 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代码的控制。