2011-12-14 5 views
0

私のテストでは、Chromeを(おそらく他のWebkitブラウザと同じように)AJAXリクエストをページから出す前に実行できません。onunload/onbeforeunloadで安全にAJAXをやっているWebkit(ChromeやSafari)の方法

たとえば、ユーザーがリンクをクリックしたか、ページを離れたため、サーバー上の何かをクリーンアップする必要があるとします。

私が最初に気づいがwindow.onunloadがChromeでとにかく動作しないということである(?のWebkit)

あなたは、このような体内に入れないようにしてくださいwindow.onbeforeunload使用していたら:それは原因無視されます。あなたはwindow.onbeforeunload = function(){...}を使ってバインディングが完了したことを確認してください(またはjqueryやプロトタイプのlibsを使用してください)

WITHIN前のコードをコンパイルするとこのようなAYAXは動作しません次のいずれか

var req = new XMLHttpRequest(); 
req.open("GET", "dosomething.page"); 
req.send(null); 

(これはFirefoxで動作しますが)

要求は、同期このよう作られている場合のみならばそれは動作します:

var req = new XMLHttpRequest(); 
req.open("GET", "dosomething.page",false); 
req.send(null); 

が、サーバーが応答しない場合、同期によってブラウザーが2分間停止する可能性があることに注意してください。

また、Firefoxはonunloadで動作しないようです。

最後に、各ブラウザまたはブラウザファミリに異なるコードパスを指定する必要があります。

これでIEを正しくテストできませんでした。 誰も知っていますか? IEはこれのChromeやFFによく似ていますか? それとも両方とも違うのですか?

答えて

0

IEは、この特定のケースでは、単にFirefoxの(ゲッコー)のように動作するようです:

このコードを使用すると、それがWebKitを、FirefoxとIEのために働くことができます:テスト用HTMLは可能性があり

// Browser detection 
var Browser={ 
    IE:  !!(window.attachEvent && !window.opera), 
    Opera: !!window.opera, 
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, 
    Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1, 
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) 
}; 

// Ensures the Ajax Get is performed... Asynchronously if possible 
// or Synchronously in WebKit Browsers (otherwise it'll most probably fail) 
function ensureAJAXGet(url, args) { 
    var async=!Browser.WebKit; 
    var finalUrl=url; 
    var sep=""; 
    for (var key in args) { 
     sep=(sep=="?")?"&":"?"; 
    finalUrl=finalUrl+sep+encodeURIComponent(key)+"="+encodeURIComponent(args[key]); 
    } 
    var req = new XMLHttpRequest(); 
    req.open("GET", finalUrl,async); 
    req.send(); 
    return req; 
} 

// Sets up an unload function for all browsers to work (onunload or onbeforeunload) 
function onUnload(func) { 
    if(Browser.WebKit) { 
     window.onbeforeunload=func;  
    } else { 
     window.onunload=func; 
    } 
} 

この:

var browser="?" 
if (Browser.IE) { 
    browser="IE"; 
} else if (Browser.Opera) { 
    browser="Opera"; 
} else if (Browser.WebKit) { 
    browser="WebKit"; 
} else if (Browser.Gecko) { 
    browser="Gecko"; 
} else if (Browser.MobileSafari) { 
    browser="MobileSafari"; 
} 

function unload() { 
    ensureAJAXGet("testajax.jsp", {"browser": browser}); 
} 

onUnload(function() { unload(); }); 

つまり:

  1. onunload何かをするには、window.onloadまたはwindow.onunloadを直接使用するのではなく、onUnload()を呼び出します。可能な場合は非同期AJAX、必要な場合は同期(WebKit)されるensureAjaxGet()を使用する
  2. アンロード関数でGET Ajaxを送信するには
関連する問題