2011-08-23 7 views
10

Ho un gestore per onbeforeunloadCome posso rilevare quando l'utente sta lasciando il mio sito, non solo andando a una pagina diversa?

window.onbeforeunload = unloadMess; 
function unloadMess(){ 
    var conf = confirm("Wait! Before you go, please share your stories or experiences on the message forum."); 
    if(conf){ 
    window.location.href = "http://www.domain.com/message-forum"; 
    } 
} 

ma non sono sicuro di come sapere se l'url cliccato sulla pagina è all'interno del sito.

Voglio solo che avvisino se lasceranno il sito.

+21

Si prega di non fare questo - sanno che stanno lasciando il sito - hanno fatto clic sul collegamento. Questo genere di cose è ciò che dà a javascript un brutto nome. –

+1

possibile duplicato di [Come posso ottenere l'URL di destinazione in evento onbeforeunload javascript?] (Http://stackoverflow.com/questions/1686687/how-can-i-get-the-destination-url-in-javascript-onbeforeunload -event) –

+0

2 voti UP? .... – Nivas

risposta

17

Non è possibile farlo al 100% in modo affidabile, ma se si rileva quando l'utente ha fatto clic su un collegamento nella pagina, è possibile utilizzarlo come segnale per lo più corretto. Qualcosa di simile a questo:

window.localLinkClicked = false; 

$("a").live("click", function() { 
    var url = $(this).attr("href"); 

    // check if the link is relative or to your domain 
    if (! /^https?:\/\/./.test(url) || /https?:\/\/yourdomain\.com/.test(url)) { 
     window.localLinkClicked = true; 
    } 
}); 

window.onbeforeunload = function() { 
    if (window.localLinkClicked) { 
     // do stuff 
    } else { 
     // don't 
    } 
} 
+1

Soluzione molto bella e discreta –

1

Ho un'idea, ma non so se funziona. Il mio suggerimento è, aggiungere ogni link un evento onClick con una chiamata di funzione. Questa funzione legge solo l'attributo href e lo memorizza in una variabile con ambito globale.

var clickedHrefAttrValue = ""; 
function getClickUrl(currentLink) 
{ 
    clickedHrefAttrValue = $(currentLink).attr("href"); 
    return true; 
} 

il codice HTML per i tag a deve essere assomiglia seguente:

<a href="<url>" onClick="getClickUrl(this)">Linktext</a> 

e nella vostra data funzione:

function getClickUrl() 
{ 
    if (clickedHrefAttrValue.indexOf("<your condition>" > -1) 
    { 
    //what ever you want do to 
    } 
} 

E 'solo un'idea, ma penso che sia vale la pena provarlo

0

Se si hanno problemi perché il vostro sito web può avere sia collegamenti locali assoluti che relativi, ho un'altra soluzione (usando jQuery):

Demo

/* EXTERNAL LINK WARNING 
=========================================*/ 
$('a').on('click', function(e){ 
    e.preventDefault(); 
    var url = $(this).attr('href'), 
     host = location.host;  
    if (url.indexOf(host) > -1 || url.indexOf('http','https') == -1){ 
     /* If we find the host name within the URL, 
       OR if we do not find http or https, 
       meaning it is a relative internal link 
      */ 
     window.location.href = url; 
    } else { 
     var warn = confirm('You\'re leaving the domain.\n\nAre you sure?'); 
     if(warn == true) { 
      window.location.href = url,'_blank'; 
     } else { 
      e.preventDefault; 
     } 
    } 
}); 
-1

Ci è una buona soluzione a questo che ho implementato nel mio sito di recente. Immagina questo, tutto quello che sta per essere nel tuo sito web che naviga l'utente sarà o un link (anchor tag), pulsante, immagine cliccabile o qualcosa su queste linee. Sicuramente non sarà l'elemento del corpo.

Ora ciò che accade quando un utente lascia il sito web, lui/lei può digitare in un url e premere invio, fare clic su un segnalibro o premere i pulsanti Indietro/Avanti.

Quando un utente fa fare quello, fare questo:

$(window).on('beforeunload', function(e)){ 
    if(e.target.activeElement.nodeName.toLowerCase() == 'body'){ 
     yourFunction(); 
}); 

Quello che succede è che il corpo diventa l'elemento attivo nel bersaglio in questi casi (quando l'utente lascia il sito web) e questo non è il caso quando l'utente fa clic sugli elementi navigabili del sito Web interno.

Questa è una soluzione semplice e pulita. Fammi sapere se affronti problemi.

+1

ma questa azione si verificherà anche durante l'aggiornamento .. – Gags

Problemi correlati