2013-07-25 6 views
5

Dieser einfache Code funktioniert nicht auf einer Facebook-Seite. Dieser Code warnt nur, wenn ich the page aktualisiere. Wenn ich von my Facebook profile auf diese Seite gehe, mit meiner Maus; Das Skript funktioniert nicht mehr.Mein Benutzerkonto funktioniert nur, wenn die Seite aktualisiert wird oder auf iframes, nicht auf der Hauptseite?

Es gibt keine Warnungen oder Fehler. :(
Es sieht aus wie das ganze Skript nicht funktioniert, bis ich refresh

// ==UserScript== 
// @name Purge My Facebook 
// @namespace http://www.arda.com 
// @description test 
// @include https://*.facebook.com* 
// @include http://*.facebook.com* 
// @version 1 
// ==/UserScript== 
window.setTimeout (isParent, 500); 

function isParent() { 

    if (window.self == window.top) { 
     alert ("main window"); 
    } else 
     window.setTimeout (isParent, 500); 
} 

ich das auch versucht, unter anderem:.

// ==UserScript== 
// @name  Purge My Facebook 
// @namespace http://www.arda.com 
// @description test 
// @include  http://www.facebook.com/*/allactivity* 
// @include  https://www.facebook.com/*/allactivity* 
// @version  1 
// ==/UserScript== 

try{ 
    if (window.self == window.top) 
    alert(document.domain+"\nmain window"); 
    else 
    alert(document.domain+"\nin a iframe"); 
} 
catch(e){ 
    alert(document.domain+"\nHad a problem:\n"+e); 
} 
+0

Dies gibt eine Warnung auf dem Hauptfenster, kein Problem. Es wird nicht auf iFrames ausgelöst, da sie nicht von den @ include-Direktiven abgedeckt sind. Die Verkettung von 'setTimeout' führt nur dazu, dass der Browser bei Iframes einfriert/abstürzt. Tu das nicht! Wie, *** genau, funktioniert dieses Skript nicht im "Hauptfenster"? –

+0

nein .. es funktioniert nicht am Hauptfenster. Das war mein Testskript .. Ich las alle deine Antworten und Foren auf userscripts.org .. ich ziehe gerade meine Haare. – Arda

+0

Ich habe es getestet; Es funktioniert am Hauptfenster. Wie heißt das Hauptfenster? Geben Sie: (1) Genaue Test-URL, (2) Erwartetes Verhalten, (3) Tatsächliches Verhalten. –

Antwort

4

Das Problem ist ein AJAX Wenn Sie. Geben Sie die URL ein, oder aktualisieren Sie die Seite, Ihr Skript funktioniert. Wenn Sie auf die Schaltfläche "Aktivitätsprotokoll" klicken, wird das Skript nicht angezeigt. Iframes sind kein Faktor für die von Ihnen berichteten Symptome.

Dies ist, weil Sie auf das klicken Link, lädt nie eine neue Seite; es trigg AJAX-Aufrufe, die einen Teil des Inhalts ersetzen, machen es aussehen wie eine neue Seite, aber es ist nicht.

Also, wenn Sie Ihr Skript auf "neue" "Hauptseiten" feuern möchten, müssen Sie Techniken wie diese in this answer verwenden.

Bei Facebook ändert sich normalerweise nur die gemeldete URL (aber ohne die Hash-Änderung!) Und der Inhalt der #mainContainer div.

Sie müssen auch @include alle FB-Seiten, weil Seiten wie https://www.facebook.com/*/allactivity* sind oft nur über AJAX erreicht, so dass Ihr Skript benötigt auf der vorherigen Seite ausgeführt werden.

Dieses Skript wird das Problem aufgeworfen in Ihrer Frage lösen:

// ==UserScript== 
// @name  Purge My Facebook 
// @namespace http://www.ardaterekeci.com 
// @description test 
// @include  http://www.facebook.com/* 
// @include  https://www.facebook.com/* 
// @version  1 
// ==/UserScript== 

var pageURLCheckTimer = setInterval (
    function() { 
     if ( this.lastPathStr !== location.pathname 
      || this.lastQueryStr !== location.search 
      || this.lastPathStr === null 
      || this.lastQueryStr === null 
     ) { 
      this.lastPathStr = location.pathname; 
      this.lastQueryStr = location.search; 
      gmMain(); 
     } 
    } 
    , 222 
); 

function gmMain() { 
    if (window.self === window.top) 
     alert ('"New" main (top) page loaded.'); 
    else 
     alert ('"New" iframed page loaded.'); 
} 


jedoch da die Seite stark AJAXed ist, können Sie dieses Brennen finden, wenn die Seite geladen wird fast immer wird zu früh.

Die intelligente Sache zu tun ist, waitForKeyElementsauf dem spezifischen Teil der Seite zu verwenden, die Sie wirklich interessieren. (die nicht in der Frage angegeben wurde.)

Here's an example of using waitForKeyElements. Beachten Sie, dass @require in Chrome zu verwenden, müssen Sie Tampermonkey verwenden werden (die man sowieso tun sollten).

+0

Vielen Dank für Ihre Hilfe – Arda

+0

Gern geschehen. Ich bin froh, dass wir es geklärt haben. –

Verwandte Themen