如何使用Chrome扩展程序禁用Facebook Hotkeys?

问题描述 投票:0回答:2
我创建了一个使用Hotkeys [alt]+[0 ... 9]的Chrome扩展名,只是发现Facebook使用了相同的热键。我的扩展是否有可能禁用Facebook的热键,以便仅我的大火?我可以肯定的是,我已经确定了Facebook用来实现他们的[alt]+[0 ... 9] Hotkeys的代码:

document.documentElement.onkeydown=function(a){a=a||window.event;var b=a.target||a.srcElement;var c=a.keyCode==13&&!a.altKey&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&CSS.hasClass...
这是从根文档的头部称为脚本中的。我已经尝试了以下内容来禁用它们:

//contents script: $().ready( function() { document.documentElement.onkeydown = ''; });
和均匀

$().ready( function() { document.documentElement.onkeydown = function(e){}; });

我进一步猜测,这些尝试都没有起作用的原因是因为尽管Chrome扩展内容脚本与他们运行的任何网页共享一个DOM,但也许它们不共享编码环境?任何见解都将不胜感激!

Chrome的内容脚本是在沙盒环境中执行的[源]。没有直接的方法与全局(
javascript events google-chrome-extension hotkeys onkeydown
2个回答
14
投票
)对象进行通信。 另一个共同的陷阱是开发人员忘记了脚本注入脚本的方式/何时。

默认情况下,将脚本注入为“document_idle”的点。在这一点上,该文件并不忙(DOMContentLoaded

已射击,可能已经开火了,也可能没有开火)。
结果,脚本中的功能可能会在声明后立即覆盖。

要注入一个小脚本,我建议将代码直接添加到内容脚本:

window.onload
  • 如果您想确保该方法不会被覆盖,则可以使用var actualCode = '/* Code here (see below for inspiration) */'; var script = document.createElement('script'); script.appendChild(document.createTextNode(actualCode)); (document.head || document.documentElement).appendChild(script); script.parentNode.removeChild(script);
    来定义不变的属性:
    Object.defineProperty
  • 前述方法在Firefox 4+和至少Chrome 5+中得到了支持。如果您还要支持Firefox 2+和Chrome 1+,则可以与
  • Object.defineProperty(document.documentElement, 'onkeydown', { value: function() {}, writable: false, /* Cannot be overwritten, default false */ configurable: false, /* Cannot be deleted, or modified */ enumerable: true /* Does not really matter. If true, it's visible in a for-loop. If false, it's not*/ });
一起玩,以防止定义:

__defineSetter__
    

您的直觉是正确的,作为Chrome扩展名的一部分,从内容脚本运行的JavaScript是在无法访问包含页面执行的JavaScript的沙盒中运行的。 the content脚本上的chrome doc


onkeydown 首先,我建议您考虑不同的快捷键。覆盖您自己扩展的现有快捷键的功能,可以为期望Facebook快捷键的人提供刺耳的用户体验。 想象一下,如果扩展名覆盖了CTRL-C和CTRL-P快捷方式,这些快捷方式是桌面操作系统的一部分和粘贴 - 我认为您可能会有一些不适的用户,这些用户可能会删除更改以前所学的行为的事物。

,但是,如果您坚持不懈,那么这里是加载JavaScript的解决方法,该JavaScript将在包含页面的上下文中执行:

Edit:

在每个注释中更新以在插件中引用JS文件,而不是网络上托管的文件。

首先,您需要在Chrome插件中创建一个JavaScript文件:
document.documentElement.__defineSetter__('onkeydown', function(){});
。 首先,您需要在网络上某个地方托管一个包含要在页面中执行的脚本的JavaScript文件,让我们说您托管它:

However, content scripts have some limitations. They cannot: * Use chrome.* APIs (except for parts of chrome.extension) * Use variables or functions defined by their extension's pages * Use variables or functions defined by web pages or by other content scripts
.

6
投票
,然后从您的内容脚本中,您可以将脚本标签插入引用您的JavaScript文件的DOM中,类似的内容:

override-fb-hotkeys.js

然后,将在包含页面的上下文中获取和执行JavaScript,而不是Chrome插件的沙盒代码。

这就是您可以使用jQuery
进行操作的方式

任何网页的所有快捷方式:

http://example.com/override-fb-hotkeys.js

基因人工智能(又称GPT,LLM,生成AI,Genai)工具不可用来生成堆栈溢出的内容。您提供的内容必须是您自己的原始作品,也必须是您对他人正确引用的作品的摘要。如果确定您的内容是由生成人工智能工具撰写的,则可能会删除其以及从中获得的任何声誉。发布由生成人工智能工具产生的内容可能会导致主持人的警告,也可能导致重复违规的暂停。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.