2012-05-04 9 views
5

Ich arbeite an einem Greasemonkey-Skript, um einen Text in Links auf einer a Rally-Seite umzuwandeln. Das Skript funktioniert gut nur wenn ich die Seite neu lade. Wenn ich auf irgendeine Weise zur Seite navigiere (Links, Browser vorwärts/zurück), wird das Skript nicht ausgeführt, obwohl das Greasemonkey-Menü mein Skript unten mit einem Häkchen anzeigt. HierGreasemonkey-Skript wird nur ausgeführt, wenn die Seite neu geladen wird

ist ein Beispiel URL:

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

Meine passende Regel:

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

Ich weiß nicht, ob der Hash ein Problem verursacht, aber alles ist in Ordnung, wenn ich neu laden.

Nicht sicher wohin von hier zu gehen. Jede Hilfe wird geschätzt.

+1

Wenn es auf einem Nachladen funktioniert, dann bezweifle ich, ob der Abgleich von Bedeutung wäre ... –

+0

Zustimmen, ich habe diese Info aufgenommen, weil ich dachte, dass jemand fragen würde. :) – neilw

Antwort

7

Es ist unmöglich, sicher zu sein, was passiert, weil die Zielseite (n) sich hinter einer Pay-Wall befinden und ihr angeblicher "Free Trial" -Mechanismus Bruchteile bläst.

Hier sind einige mögliche Ursachen für das aktuelle Verhalten:

  1. Die erste Anforderung ist unsicher (http), sondern leitet auf eine sichere Seite (https).
  2. Die erste Seite lädt eine andere Art der Umleitung auf die eigentliche Seite.
  3. Der Zielinhalt ist in , die nicht sofort lädt.
  4. Der Zielinhalt ist AJAXed-in.
  5. Etwas Exotisches, das wir brauchen, um die tatsächliche Seite zu sehen, herauszufinden.
  6. Die ursprüngliche URL endet nicht wirklich in changesets.

Auch in die Gewohnheit zu entkommen die / s im Mitte von regulären Ausdrücken. Es wird nicht immer benötigt, aber es wird dich schließlich in der [Zensur] beißen, wenn du es nicht tust. So sollte das Skript verwenden:

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

zu starten, aber unten sehen.


Schritte zu einer Lösung:

  1. Ihre @include Ändern Sie für http Rechnung zu tragen und die Möglichkeit der Raumhinter oder in der URL Slash am Ende. Verwendung:

    // @include /^https?:\/\/.*\.rallydev\.com\/.*\/changesets(?:\s|\/)*$/ 
    
  2. Untersuchen Sie die Seite mit Firebug. Ist der Inhalt AJAX-in? Ist es in einem ? Wenn ja, wie lautet die Iframe-URL?
  3. Zur Erkennung auch AJAX und/oder Umleitungen, verwenden Firebug's Net panel und/oder Wireshark.
  4. Wenn möglich, geben Sie uns die Anmeldeinformationen, damit wir eine problematische Seite sehen kann.
  5. Snapshot eine problematische Seite (speichern Sie es über Firefox) und Link zu diesem HTML und JS in Pastebin.com.
  6. Betrachten Code wie:

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

    das Skript nur ausgeführt haben, in (oder nicht in) iframes, soweit zutreffend.


Wenn das Problem durch AJAX Verzögerungen (oder Laden von neuen Inhalten) verursacht wird, zu umgehen, dass, wie durch die Verwendung the waitForKeyElements() utility in "Fire Greasemonkey script on AJAX request" gezeigt.

+1

Das war monumental hilfreich, vielen Dank. Es war ein AJAX-Problem, obwohl ich anfangs durch die Art und Weise getäuscht wurde, wie die Links auf der Seite konfiguriert wurden. Ich habe versucht, mit waitForKeyElements(), die Regel auf die gesamte Domäne anwenden, und es scheint zu funktionieren. Es ist ein bisschen Schwergewicht (wünschte, ich hätte jQuery nicht laden müssen), aber es funktioniert und scheint zuverlässig zu sein. Danke ein Bündel. – neilw

+1

Gern geschehen. Ich habe einmal darüber nachgedacht, ein 'waitForKeyElements' zu erstellen, das jQuery nicht benötigt, aber alle außer den einfachsten Skripten verwenden jQuery trotzdem. Es ist nicht dieses Schwergewicht, besonders seit GM es von Ihrem lokalen Rechner aus startet, wenn Sie die '@ require' Direktive verwenden. Und die unglaubliche Güte von jQuery macht Scripting so viel einfacher. –

+1

Vielen Dank an alle Beteiligten. Ich arbeite mit Amazons Checkout-Prozess und ich habe es zuerst nicht bemerkt, aber sie sind AJAX Laden jeder "Seite" und Ändern der URL über 'window.location.Patchname'. Ich habe mein Skript aktualisiert, um eine Seite in den Prozess zu integrieren und es einfach in "waitForKeyElements" zu konvertieren. Es ist eine 3-Minuten-Lösung für einen massiven Debugging-Albtraum. –