6

Ho creato un'estensione per Chrome che utilizza i tasti di scelta rapida [Alt] + [0 ... 9] solo per scoprire che Facebook utilizza gli stessi tasti di scelta rapida. C'è un modo possibile la mia estensione potrebbe disabilitare i tasti di scelta rapida di Facebook in modo che il mio fuoco da solo? Sono abbastanza certo ho identificato il codice facebook utilizza per attuare i loro [Alt] + [0 ... 9] tasti di scelta rapida:Come disabilitare i tasti di scelta rapida di Facebook con l'estensione Chrome?

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... 

Questo è in uno script chiamato dalla testa del documento radice. Ho provato quanto segue disabilitarli:

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

e anche

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

sto indovinando, inoltre, che la ragione nessuno di questi tentativi lavoro è perché, anche se Chrome script contenuti estensione condividono un DOM con qualsiasi pagina web su cui corrono, forse non condividono gli ambienti di codifica? Qualsiasi intuizione sarebbe apprezzata!

risposta

4

L'intuizione è corretta, il codice JavaScript che viene eseguito da uno script di contenuto come parte di un'estensione di Chrome viene eseguito in una sandbox che non ha accesso al codice JavaScript che viene eseguito nella pagina contenente.

Per il 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 

Prima di tutto, vi consiglio di prendere in considerazione diversi tasti di scelta rapida. Sostituire la funzionalità dei tasti di scelta rapida esistenti per la propria estensione potrebbe fornire un'esperienza utente sconvolgente per qualcuno che si aspetta la chiave di scelta rapida di Facebook. Immaginate se un'estensione scavalca le scorciatoie ctrl-c e ctrl-p che fanno parte del sistema operativo desktop per copia e incolla - penso che avreste alcuni utenti sconvolti che probabilmente rimuovono la cosa che ha cambiato il comportamento che hanno appreso in precedenza.

Tuttavia, se si è insistente, allora qui è una soluzione per il caricamento di JavaScript che verrà eseguito nel contesto della pagina che contiene:

Edit: Aggiornato ogni commento a riferimento JS file in plug-in invece di uno ospitato sul web

Innanzitutto, è necessario creare un file JavaScript nel plug-in Chrome: override-fb-hotkeys.js.

Per prima cosa, è necessario ospitare un file JavaScript da qualche parte sul Web che contiene lo script che si desidera eseguire nella pagina, diciamo che lo si ospita su: http://mysite.com/override-fb-hotkeys.js.

Poi, dal vostro script di contenuti, è possibile inserire un tag script nel DOM che fa riferimento il file JavaScript, qualcosa di simile:

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) 

La JavaScript sarà quindi recuperato ed eseguito nel contesto di la pagina contenente, non il codice in modalità sandbox dal plug-in di Chrome.

+0

Grazie per questo. Questo è davvero perspicace! Ho trovato che non è necessario ospitare su un altro sito come funziona: 'script.setAttribute (" src ", chrome.extension.getURL (" override-fb-hotkeys.js "));' comunque il codice 'documenta. documentElement.onkeydown = function (e) {}; 'all'interno del file iniettato non disabilita le scorciatoie fb, quindi ogni ulteriore aiuto sarebbe benvenuto! –

+0

È necessario eseguire il reverse engineering del codice sulla pagina di Facebook per determinare in che modo gli eventi chiave sono stati acquisiti e gestiti e quindi sostituiti con tale funzionalità. Ho guardato un po 'ma niente è saltato fuori. Ho notato che quando ho rimosso l'elemento con id "blueBarHolder" (l'intera barra in alto), i tasti di scelta rapida non funzionavano. –

+0

Ehi, voglio chiederti perché sembra che tu sappia qualcosa. Sai se c'è una soluzione intelligente per semplicemente JUST disabilitare le scorciatoie in Facebook su Chrome? Non sopporto il fatto che L sia come (uso ctrl + l MOLTO spesso per andare alla barra di navigazione). Ad esempio, anche uno script di una sola riga può essere d'aiuto – Tom

8

Gli script di contenuto di Chrome vengono eseguiti in un ambiente Sandboxed [source]. Non esiste un modo diretto per comunicare con l'oggetto globale (window).

Un altro errore comune è che lo sviluppatore dimentica come/quando viene iniettato lo script.

  • Per impostazione predefinita, lo script viene iniettato in un punto chiamato "document_idle". A questo punto, il documento non è occupato (DOMContentLoaded ha sparato, window.onload potrebbe o non è stato attivato).
  • Come risultato, le funzioni nello script possono essere sovrascritte immediatamente dopo la dichiarazione.

Per iniettare un piccolo script, vi consiglio di aggiungere il codice direttamente allo script contenuti:

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); 

Se si vuole fare in modo che il metodo non sta per essere sovrascritto, è possibile utilizzare Object.defineProperty, per definire una proprietà immutabile:

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

Il metodo precedentemente menzionato è supportato in Firefox 4+ e almeno Chrome 5+. Se si desidera supportare anche Firefox 2+ e Chrome 1+, si può giocare con la __defineSetter__, per evitare che onkeydown dall'essere definito:

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

E se il codice di Facebook sostituisce Object.defineProperty? – Pacerier

+0

@Pacerier Se si esegue il codice con 'run_at; "document _start" ', quindi non dovrebbe essere possibile. –

+0

È possibile che 2 estensioni diff facciano 'document_start'? – Pacerier

1

In questo modo è possibile farlo utilizzando jQuery

Rimuovere tutti scorciatoie per qualsiasi pagina web:

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