2012-05-04 12 views
5

Pracuję nad skryptem Greasemonkey, aby zamienić tekst w linki na stronie a Rally. Skrypt działa dobrze tylko po przeładowaniu strony. Jeśli przejdę do strony w dowolny sposób (linki, przeglądarka do przodu/do tyłu) skrypt nie działa, pomimo że menu Greasemonkey pokazuje mój skrypt na dole, z zaznaczeniem.Skrypt Greasemonkey działa tylko po przeładowaniu strony

Oto przykład URL:

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

Moja dopasowanie zasada:

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

Nie wiem, czy mieszania jest przyczyną problemu, ale wszystko jest w porządku, kiedy przeładować.

Nie wiesz, dokąd się udać. Każda pomoc jest doceniana.

+1

Jeśli działa przy ponownym ładowaniu, to wątpię, czy dopasowanie ma znaczenie ... –

+0

Zgadzam się, uwzględniłem te informacje, ponieważ pomyślałem, że ktoś zapyta. :) – neilw

Odpowiedz

7

Nie można mieć pewności, co się dzieje, ponieważ strona docelowa znajduje się za ścianą, a rzekomy mechanizm "Bezpłatnej próby" wysadza w powietrze porcje.

Oto kilka możliwych przyczyn obecnego zachowania:

  1. Początkowy wniosek jest niepewny (http), ale przekierowuje do bezpiecznej stronie (https).
  2. Załadowanie pierwszej strony powoduje inny rodzaj przekierowania do rzeczywistej strony.
  3. Treść docelowa jest w postaci , która nie ładuje się od razu.
  4. Treść docelowa jest AJAXed-in.
  5. Coś egzotycznego, czego potrzebujemy, aby zobaczyć rzeczywistą stronę, aby dowiedzieć się.
  6. Początkowy adres URL tak naprawdę nie kończy się na changesets.

Również dostać się do nawyku ucieczki / S w środkowej wyrażeń regularnych. Nie zawsze jest to potrzebne, ale w końcu cię ugryzie w [cenzurze], jeśli tego nie zrobisz. Więc skrypt powinien używać:

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

zacząć, ale patrz niżej.


kroków do rozwiązania:

  1. zmienić @include celu uwzględnienia http oraz możliwość spływu miejsca lub końcowe ukośnik w adresie URL. Zastosowanie:

    // @include /^https?:\/\/.*\.rallydev\.com\/.*\/changesets(?:\s|\/)*$/ 
    
  2. Sprawdź stronę z Firebug. Czy zawartość AJAXed-in? Czy to jest w ? Jeśli tak, to jaki jest adres URL elementu iframe? Aby wykryć AJAX i/lub przekierowania, użyj i/lub Wireshark
  3. Jeśli to możliwe, podaj dane logowania, abyśmy mogli zobaczyć problematyczną stronę.
  4. Zrzut ekranu z problematyczną stroną (zapisz ją przez Firefox) i link do tego kodu HTML i JS w Pastebin.com.
  5. rozważyć przy użyciu kodu jak:

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

    Aby uruchomić skrypt tylko (lub nie) iframe, jak zastosowanie.


Jeśli problem jest spowodowany opóźnieniami AJAX (lub załadunku nowej treści), poruszać się, że za pomocą the waitForKeyElements() utility jak pokazano na "Fire Greasemonkey script on AJAX request".

+1

To było niezwykle pomocne, dziękuję bardzo. To był problem z AJAX, chociaż początkowo byłem oszukany przez sposób, w jaki łącza zostały skonfigurowane na stronie. Próbowałem użyć waitForKeyElements(), stosując regułę do całej domeny i wydaje się, że działa. Jest trochę ciężki (nie chciałbym ładować jQuery), ale działa i wydaje się być niezawodny. Dzięki za pakiet. – neilw

+1

Nie ma za co. Kiedyś myślałem o stworzeniu 'waitForKeyElements', które nie wymagało jQuery, ale wszystkie poza najprostszym z moich skryptów i tak używają jQuery. Nie jest tak ciężki, zwłaszcza, że ​​GM uruchamia go z twojego lokalnego komputera, kiedy używasz dyrektywy '@ require'. A niesamowita dobroć jQuery znacznie ułatwia pisanie skryptów. –

+1

Dziękuję wszystkim zaangażowanym. Pracuję z procesem płatności Amazon i początkowo nie zdawałem sobie z tego sprawy, ale to AJAX ładuje każdą "stronę" i zmienia adres URL za pomocą 'window.location.pathname'. Zaktualizowałem swój skrypt tak, aby @ uwzględnić dowolną stronę w procesie i łatwo ją przekonwertować, aby używał 'waitForKeyElements'. To 3-minutowe rozwiązanie tego, co byłoby koszmarnym debugowaniem. –

Powiązane problemy