ajaxリクエストが同一であるため、アボートやその他のアラートアクションが発生する可能性があるかどうかテストしたいと思いますか?リフレッシュ時に同一のクライアントAjaxリクエストを避ける
実際には、クライアントはいくつかのフォーム要素を介して要求を変更し、次に更新ボタンを押します。
私は、同じリクエストをキャッチする試みが貧弱です。タイマーのリフレッシュ機能を維持する必要があります。
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
var current_request_id = 0;
var currentRequest = null;
var lastSuccessfulRequest = null;
function refreshTable() {
$('#select').html('Loading');
window.clearTimeout(timer);
//MY CATCH FOR DUPLICATE REQUEST NEEDS WORK
if (lastSuccessfulRequest == currentRequest)
{
//currentRequest.abort();
alert('Duplicate query submitted. Please update query before resubmission.');
}
var data = {
"hide_blanks": $("#hide_blanks").prop('checked'),
"hide_disabled": $("#hide_disabled").prop('checked'),
};
json_data = JSON.stringify(data);
current_request_id++;
currentRequest = $.ajax({
url: "/calendar_table",
method: "POST",
data: {'data': json_data},
request_id: current_request_id,
beforeSend : function(){
if(currentRequest != null) {
currentRequest.abort();
}
},
success: function(response) {
if (this.request_id == current_request_id) {
$("#job_table").html(response);
$("#error_panel").hide();
setFixedTableHeader();
}
},
error: function(xhr) {
if (this.request_id == current_request_id) {
$("#error_panel").show().html("Error " + xhr.status + ": " + xhr.statusText + "<br/>" + xhr.responseText.replace(/(?:\r\n|\r|\n)/g, "<br/>"));
}
},
complete: function(response) {
if (this.request_id == current_request_id) {
$("#select").html("Refresh");
window.clearTimeout(timer);
stopRefreshTable();
window.refreshTableTimer = window.setTimeout(refreshTable, 10000);
lastSuccessfulRequest = currentRequest;
}
}
});
}
//TIMER STUFF TO refreshTable()
//THIS SECTION WORKS FINE
var startDate = new Date();
var endDate = new Date();
var timer = new Date();
function startRefreshTable() {
if(!window.refreshTableTimer) {
window.refreshTableTimer = window.setTimeout(refreshTable, 0);
}
}
function stopRefreshTable() {
if(window.refreshTableTimer) {
self.clearTimeout(window.refreshTableTimer);
}
window.refreshTableTimer = null;
}
function resetActive(){
clearTimeout(activityTimeout);
activityTimeout = setTimeout(inActive, 300000);
startRefreshTable();
}
function inActive(){
stopRefreshTable();
}
var activityTimeout = setTimeout(inActive, 300000);
$(document).bind('mousemove click keypress', function(){resetActive()});
</script>
<input type="checkbox" name="hide_disabled" id="hide_disabled" onchange="refreshTable()">Hide disabled task<br>
<br><br>
<button id="select" type="button" onclick="refreshTable();">Refresh</button>
"正確に何かと同じ?以前のリクエスト?以前のリクエスト?他に何か?どの意味で同じですか?同じユーザーからですか?まったく同じパラメータですか?同じヘッダーですか?正確な要件を明確にしてください。あなたが今やっているやり方は素朴です。 $ .ajaxはDeferredオブジェクトを返します。これは、他のものと意味のある方法で "等価"を実際に比較することはできません。また、リクエストの内容については何も教えてくれません。コールバックを追加するために設計されています。応答を処理します。 – ADyson
また、jQueryの '.bind'はjQuery 1.7の' .on'で取り替えられ、現在は完全に非推奨です。まだそれを使用しているか、悪いことに、新しいコードに使用する必要はありません。 http://api.jquery.com/bind/ – ADyson
確かに、100行のコードを投稿せずにあなたの意見をする方法があります。 [mcve]を読んで従う。 – Tomalak