6

我創建了一個Chrome擴展,它只使用熱鍵[Alt] + [0 ... 9]來發現Facebook使用相同的熱鍵。有沒有可能我的擴展可能禁用Facebook的熱鍵,讓我的火單獨?我敢肯定我已經確定了代碼Facebook的使用來實現自己的[Alt]鍵+ [0 ... 9]熱鍵:如何通過Chrome擴展禁用Facebook熱鍵?

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他們在哪個運行,也許他們不共享編碼環境?任何有識之士將不勝感激!

回答

4

您的直覺是正確的,從內容腳本作爲Chrome擴展的一部分運行的JavaScript運行在無法訪問在包含頁面中執行的JavaScript的沙箱中。

Chrome doc on Content Scripts

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 

首先,我建議你考慮不同的快捷鍵。爲您自己的擴展覆蓋現有快捷鍵的功能可能會爲期望Facebook快捷鍵的用戶提供令人震驚的用戶體驗。想象一下,如果一個擴展覆蓋了作爲桌面操作系統複製和粘貼的一部分的ctrl-c和ctrl-p快捷方式 - 我想你會有一些不高興的用戶可能會刪除改變他們以前學到的行爲的東西。

但是,如果你堅持,那麼這裏是一個變通方法來加載JavaScript將在包含頁面的上下文中執行:

編輯:根據註釋更新以引用的JS在插件文件,而不是一個託管在網上

首先,您需要在您的Chrome插件中創建一個JavaScript文件:override-fb-hotkeys.js

首先,您需要在網頁上的某個地方託管一個JavaScript文件,其中包含您要在該頁面中執行的腳本,可以說您將其放置在: http://mysite.com/override-fb-hotkeys.js

然後,從內容腳本,你可以插入腳本標籤到引用您的JavaScript文件中的DOM,是這樣的:那麼

var script = document.createElement('script'); 
    script.setAttribute("type", "text/javascript"); 
    script.setAttribute("async", true); 
    script.setAttribute("src", chrome.extension.getURL("override-fb-hotkeys.js")); //Assuming your host supports both http and https 
    var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement; 
    head.insertBefore(script, head.firstChild) 

中的JavaScript將被獲取並在上下文中執行包含的頁面,而不是Chrome插件的沙盒代碼。

+0

感謝您的支持。這確實很有見地!我發現沒有必要在其他網站上舉辦的這個作品:'script.setAttribute(「SRC」,chrome.extension.getURL(「覆蓋-FB-hotkeys.js」));'但是代碼'文件。 documentElement.onkeydown = function(e){};'在注入的文件內不禁用fb快捷鍵,所以任何更多的幫助將受到歡迎! –

+0

您需要對Facebook頁面上的代碼進行反向工程,以確定如何捕獲和處理關鍵事件,然後重寫該功能。我看了一下,但沒有跳出來。我注意到,當我刪除I​​D爲「blueBarHolder」(整個頂部欄)的元素,然後熱鍵不起作用。 –

+0

嘿,我想問你,因爲你似乎知道的東西。你知道是否有一個聰明的解決方法,只需在Chrome上禁用Facebook上的快捷鍵?我不能忍受L這樣的事實(我經常使用ctrl + l來訪問導航欄)。就像,即使是簡單的一行腳本也會幫助 – Tom

8

Chrome的內容腳本在沙盒環境中執行[source]。沒有直接的方式與全球(window)對象通信。

另一個常見的錯誤是開發者忘記了腳本注入的方式/時間。

  • 默認情況下,該腳本注入點爲「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,以限定一個不可變屬性:

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*/ 
}); 

前面提到的方法在Firefox支持4+和至少鉻5+。如果你也想支持Firefox 2+和Chrome 1+,你可以用__defineSetter__發揮,以防止onkeydown被定義爲:

document.documentElement.__defineSetter__('onkeydown', function(){}); 
+0

如果Facebook代碼重寫Object.defineProperty會怎麼樣? – Pacerier

+0

@Pacerier如果你用'run_at; 「document _start」',那麼它不應該是可能的。 –

+0

2 diff擴展名可以執行'document_start'嗎? – Pacerier

1

這是您如何使用jQuery

刪除所有做任何網頁的快捷鍵:

$('[accessKey]').attr('accessKey','')