2013-07-25 17 views
5

Questo semplice codice non funziona su una pagina di Facebook. Questo codice avvisa solo quando aggiorno the page. Se vado a quella pagina da my Facebook profile, con il mio mouse; La sceneggiatura smette di funzionare.Il mio userscript funziona solo quando la pagina viene aggiornata o sugli iframe, non sulla pagina principale?

Non ci sono avvisi o errori. :(
Sembra che l'intero script non funziona fino a quando rinfresco

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

Ho provato anche questo, tra le altre cose:.

// ==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

Questo genera un avviso sulla finestra principale, nessun problema. Non si attiva sugli iframe perché non sono coperti dalle direttive '@ include'. Concatenare il 'setTimeout' causerà comunque il blocco del browser/arresto degli iframe. Non farlo! Come, *** esattamente ***, questo script non funziona in "Finestra principale"? –

+0

no .. non funziona sulla finestra principale. questo era il mio script di test ... ho letto tutte le tue risposte e i forum su userscripts.org .. mi sto tirando i capelli proprio ora. – Arda

+0

L'ho provato; Funziona sulla finestra principale. Come stai chiamando la finestra principale? Fornisci: (1) URL del test esatto, (2) Comportamento previsto, (3) Comportamento effettivo. –

risposta

4

Il problema è uno AJAX Quando si. digita l'URL, o aggiorna la pagina, lo script funziona.Quando fai clic sul pulsante "Registro attività", lo script non lo fa.I iframe non sono un fattore per i sintomi che segnali

Questo perché si fa clic su link, non carica mai una nuova pagina, ma trigg le chiamate AJAX che sostituiscono parte del contenuto, rendendo look come una nuova pagina, ma non lo è.

Quindi, se si desidera che lo script venga attivato su "nuove" "pagine principali", è necessario utilizzare tecniche come quelle in this answer.

Nel caso di Facebook, l'unica cosa che in genere cambia è l'URL segnalato (ma senza attivazione hashchange!) E il contenuto del div #mainContainer.

È inoltre necessario @include tutte le pagine FB perché le pagine come https://www.facebook.com/*/allactivity* sono spesso raggiungibili solo tramite la tecnologia AJAX, quindi lo script necessario per essere in esecuzione sul precedente pagina.

Questo script risolverà il problema posto nella tua domanda:

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


Tuttavia, dal momento che la pagina è pesantemente ajaxed, troverete che la cottura quando la pagina viene caricata sarà quasi sempre troppo presto.

La cosa intelligente da fare è utilizzare waitForKeyElementssulla parte specifica della pagina che ti interessa davvero. (che non è stato indicato nella domanda.)

Here's an example of using waitForKeyElements. notare che per utilizzare @require in Chrome, è necessario essere utilizzando Tampermonkey (che si dovrebbe fare in ogni caso).

+0

grazie mille per il tuo aiuto – Arda

+0

Prego. Sono contento di averlo raddrizzato. –

Problemi correlati