阻止具有特定网址的脚本

时间:2019-11-10 01:08:08

标签: javascript html

创建一个html文档,并在其中加载脚本,如下所示:

<!doctype html>
<html lang="en">

<head>   
  <meta charset="utf-8">

      <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
</head>

<body>

</body>

</html>

我的问题是,是否有办法通过在脚本始发地code.jquery.com之前添加脚本来阻止脚本调​​用,然后对其进行扫描然后阻止它。

我什么都没找到。

希望你能帮助我。

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以使用我编写的以下功能阻止脚本运行。 blockScript将遍历所有脚本标签,并删除任何脚本标签的源,包括您提供的源。请注意,这使用includes API,它将删除所有匹配的脚本标签。

BlockScript

function blockScript(origin) {
    const scripts = Array.from(document.getElementsByTagName("SCRIPT"));
    if (scripts.length > 0) {
        scripts.forEach((script) => {
            if (script.src.includes(origin)) {
                document.head.removeChild(script);
            }
        })
    }
}

MutationObserver

使用MutationObserver,您可以监视DOM的变化。

const observer = new MutationObserver((mutationsList, observer) => {
    for(let mutation of mutationsList) {
        const addedNodes = Array.from(mutation.addedNodes);
        if (addedNodes && addedNodes.some(n => n.nodeName === 'SCRIPT')) {
            blockScript('code.jquery.com');
        }
        observer.disconnect();
    }
});
observer.observe(document, { childList: true, subtree: true });

把所有东西放在一起...

<script>
    function blockScript(origin) {
        const scripts = Array.from(document.getElementsByTagName("SCRIPT"));
        if (scripts.length > 0) {
            scripts.forEach((script) => {
                if (script.src.includes(origin)) {
                    document.head.removeChild(script);
                }
            })
        }
    }
</script>
<script>
    const observer = new MutationObserver((mutationsList, observer) => {
        for(let mutation of mutationsList) {
            const addedNodes = Array.from(mutation.addedNodes);
            if (addedNodes && addedNodes.some(n => n.nodeName === 'SCRIPT')) {
                blockScript('code.jquery.com');
            }
            observer.disconnect();
        }
    });
    observer.observe(document, { childList: true, subtree: true });
</script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous" ></script>
<script>
    $(document).ready(function() {
        console.log('I am undefined');
    })
</script>

您应该得到

Uncaught ReferenceError: $ is not defined

我仅使用Chrome浏览器进行过测试。