6

He creado una extensión de Chrome que usa las teclas rápidas [Alt] + [0 ... 9] solo para descubrir que Facebook usa las mismas teclas rápidas. ¿Hay alguna manera posible de que mi extensión pueda deshabilitar las teclas de acceso rápido de Facebook para que el fuego de mina solo? Estoy bastante seguro de que he identificado el código facebook utiliza para poner en práctica sus [Alt] + [0 ... 9] teclas de acceso rápido:Cómo deshabilitar las teclas de acceso rápido de Facebook con la extensión de 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... 

Se trata de un script llamado desde el encabezado del documento raíz. He intentado lo siguiente para desactivarlas:

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

e incluso

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

supongo que seguirán, además, que la razón por la que ninguno de estos intentos trabajo es porque a pesar de los scripts contenidos extensión de Chrome comparten un DOM con cualquier página web en el que se ejecutan, ¿quizás no comparten entornos de codificación? ¡Cualquier idea sería apreciada!

Respuesta

4

Su intuición es correcta, el JavaScript que se ejecuta desde un script de contenido como parte de una extensión de Chrome se ejecuta en un entorno limitado que no tiene acceso al JavaScript que se ejecuta en la página que lo contiene.

por la 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 

En primer lugar, yo recomendaría que se tiene en cuenta diferentes teclas de acceso directo. Anular la funcionalidad de las teclas de acceso directo existentes para su propia extensión podría proporcionar una experiencia de usuario discordante para alguien que está esperando la tecla de acceso directo de Facebook. Imagínese si una extensión anula los accesos directos ctrl-c y ctrl-p que forman parte del sistema operativo de escritorio para copiar y pegar: creo que tendría algunos usuarios molestos que probablemente eliminarían lo que cambió el comportamiento que aprendieron anteriormente.

Sin embargo, si usted es insistente, entonces aquí es una solución para la carga de JavaScript que se ejecutará en el contexto de la página que contiene:

Editar: Actualizado por comentario para hacer referencia JS archivo en plug-in en lugar de uno alojado en la web

Primero, deberá crear un archivo JavaScript en su complemento de Chrome: override-fb-hotkeys.js.

En primer lugar, tendrá que albergar un archivo JavaScript en algún lugar de la web que contiene la secuencia de comandos que desea ejecutar en la página, digamos que usted recibe en: http://mysite.com/override-fb-hotkeys.js.

Luego, a partir de la secuencia de comandos de contenido, puede insertar una etiqueta de script en el DOM que hace referencia a su archivo JavaScript, algo como esto:

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 será entonces descabellada y ejecutado en el contexto de la página que contiene, no el código de espacio aislado del complemento de Chrome.

+0

Gracias por esto. ¡Esto de hecho es perspicaz! He encontrado que no hay necesidad de alojar en otro sitio, ya que esto funciona: 'script.setAttribute (" src ", chrome.extension.getURL (" override-fb-hotkeys.js "));' sin embargo, el código 'document. documentElement.onkeydown = function (e) {}; 'dentro del archivo inyectado no deshabilita los accesos directos fb, por lo que cualquier ayuda adicional sería bienvenida. –

+0

Debería realizar una ingeniería inversa del código en la página de Facebook para determinar cómo se capturaban y manejaban los eventos clave y luego anular esa funcionalidad. Miré un poco pero nada saltó. Me di cuenta de que cuando eliminé el elemento con id "blueBarHolder" (toda la barra superior), las teclas rápidas no funcionaron. –

+0

Oye, quiero preguntarte ya que pareces saber cosas. ¿Sabes si hay una solución inteligente para simplemente desactivar los accesos directos en Facebook en Chrome? No soporto el hecho de que L sea como (uso ctrl + l MUY a menudo para ir a la barra de navegación). Al igual, incluso un simple script de una línea ayudaría a – Tom

8

Las secuencias de comandos de contenido de Chrome se ejecutan en un entorno de espacio aislado [source]. No hay una forma directa de comunicarse con el objeto global (window).

Otro error común es que el desarrollador olvida cómo y cuándo se inyecta la secuencia de comandos.

  • Por defecto, el script se inyecta en un punto llamado "document_idle". En este punto, el documento no está ocupado (DOMContentLoaded ha disparado, window.onload puede o no haberse disparado).
  • Como resultado, las funciones del script se pueden sobrescribir inmediatamente después de la declaración.

para inyectar un pequeño script, recomiendo añadir el código directamente a la escritura de contenido:

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

Si desea asegurarse de que el método no va a sobrescribir, se puede utilizar Object.defineProperty, para definir una propiedad inmutable:

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

El método anteriormente mencionado es compatible con Firefox 4 y al menos Chrome 5+. Si quieres apoyar también Firefox y Chrome 2+ 1+, se puede jugar con el __defineSetter__, para evitar onkeydown de ser definido:

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

¿Y qué sucede si el código de Facebook prevalece sobre Object.defineProperty? – Pacerier

+0

@Pacerier Si ejecuta el código con 'run_at; "document _start" ', entonces no debería ser posible. –

+0

¿Es posible que 2 extensiones diff hagan 'document_start'? – Pacerier

1

Ésta es la forma en que puede hacerlo usando jQuery

Retire todo atajos para cualquier página web:

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