首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用greasemonkey脚本阻止特定的url或.js文件执行?(客户方)

如何使用greasemonkey脚本阻止特定的url或.js文件执行?(客户方)
EN

Stack Overflow用户
提问于 2020-12-26 04:08:35
回答 1查看 1.2K关注 0票数 2

我想要停止一个javascript .js,以便在一个特定的网站上加载greasemonkey/violentmonkey。

代码语言:javascript
复制
https://cdn.jsdelivr.net/gh/s9e/hljs-loader@1.0.16/loader.min.js

这是加载到pagesource上的脚本:

代码语言:javascript
复制
<script async="" crossorigin="anonymous" data-hljs-style="github-gist" integrity="sha384-TB2DTH77ndX7xwCHAtxD7BZqyn4r429ZSoGL7vcrb5x0bFSvLGAMoiriMUcIqeTu" onload="hljsLoader.highlightBlocks(this.parentNode)" src="https://cdn.jsdelivr.net/gh/s9e/hljs-loader@1.0.16/loader.min.js"></script>

这是我想要停止在网页上加载的url,因为它高亮显示了语法highlihgting的代码,我想停止语法突出显示。

如果我使用ublock源文件在浏览器上阻止它,它可以工作,但我想用userscript阻止它。

编辑:我按照建议使用了脚本,但它不起作用,我做错了什么?

代码语言:javascript
复制
// ==UserScript==
// @name        New script 
// @namespace   Violentmonkey Scripts
// @match       *flarum.org*
// @include     *flarum.org*
// @grant       none
// @version     1.0
// @run-at      document-start
// @author      -
// @description 12/26/2020, 9:57:34 AM
// ==/UserScript==

const observer = new MutationObserver((mutations) => {
  mutations.forEach(({ addedNodes }) => {
    addedNodes.forEach((addedNode) => {
      if (addedNode.nodeType === 1 && addedNode.matches('script') && addedNode.src === 'https://cdn.jsdelivr.net/gh/s9e/hljs-loader@1.0.16/loader.min.js') {
        addedNode.remove();
        observer.disconnect();
      }
    });
  });
});
observer.observe(document.documentElement, { childList: true, subtree: true });

我是不是遗漏了什么?

下面是我试图在https://discuss.flarum.org/d/25739-disable-syntax-highlighting上运行脚本的url

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-26 04:12:18

下面的第二种方法通常有效,但由于某种原因,页面上的某些东西似乎干扰了它。一个丑陋的解决方法是预先在窗口上放置一个空的hljs属性,以便页面脚本在运行时认为它已经存在,什么也不做:

代码语言:javascript
复制
window.hljsLoader = {};

您可以在页面开始时将一个MutationObserver添加到文档中,并观察是否添加了一个脚本标记,该脚本标记将该URL作为src,并将其删除。确保您使用的是@run-at document-start,然后执行:

代码语言:javascript
复制
const observer = new MutationObserver((mutations) => {
  mutations.forEach(({ addedNodes }) => {
    addedNodes.forEach((addedNode) => {
      if (addedNode.nodeType === 1 && addedNode.matches('script') && addedNode.src === 'https://cdn.jsdelivr.net/gh/s9e/hljs-loader@1.0.16/loader.min.js') {
        addedNode.remove();
        observer.disconnect();
      }
    });
  });
});
observer.observe(document.documentElement, { childList: true, subtree: true });

虽然脚本标记将被临时添加到DOM中,但在获得运行机会之前,它将在观察者微任务中被删除。

脚本工作的实时片段:

代码语言:javascript
复制
<script>
const observer = new MutationObserver((mutations) => {
  mutations.forEach(({ addedNodes }) => {
    [...addedNodes].forEach((addedNode) => {
      if (addedNode.nodeType === 1 && addedNode.matches('script') && addedNode.src === 'https://cdn.jsdelivr.net/gh/s9e/hljs-loader@1.0.16/loader.min.js') {
        console.log('Script tag addition intercepted and removed');
        addedNode.remove();
        observer.disconnect();
        console.log('hljsLoader has not been loaded:', typeof hljsLoader);
      }
    });
  });
});
observer.observe(document.documentElement, { childList: true, subtree: true });
</script>

<script async="" crossorigin="anonymous" data-hljs-style="github-gist" integrity="sha384-TB2DTH77ndX7xwCHAtxD7BZqyn4r429ZSoGL7vcrb5x0bFSvLGAMoiriMUcIqeTu" onload="console.log(hljsLoader)" src="https://cdn.jsdelivr.net/gh/s9e/hljs-loader@1.0.16/loader.min.js"></script>

如果有多个脚本,则必须循环它们,而不是在第一个脚本上停止:

代码语言:javascript
复制
console.log(typeof hljsLoader);

setTimeout(() => {
  console.log(typeof hljsLoader);
}, 1000);
代码语言:javascript
复制
<script>
const observer = new MutationObserver((mutations) => {
  mutations.forEach(({ addedNodes }) => {
    [...addedNodes].forEach((addedNode) => {
      if (addedNode.nodeType === 1 && addedNode.matches('script') && addedNode.src === 'https://cdn.jsdelivr.net/gh/s9e/hljs-loader@1.0.16/loader.min.js') {
        console.log('Script tag addition intercepted and removed');
        addedNode.remove();
        console.log(typeof hljsLoader);
      }
    });
  });
});
observer.observe(document.documentElement, { childList: true, subtree: true });
window.addEventListener('DOMContentLoaded', () => observer.disconnect());
</script>

<script async="" crossorigin="anonymous" data-hljs-style="github-gist" integrity="sha384-TB2DTH77ndX7xwCHAtxD7BZqyn4r429ZSoGL7vcrb5x0bFSvLGAMoiriMUcIqeTu" onload="console.log(hljsLoader)" src="https://cdn.jsdelivr.net/gh/s9e/hljs-loader@1.0.16/loader.min.js"></script>
<script async="" crossorigin="anonymous" data-hljs-style="github-gist" integrity="sha384-TB2DTH77ndX7xwCHAtxD7BZqyn4r429ZSoGL7vcrb5x0bFSvLGAMoiriMUcIqeTu" onload="console.log(hljsLoader)" src="https://cdn.jsdelivr.net/gh/s9e/hljs-loader@1.0.16/loader.min.js"></script>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65453565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档