javascript - chrome - Funciones ocultas de Greasemonkey
greasemonkey scribd (10)
Obsoleto: Firefox eliminó el soporte para E4X, en scripts de Greasemonkey, con la versión 17 de FF. Usa GM_info
para obtener metadatos.
Puede usar e4x para acceder a su == UserScript == información como una variable:
var metadata=<>
// ==UserScript==
// @name search greasemonkey
// @namespace foo
// @include http://*.google.com/*
// @include http://*.google.ca/*
// @include http://search.*.com/*
// @include http://*.yahoo.com/*
// ==/UserScript==
</>.toString();
¿Cuáles son algunas de las características y técnicas menos conocidas pero útiles que las personas están usando en sus scripts de Greasemonkey?
(Por favor, solo una característica por respuesta)
Hilos similares:
Estadísticas anónimas
Suponiendo que tiene un servicio de alojamiento básico que proporciona acceso de registro, puede rastrear fácilmente las estadísticas básicas de uso para su script.
- Coloque un archivo gif (por ejemplo, una imagen de logotipo) en su propio sitio web.
- En su secuencia de comandos, adjunte un elemento img a la página que hace referencia al archivo gif:
var img = document.createElement("img"); img.src = "http://mysite.com/logo.gif"; document.body.appendChild(img);
Ahora, cada vez que un usuario ejecuta su secuencia de comandos, su servicio de alojamiento registrará un golpe en ese archivo gif.
Para rastrear más de un script, use un archivo gif diferente para cada uno. O agregue algún tipo de parámetro de diferenciación a la URL (por ej., http://mysite.com/logo.gif?zippyver=1.0
).
Los datos pueden persistir entre cargas de página al almacenarlo como un valor de preferencia de mozilla a través de GM_setValue(keyname, value)
.
Aquí hay un ejemplo simple que cuenta la cantidad de veces que se ejecutó su secuencia de comandos: mediante un navegador determinado:
var od = GM_getValue("odometer", 0); od++; GM_setValue("odometer", od); GM_log("odometer=" + od);
Los valores de GM son análogos a las cookies, en que los valores de las cookies solo pueden accederse desde el dominio original, solo se puede acceder a los valores de GM mediante el script que los creó.
Los scripts de Greasemonkey a menudo necesitan buscar contenido en una página. En lugar de explorar el DOM, intente utilizar XPath para localizar nodos de interés. El método document.evaluate()
permite proporcionar una expresión XPath y devolverá una colección de nodos coincidentes. Aquí hay un buen tutorial para que comiences. Como ejemplo, aquí hay un script que escribí que hace que los enlaces en las publicaciones phpBB3 se abran en una nueva pestaña (en el skin por defecto):
// ==UserScript==
// @name New Tab in phpBB3
// @namespace http://robert.walkertribe.com/
// @description Makes links in posts in phpBB3 boards open new tabs.
// ==/UserScript==
var newWin = function(ev) {
var win = window.open(ev.target.href);
if (win) ev.preventDefault();
};
var links = document.evaluate(
"//div[@class=''content'']//a[not(@onclick) and not(@href=''#'')]",
document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = 0; i < links.snapshotLength; i++) {
var link = links.snapshotItem(i);
link.addEventListener("click", newWin, true);
}
La expresión XPath utilizada en el código identifica todos los elementos que 1) no tienen un atributo onclick
, 2) cuyo atributo href
no está configurado como "#"
, y 3) se encuentran dentro de div
s cuyo atributo de class
se establece en "content"
.
Su secuencia de comandos puede agregar gráficos a una página, incluso si no tiene ningún lugar para alojar archivos, a través de URI de datos.
Por ejemplo, aquí hay un pequeño botón gráfico:
var button = document.createElement("img"); button.src = "data:image/gif;base64," + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx" + "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==" somenode.appendChild(button);
Aquí hay un codificador de imágenes en línea.
Y un artículo de wikipedia sobre el estándar URI de datos.
Una técnica útil de XPath es especificar su coincidencia relativa a un nodo que ya ha encontrado. Como un ejemplo artificial para :
// first we got the username link at the top of the page var hdrdiv = document.evaluate( "//div[@id=''headerlinks'']/a[1]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; // now we can retrieve text that follows it, (user''s reputation score) // (note that hdrdiv is now the contextNode argument, rather than document) var reptext = document.evaluate( "following-sibling::span", hdrdiv, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; alert("Reputation Score: " + reptext.textContent);
Puede coincidir en cualquier dirección relativa al contextoNodo, ancestros, descendientes, anterior, siguiente. Aquí hay una referencia útil de XPath .
Los scripts de GreaseMonkey se ejecutan cuando el DOM está listo, por lo que no necesita agregar eventos de carga, simplemente comienza a manipular el DOM directamente en su script de GreaseMonkey.
==UserScript==
...
@require http://ajax.googleapis.com/ajax/framework-of-your/choice.js
==/UserScript==
GM_setValue normalmente solo almacena enteros, cadenas y booleanos de 32 bits, pero puede aprovechar el método uneval () (y una posterior evaluación () en la recuperación) para almacenar cualquier objeto. Si está tratando con valores JSON puros (en lugar de objetos JavaScript), use JSON.stringify para almacenar y JSON.parse para recuperar; esto será más rápido y más seguro.
var foo={people:[''Bob'',''George'',''Smith'',''Grognak the Destroyer''],pie:true};
GM_setValue(''myVeryOwnFoo'',uneval(foo));
var fooReborn=eval(GM_getValue(''myVeryOwnFoo'',''new Object()''));
GM_log(''People: ''+fooReborn.people+'' Pie:''+fooReborn.pie);
Tiendo a usar "nuevo Objeto ()" como mi valor predeterminado en este caso, pero también puede usar "({})". Solo recuerde que "{}" se evalúa como una cadena, no como un objeto. Como de costumbre, eval () con cuidado.
Los valores de encabezado de script, (@name, @description, @version, etc.), pueden hacerse recuperables. Esto es preferible a mantener los mismos valores constantes en múltiples lugares en su secuencia de comandos.
Consulte ¿Cómo acceder a los metadatos de Greasemonkey desde su script?