我最简单的 chrome 扩展没有生效

My simplest chrome extension didn't take effect

我不熟悉JavaScript。

我自己写了一个扩展,但是没有用。

扩展的功能很简单,就是激活onselectstart参数,因为网页中的这个参数使得无法select网页的文字然后复制.如果我激活这个参数,我可以select和复制。

我可以直接在 chrome 控制台中执行此 JavaScript 命令,并启用 onselectstart,效果很好:

document.body.onselectstart = function(){return true;}; 

但放入扩展后不会生效

我的扩展很简单,就两个文件:

manifest.json:

{
  "manifest_version": 2,
  "name": "Copy unblocker",
  "version": "1.0",
  "description": "enable onselectstart",
  "icons": { "16": "images/logo.png" },  

  "permissions": [
    "activeTab"
  ],
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["js/content_script.js"]
    }
  ]
}

content_ script.js:

document.body.onselectstart= function(){
  return true;
}

怎么了,或者你能给我一个可以更改 onselectstart 参数的 chrome 扩展脚本吗?

网页由JS生成。此参数阻止我 selecting text

返回 true 没有帮助,这个值在 DOM 事件中没有任何作用。它在控制台中有效,因为您的侦听器只是替换了页面的侦听器,但它在内容脚本中不起作用,因为它们的 JS 代码和对象在设计上与页面隔离。

一种解决方案是在 Chrome 扩展和 Firefox WebExtensions 实现中按照 this answer, but running code in the page context is not 100% safe due to a bug 中的说明将脚本元素中的代码添加到页面(wrappedJSObject 也受到影响)。

这里有一个更简单的解决方案:阻止页面看到该事件。

// Specifying `true` to register a capturing phase listener
window.addEventListener('selectstart', e => e.stopPropagation(), true);

一些解释。 DOM 事件分两个阶段分派:1) 事件从 windowdocument 再到 <html> 再到 <body> 并向下到达元素的捕获阶段触发事件,以及 2) 冒泡阶段,事件从目标元素一直向上冒泡,通过 DOM 树层次结构到达 window.

事件侦听器的默认阶段是“冒泡”,因此最简单的解决方案是在“捕获”阶段注册您的侦听器,它将停止事件的“传播”以防止后续侦听器看到该事件。我们是在 window 上做的,这是这个阶段的第一个接收者,所以我们的监听器是第一个。

有些网站可以通过使用相同的代码并先 运行 来绕过它,这很容易发生,因为默认情况下 DOMContentLoaded 之后内容脚本 运行。为了解决这个问题,您可以使用 "run_at": "document_start" 声明您的内容脚本,以便在页面具有 运行 其脚本之前 运行s。

  "content_scripts": [{
    "matches": ["<all_urls>"],
    "js": ["js/content_script.js"],
    "run_at": "document_start"
  }]
}