2013-03-07 18 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

あなたは遅延イベント処理を探しています。

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); 

これは上のすべてののリンクをことができ、それは以下のコードであるように私は、jQueryのを使用して説明しますあなたのページはbeforeunloadハンドラを呼び出さずに離れるべきです。私はあなたがこれをカスタマイズする方法を見つけ出すことができると確信しています、あなたは特定のリンクのためにこれを許可したいのですか?

+0

これは、返信のための素晴らしい感謝です。私はjQueryなしでこれを使用しようとしています - そして、私はpoormansの実装をどのように統合するかを理解しようとしていますが、それを理解できないようです(私を許してください、私はJS newbです)。 – mirin

+0

あなたのコードは半右でした。私は完全な答えで質問に答えました。 – mirin

+0

IEで動作させるのに問題がある人は、nullではなくundefinedを返す必要があります。 ieとchromeの両方で動作します。 – Janspeed

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のを使用して

例:(Chromeでテストした)

$('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!'; 
    } 
}); 

関連する問題