2017-10-11 6 views
0

私はどのクライアント側のロガーがどのクライアント側のエラーをログに記録するためにサーバーに接続しているのですか?ajaxerrorイベントの伝播を停止する方法

var logger = (function ($) { 
    var module = {}; 
    module.log = function (obj) { 
     try {   
      $.ajax({ 
       type: "POST", 
       data: JSON.stringify(obj), 
       url: '/jslog' 
      }) 
      .fail(function (jqXHR, textStatus, errorThrown) { 
       console.error('JS error report submission failed.'); 
       // how to stop progating ajaxError here? 
      }) 
     } 
     catch (ex) { 
      console.error('JS error report submission failed.'); 
      // how to stop progating ajaxError here? 
     } 
    } 
    return module; 

})(jQuery); 

次に、ページには2つのイベントハンドラが接続されています。

    任意のJavaスクリプトエラーを処理するために、任意のAJAXエラーに
  1. を処理するための

  2. $(document).ajaxError(function (event, jqxhr, settings, thrownError) { 
         logger.log({ jqxhr: jqxhr }) 
        }); 
    
    window.onerror = function (msg, url, line) { 
        logger.log({ message: msg, url: url, line: line }) 
    } 
    

ISSUE

logger.logは、内部にログを送信するために、AJAX POSTを使用サーバー。したがって、ロギング自体に失敗した場合は、再び$(document).ajaxErrorを起動し、エラーをログに記録して失敗します。それは連続的なループになります。

ajaxErrorcatchまたはfailイベントハンドラで停止する方法はありますか?

もしそうでなければ、AJAXを使わずにPOSTする方法は?

または(任意の他のサードパーティ製のlibを使用せずに)これを処理するために、他のより良い方法はあり

答えて

0

ほとんどの時間、私は私が投げる無限ループ分割する必要があります。

return;

をAJAXを投稿する限り、恐ろしいIE ajaxキャッシングを避けるためにnoCacheヘルパーを持つこの種のソリューションを使用することができます。 jQueryはajaxキャッシュ自体を扱う傾向があるので、noCacheオプションはほとんどの場合私の意見では必要です。

function postAjax(url, data, success) { 
    var params = typeof data == 'string' ? data : Object.keys(data).map(
     function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) } 
    ).join('&'); 

    var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); 

    noCacheRequest('POST',url,xhr); 

    xhr.onreadystatechange = function() { 
    if (xhr.readyState>3 && xhr.status==200) { 
     success(xhr.responseText); } 
    }; 
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    xhr.send(params); 
    return xhr; 
} 

function noCacheRequest(http_method,url,request_object) { 
    var no_cache = '?' + new Date().getTime(); 
    return request_object.open(http_method.toUpperCase(), url + no_cache, true); 
} 
-1

ajaxError()にURLをチェックし、エラーがログ記録URLからのものである場合、ログ要求をしない:

$(document).ajaxError(function (event, jqxhr, settings, thrownError) { 
    if (settings.url !== '/jslog') { 
    logger.log({ jqxhr: jqxhr }); 
    } 
}); 
関連する問題