2012-05-04 5 views
5

Sto lavorando a uno script Greasemonkey per trasformare del testo in collegamenti su una pagina a Rally. Lo script funziona bene solo quando ricarico la pagina. Se accedo alla pagina in qualsiasi modo (link, browser avanti/indietro) lo script non viene eseguito, nonostante il menu Greasemonkey mostri il mio script in fondo, con un segno di spunta.Lo script Greasemonkey viene eseguito solo quando la pagina viene ricaricata

Ecco un esempio di URL:

https://rally1.rallydev.com/#/4745909548/detail/userstory/6138899084/changesets 

La mia regola di corrispondenza:

/^https://.*\.rallydev\.com/.*/changesets$/ 

non so se l'hash sta causando un problema, ma tutto va bene quando ricarico.

Non so da dove andare. Qualsiasi aiuto è apprezzato.

+1

Se funziona su una ricarica allora dubito che l'abbinamento sarebbe importante ... –

+0

D'accordo, stavo includendo quell'informazione perché ho pensato che qualcuno avrebbe chiesto. :) – neilw

risposta

7

È impossibile essere sicuri di cosa sta succedendo, perché le pagine di destinazione sono dietro un muro di pagamento e il loro presunto meccanismo di "prova gratuita" fa saltare pezzi.

Ecco alcune possibili cause del comportamento attuale:

  1. La richiesta iniziale è insicuro (http), ma reindirizza a una pagina sicura (https).
  2. Il primo caricamento della pagina esegue un altro tipo di reindirizzamento alla pagina effettiva.
  3. Il contenuto di destinazione è in un che non viene caricato immediatamente.
  4. Il contenuto di destinazione è AJAXed-in.
  5. Qualcosa di esotico che avremmo bisogno di vedere la pagina attuale per capire.
  6. L'URL iniziale in realtà non termina con changesets.

Inoltre, ottenere l'abitudine di sfuggire alle / s nel mezzo delle espressioni regolari. Non è sempre necessario, ma alla fine ti morderà nel [censurato] se non lo fai. Quindi lo script dovrebbe usare:

// @include /^https:\/\/.*\.rallydev\.com\/.*\/changesets$/ 

per iniziare, ma vedere di seguito.


Passi per una soluzione:

  1. cambiare la vostra @include per tenere conto di http e la possibilità di trailing spazio o slash nell'URL. Utilizzare:

    // @include /^https?:\/\/.*\.rallydev\.com\/.*\/changesets(?:\s|\/)*$/ 
    
  2. Esaminare la pagina con Firebug. Il contenuto è AJAXed-in? È in un ? In tal caso, qual è l'URL iframe, se presente?
  3. Per rilevare anche AJAX e/o reindirizzamenti, utilizzare Firebug's Net panel e/o Wireshark.
  4. Se possibile, fornirci le credenziali di accesso in modo da poter visualizzare una pagina problematica.
  5. Istantanea di una pagina problematica (salvata tramite Firefox) e collegamento a tale HTML e JS in Pastebin.com.
  6. Considerare l'utilizzo di un codice simile:

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

    Per avere lo script eseguito solo a (o non) iframe, a seconda dei casi.


Se il problema è causato da ritardi AJAX (o caricamento di nuovi contenuti), aggirare che utilizzando the waitForKeyElements() utility come mostrato in "Fire Greasemonkey script on AJAX request".

+1

Questo è stato monumentalmente utile, grazie mille. Si trattava di un problema AJAX, anche se inizialmente mi sono lasciato ingannare dal modo in cui i collegamenti sono stati configurati sulla pagina. Ho provato a utilizzare waitForKeyElements(), applicando la regola all'intero dominio e sembra funzionare. È un po 'pesante (vorrei non aver bisogno di caricare jQuery), ma funziona e sembra essere affidabile. Grazie un pacco. – neilw

+1

Prego. Una volta ho pensato di creare un 'waitForKeyElements' che non richiedesse jQuery, ma tutti, tranne il più semplice dei miei script, usano comunque jQuery. Non è così pesante, specialmente dal momento che GM lo fa partire dalla tua macchina locale quando usi la direttiva '@ require'. E l'incredibile bontà di jQuery rende lo scripting molto più semplice. –

+1

Grazie mille a tutti i partecipanti. Sto lavorando con il processo di checkout di Amazon e all'inizio non me ne sono reso conto, ma sono AJAX che carica ciascuna "pagina" e modifica l'URL tramite 'window.location.pathname'. Ho aggiornato il mio script in @include qualsiasi pagina nel processo e l'ho facilmente convertito in "waitForKeyElements". È una soluzione di 3 minuti per quello che sarebbe stato un enorme incubo di debug. –