2012-06-09 23 views
5

Mi piace il concetto di GM, ma in pratica a meno che non lo si utilizza tutto il tempo e sei un dio JS assoluta è impossibile da usare (forse sono io che schifo?).semplice alternativa al Greasemonkey

Sarebbe così utile avere un po 'di estensione che ha avuto poche righe di JS e li rincorse caricamento della pagina per un determinato sito. Ma non è quello che fa GM. Con GM hai a che fare con cornici multiple e questi strati su strati di fastidiosi problemi di sicurezza e portata. Anche quando si ignora la procedura corretta e si utilizza unssafewindow o uno degli altri hack, spesso non funziona ancora.

è così facile a venire con JS che è possibile eseguire nella console del browser che farà ciò che si vuole, ma questo non funziona mai quando vengono trasferiti su un userscript. c'è qualche impostazione in greasemonkey che posso cambiare o un'estensione diversa interamente orientata alla facilità d'uso?

Nota: io uso Chrome, in modo da punti bonus per una soluzione che funziona per quel particolare browser.

Summery: Voglio un modo per eseguire automaticamente script con portata identica/autorizzazioni come la console su pagine specifiche.

+3

[Bookmarklets] (http://en.wikipedia.org/wiki/Bookmarklet). Vedi anche http://www.bookmarklets.com/, oltre a molti altri, incluso un [sito Stackapps] (http://stackapps.com/). –

+0

Ah, quindi questo è quello che sono. Questi potrebbero essere utili in molte situazioni, ma ciò che è così importante per gli script degli utenti è che vengono eseguiti automaticamente sulle pagine desiderate. – Jonathon

+0

Sì, il jsFiddle ["tidy up" bookmarklet] (http://blog.jsfiddle.net/post/413517861/a-tidy-up-bookmarklet) è particolarmente utile per me. –

risposta

7

Non c'è più semplice alternativa al Greasemonkey di Firefox o di userscripts di Chrome che viene eseguito automaticamente utente JS. Potresti write your own extension/add-on, ma non ci sarebbe molto da fare.

Se non ti interessa la straordinaria potenza extra fornita da GM e dagli script utente e vuoi sempre solo "(prendere) alcune righe di JS e (eseguirle) dopo il caricamento della pagina per un determinato sito" - ignorando iframe, poi basta usare il seguente codice come base-modello per tutti i tuoi script:

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

si noti che il @run-at document-start è necessario (per Chrome), ma il vostro codice sarà ancora sparare con carico documento.

+0

Sì, e come ho detto anche con i workarounds (non sicuro ..., iniezione, e uso della barra degli indirizzi) in situazioni pratiche, trovo che niente funzioni mai. Questo non era diverso per la mia situazione particolare ora: "$ Acb.close ('Ad160x600_0', InboxPage.onSkyscraperClose);" su hotmail.com (l'auto fa clic sul link dell'annuncio chiuso per darti più spazio sullo schermo). funziona perfettamente nella console ogni volta. – Jonathon

+1

La tua alternativa "più semplice" fallirebbe allo stesso modo. In quella pagina, apparentemente c'è un ritardo AJAX prima che la funzione desiderata sia disponibile.Se "funziona dalla console", è perché lo si esegue diversi secondi dopo il caricamento della pagina. La soluzione consiste nell'utilizzare un timer per attendere un altro paio di secondi (o comunque a lungo) o per eseguire il polling del codice di destinazione come nella seconda parte di [questa risposta] (http://stackoverflow.com/a/6935777/331,508 mila). I ritardi di AJAX dipendono sempre molto da dettagli pagina per pagina. Non esiste un approccio più semplice. –

+0

Ho appena trascorso un'ora a provare a far funzionare una semplice sceneggiatura. sei una manna dal cielo – muhammedabuali