2013-03-07 69 views
5

我有window.onbeforeunload正確觸發。它顯示一個確認框,以確保用戶知道他們正在瀏覽(關閉)窗口,並且任何未保存的作品都將被刪除。當window.onbeforeunload被觸發時如何檢測鏈接是否被點擊?

我有一個獨特的情況,我不希望這觸發如果用戶通過單擊鏈接導航離開頁面,但我無法弄清楚如何檢測鏈接是否已被點擊功能停止功能。這是我對代碼:

window.onbeforeunload = function() { 
var message = 'You are leaving the page.'; 

/* If this is Firefox */ 
if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { 
    if(confirm(message)) { 
    history.go(); 
    } 
    else { 
    window.setTimeout(function() { 
     window.stop(); 
    }, 1); 
    } 
} 
/* Everything else */ 
else { 
    return message; 
} 
} 

回答

6

你要找的延遲事件處理。我會解釋使用jQuery,因爲它是更少的代碼:

window._link_was_clicked = false; 
window.onbeforeunload = function(event) { 
    if (window._link_was_clicked) { 
    return; // abort beforeunload 
    } 
    // your event handling 
}; 

jQuery(document).on('click', 'a', function(event) { 
    window._link_was_clicked = true; 
}); 

(非常)窮人的實現,而不jQuery的便利代表團處理可能看起來像:

document.addEventListener("click", function(event) { 
    if (this.nodeName.toLowerCase() === 'a') { 
    window._link_was_clicked = true; 
    } 
}, true); 

這對允許所有鏈接您的頁面在不調用beforeunload處理程序的情況下離開。我相信你可以想出如何定製這個,如果你只想讓這個特定的鏈接(你的問題不是特別清楚)。

+0

這是您的答覆十分感謝。我試圖在沒有jQuery的情況下使用它 - 我試圖找出如何整合poormans的實現,但似乎無法弄清楚(原諒我,我是一個JS新手)。 – mirin 2013-03-08 15:00:52

+0

你的代碼是半正確的。我已經用完整的答案回答了這個問題。 – mirin 2013-03-09 16:42:42

+0

如果任何人有問題讓它在IE中工作,我不得不返回undefined而不是null。適用於ie和chrome。 – Janspeed 2017-03-29 06:53:23

3
var link_was_clicked = false; 
document.addEventListener("click", function(e) { 
    if (e.target.nodeName.toLowerCase() === 'a') { 
    link_was_clicked = true; 
    } 
}, true); 

window.onbeforeunload = function() { 
    if(link_was_clicked) { 
    link_was_clicked = false; 
    return; 
    } 
    //other code here 
} 
1

可以通過使用計時器的link unloadreload/user entering a different address unload S之間不同。這樣您就知道beforeunload是在鏈接點擊後直接觸發的。

實施例使用jQuery:

$('a').on('click', function(){ 
    window.last_clicked_time = new Date().getTime(); 
    window.last_clicked = $(this); 
}); 

$(window).bind('beforeunload', function() { 
    var time_now = new Date().getTime(); 
    var link_clicked = window.last_clicked != undefined; 
    var within_click_offset = (time_now - window.last_clicked_time) < 100; 

    if (link_clicked && within_click_offset) { 
    return 'You clicked a link to '+window.last_clicked[0].href+'!'; 
    } else { 
    return 'You are leaving or reloading the page!'; 
    } 
}); 

(Chrome中測試)

相關問題