我的HTML页面中包含一些第三方JavaScript。 它为我的网页添加了一些共享按钮,并被称为
<script src=http://something/something.js></script>
但有时我想不加载这个javascript。它可以在服务器端解决,在某些情况下,它会阻止上述行出现在网页上。但是由于技术原因,无论是服务器端(如PHP)还是javascript(例如,通过使用document.write仅在需要时将标记放在那里),这根本不可能从HTML中删除此标记。我只需要在javascript中解决这个问题,如果条件满足,我需要BLOCK脚本标记,这意味着标记始终存在于HTML中。
是否有可能阻止上面提到的something.js网址加载?因此,我会在其之前或之后执行其他一些javascript。我认为这种方式有可能,但它似乎不起作用:
<script>
(function(){
var scripts=document.getElementsByTagName('script');
for (var i=0; i<scripts.length; i++)
if (scripts[i].src && scripts[i].src=='http://something...')
scripts[i].parentNode.removeChild(scripts[i]);
})();
</script>
<script src=http://something/something.js></script>
这不起作用,因为在调用脚本时,此时它无法看到下面的另一个<script>
标记。如果我把脚本放在下面,它会检测带有src属性的脚本,但由于已经执行了(并将共享按钮元素粘贴到网页上),因此删除该元素为时已晚。
还有其他方法可以停止加载第三方脚本吗?谢谢
编辑:由于某些内部原因,更新了第三方javascript每次都需要在HTML中的事实(尽管事实上我不同意这一点,但我无能为力)。
答案 0 :(得分:4)
一个简单的解决方案可能是:
<script>
if(yourcondition){
document.write('<script src=\"http://something/something.js\" type=\"text/javascript\"><\/script>');
}
else{
document.write('<script src=\"http://something/OTHER.js\" type=\"text/javascript\"><\/script>');
}
</script>
yourcondition
可以是存储在cookie或localstorage中的布尔值。或者,您可以根据需要将其设置为true
或false
。
另请注意,脚本标记中的源值必须封装在"
答案 1 :(得分:2)
如果脚本在初始解析期间依赖于文档,因为它输出HTML出现的位置(例如,通过document.write
),就像您的hidemeifnecessary
示例中所示,那么您的& #34;隐藏我&#34;方法可能是客户端最好的方法。
如果在主要解析过程中脚本没有需要在页面中,你可以懒得加载它,但是从你的问题似乎不是情况下。
正如你在问题中所说,这里的正确答案实际上是处理这个服务器端。
答案 2 :(得分:0)
您必须确保尽快加载脚本。我在打开头标签后立即加载我的。在该脚本中,选择要阻止的所有标签(在我的示例中为脚本,iframe和img),然后遍历它们。将事件侦听器“ beforescriptexecute”添加到它们中,并触发如下的preventDefault:
bsePd = element.addEventListener('beforescriptexecute', e => {
e.preventDefault();
e.target.removeEventListener('beforescriptexecute', bsePd);
console.log('Prevented script from execution:', e.target.src);
});
因此,您可以捕获已经存在的脚本。对于动态添加的对象,您可以添加事件侦听器DOMNodeInserted并等待它们出现。
这就是我创建一个Cookie同意管理器的方式,该管理器用于一个网站,该网站由于繁重的缓存机制而无法使用PHP。