2012-06-09 27 views
5

Me encanta el concepto de GM, pero en la práctica, a menos que lo uses todo el tiempo y seas un dios absoluto de JS, es imposible de usar (¿tal vez solo aspiro?).Alternativa simple a Greasemonkey

Sería tan útil tener una pequeña extensión que tomara algunas líneas de JS y las ejecutara después de la carga de la página para un determinado sitio. Pero eso no es lo que hace GM. Con GM tiene que lidiar con múltiples marcos y esas capas en capas de problemas de seguridad y alcance molestos. Incluso cuando simplemente ignoras el procedimiento adecuado y usas una ventana insegura o uno de los otros hacks, a menudo todavía no funciona.

Es tan fácil crear JS que se puede ejecutar en la consola del navegador que hará lo que quiera, pero esto nunca funciona cuando se transfiere a un usuario. ¿Hay alguna configuración en greasemonkey que pueda cambiar o una extensión diferente completamente orientada a la facilidad de uso?

Nota: utilizo Chrome, por lo que los puntos de bonificación para una solución que funcione para ese navegador en particular.

Summery: quiero una manera de ejecutar automáticamente scripts con el mismo alcance/permisos que la consola en páginas específicas.

+3

[Bookmarklets] (http://en.wikipedia.org/wiki/Bookmarklet). También vea http://www.bookmarklets.com/, además de muchos otros, incluido un [sitio de Stackapps] (http://stackapps.com/). –

+0

Ah, eso es lo que son. Estos serían útiles en muchas situaciones, pero lo que es tan bueno acerca de los usuarios es que se ejecutan automáticamente en las páginas deseadas. – Jonathon

+0

Sí, el bookmarklet jsFiddle ["ordenar"] (http://blog.jsfiddle.net/post/413517861/a-tidy-up-bookmarklet) es particularmente útil para mí. –

Respuesta

7

No hay una alternativa más simple a Greasemonkey de Firefox o a las listas de usuarios de Chrome que ejecuta el usuario JS automáticamente. Podría write your own extension/add-on, pero no tendría mucho sentido.

Si no le importa la increíble potencia adicional que GM y los usuarios proporcionan y siempre quiere simplemente "(tomar) unas pocas líneas de JS y ejecutarlas después de la carga de la página para un determinado sitio" - ignorando iframes, a continuación, sólo tiene que utilizar el siguiente código como una base de plantilla para todos los scripts:

// ==UserScript== 
// @name _Base template for simple, cross-browser, JS injection. 
// @match *://YOUR_SERVER.COM/YOUR_PATH/* 
// @run-at document-start 
// ==/UserScript== 

if (window.top != window.self) //-- Don't run on frames or iframes. 
    return; 


function scriptMain() { 
    // PUT ALL OF YOUR CODE HERE, INCLUDING ANY FUNCTIONS YOU CREATE. 
    console.log ("Hello World!"); 
} 

window.addEventListener ("load", scriptMainLoader, false); 

function scriptMainLoader() { 
    addJS_Node (null, null, scriptMain); 
} 

function addJS_Node (text, s_URL, funcToRun) { 
    var D         = document; 
    var scriptNode       = D.createElement ('script'); 
    scriptNode.type       = "text/javascript"; 
    if (text)  scriptNode.textContent = text; 
    if (s_URL)  scriptNode.src   = s_URL; 
    if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; 

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; 
    targ.appendChild (scriptNode); 
} 

cuenta que se requiere la @run-at document-start (para Chrome), pero el código todavía se disparará a la carga de documentos.

+0

Sí, y como dije incluso con las soluciones (inseguras ..., inyección, y uso de la barra de direcciones) en situaciones prácticas, encuentro que nada funciona. Esto no fue diferente para mi situación particular ahora: "$ Acb.close ('Ad160x600_0', InboxPage.onSkyscraperClose);" en hotmail.com (hace clic automáticamente en el enlace de anuncio cerrado para darle más espacio en la pantalla). funciona perfecto en la consola todo el tiempo. – Jonathon

+1

Su alternativa "más simple" fallaría de la misma manera entonces. En esa página, aparentemente hay un retraso AJAX antes de que la función que desea esté disponible.Si "funciona desde la consola", es porque lo ejecuta varios segundos después de que la página se haya cargado. La solución es usar un temporizador para esperar un par de segundos adicionales (o el tiempo que tarde), o para buscar el código objetivo como en la segunda parte de [esta respuesta] (http://stackoverflow.com/a/6935777/331508). Los retrasos AJAX siempre dependen en gran medida de los detalles página por página. No hay un enfoque más simple. –

+0

Acabo de pasar una hora tratando de hacer funcionar un script simple. eres un regalo del cielo – muhammedabuali