私はこの質問が古いことを知っていますが、誰かがまだこれに問題を抱えている場合に備えて、私にとってはうまくいくと思われる解決策を見つけました.
基本的に、unloadイベントはイベントの後に発生しbeforeunloadます。これを使用して、beforeunloadイベントで作成されたタイムアウトをキャンセルし、jAndy の回答を変更できます。
$(function() {
    var beforeUnloadTimeout = 0 ;
    $(window).bind('beforeunload', function()  {
        console.log('beforeunload');
        beforeUnloadTimeout = setTimeout(function() {
            console.log('settimeout function');
            $(document.body).css('background-color', 'red');
        },500);
        return 'are you sure';
    });
    $(window).bind('unload', function() {
        console.log('unload');
        if(typeof beforeUnloadTimeout !=='undefined' && beforeUnloadTimeout != 0)
            clearTimeout(beforeUnloadTimeout);
    });
}); 
編集: ここにjsfiddle