jQuery en Greasemonkey 1.0 entra en conflicto con sitios web que usan jQuery
Desde que se lanzó el nuevo Greasemonkey 1.0 hace unos días, todos los sitios que tienen jQuery y donde uso jQuery en mi script de Greasemonkey no ejecutan mi script correctamente. El jQuery que tengo en mi script GS (usando los @require
metadatos) entra en conflicto con el jQuery de la página. Esto se debe al nuevo @grant
código.
He leído la documentación pero todavía no sé cómo volver a ejecutar scripts GS en un entorno limitado; las únicas opciones parecen ser otorgar acceso a una API de GS o no otorgarlo a ninguna y ejecutar el script sin limitaciones de seguridad, lo cual no funciona en absoluto para mí cuando he diseñado mis docenas de scripts GS para ejecutar CON limitaciones de seguridad y me gusta así.
Greasemonkey 1.0 cambió radicalmente la forma en que funciona el sandbox , eliminando miles de scripts. Este es un gran problema y espero que se unan a mí para expresar su opinión/experiencias sobre el informe de error principal de este problema .
El blog de Greasemonkey afirma que puedes solucionar el problema con lo siguiente :
this.$ = this.jQuery = jQuery.noConflict(true);
... Lo cual no estoy seguro de que funcione en todos los casos. Y es exactamente el enfoque equivocado de una filosofía de codificación atómica, que evita los efectos secundarios y utiliza el principio DRY . En mi opinión , la mejor estrategia es restaurar el sandbox.
Reactive la zona de pruebas especificando un @grant
valor (que no sea none
). Edite su bloque de metadatos para que termine con las siguientes líneas :
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
/*- The @grant directive is needed to work around a design flaws introduced in GM 1.0
and again in GM 4.0.
It restores the sandbox.
*/
Se restaurará la zona de pruebas y se resolverán todos los conflictos.
Y los scripts serán compatibles con motores superiores como Tampermonkey y Violentmonkey.
Dos años después, esta "característica" aún no ha sido suficientemente documentada ni abordada.
Los scripts que requieren jQuery aún entran en conflicto con algunas páginas que usan jQuery.
Las posibles soluciones son:
- Agregar
@grant GM_log
o similar a la zona de pruebas del script Alias los objetos jQuery existentes en el script agregando este bloque:
var my_jquery = jQuery;
jQuery.noConflict(true);
var $ = my_jquery, jQuery = my_jquery;
No uses jQuery
Considerándolo todo, una decisión terrible por parte de Greasemonkey.
Tuve el mismo problema.
Desde la versión 1.0 de GM, todos mis scripts que @require
jQuery se ejecutan en sitios que también usan jQuery dejaron de funcionar.
Lo sé, podría intentar algo como $ = unsafeWindow.$
, pero ese no es el punto.
El punto aquí es que antes funcionaban y ahora no lo harán.
Agregarlos @grant GM_log
los arregló.