我最简单的 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) 事件从 window
到 document
再到 <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"
}]
}
我不熟悉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) 事件从 window
到 document
再到 <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"
}]
}