如何阻止某些javascript文件加载?

时间:2015-02-09 10:18:30

标签: javascript html css

我的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中的事实(尽管事实上我不同意这一点,但我无能为力)。

3 个答案:

答案 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中的布尔值。或者,您可以根据需要将其设置为truefalse。 另请注意,脚本标记中的源值必须封装在"

之间

答案 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。