Domanda

Ho creato un'estensione Chrome che utilizza i tasti di scelta rapida [alt]+[0 ... 9] solo per scoprire che Facebook usa gli stessi hotkey. Esiste un modo possibile che la mia estensione possa disabilitare i tasti di scelta rapida di Facebook in modo che il mio spara da solo? Sono abbastanza sicuro di aver identificato il codice che Facebook usa per implementare i loro tasti di scelta rapida [alt]+[0 ... 9]:

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 di root. Ho provato quanto segue per disabilitarli:

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

e persino

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

Immagino inoltre che il motivo per cui nessuno di questi tentativi funziona è perché sebbene gli script di contenuti di estensione Chrome condividano un DOM con qualsiasi pagina web su cui eseguono, forse non condividono ambienti di codifica? Qualsiasi intuizione sarebbe apprezzata!

È stato utile?

Soluzione

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

Per Chrome Doc sugli script di contenuto:

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, consiglierei di prendere in considerazione diverse chiavi di scelta rapida. Sovrarrezione la funzionalità delle chiavi di scelta rapida esistente per la propria estensione potrebbe fornire un'esperienza utente stridente per qualcuno che si aspetta la chiave di scelta rapida di Facebook. Immagina se un'estensione ha superato le scorciatoie CTRL-C e CTRL-P che fanno parte del sistema operativo desktop per copia e incolla-penso che avresti alcuni utenti sconvolti che probabilmente rimuoverebbero la cosa che ha cambiato il comportamento che hanno imparato prima.

Tuttavia, se sei insistente, ecco una soluzione alternativa per il caricamento di JavaScript che eseguirà nel contesto della pagina contenente:

Modificare: Aggiornato per commento al file JS di riferimento in un plug -in anziché uno ospitato sul Web

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

Innanzitutto, dovrai ospitare un file JavaScript da qualche parte sul Web che contiene lo script che si desidera eseguire nella pagina, diciamo che lo ospiti su: http://example.com/override-fb-hotkeys.js.

Quindi, dallo script di contenuti, è possibile inserire un tag di script nel DOM che fa riferimento al tuo file JavaScript, qualcosa del genere:

    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)

Il JavaScript verrà quindi recuperato ed eseguito nel contesto della pagina contenente, non il codice sandbox dal plugin Chrome.

Altri suggerimenti

Gli script di contenuti di Chrome sono eseguiti in un ambiente sandbox fonte. Non esiste un modo diretto per comunicare con il globale (window) oggetto.

Un'altra trappola comune è che lo sviluppatore dimentica come/quando viene iniettata la sceneggiatura.

  • 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 può o meno aver sparato).
  • Di conseguenza, le funzioni nello script possono essere sovrascritte immediatamente dopo la dichiarazione.

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

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 vuoi assicurarti che il metodo non verrà sovrascritto, puoi usare 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 vuoi supportare anche Firefox 2+ e Chrome 1+, puoi giocare con il __defineSetter__, impedire onkeydown dall'essere definito:

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

Ecco come puoi farlo usando jQuery

Rimuovi tutte le scorciatoie per qualsiasi pagina Web:

$('[accessKey]').attr('accessKey','')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top