上下文的功能:的Javascript異步調用到更新DOM元素重疊,造成問題
我有一個要求輸入郵編,州和城市的一種形式。在每個輸入字段旁邊,我有兩個跨度,其中一個在輸入良好時顯示綠色複選標記,另一個在輸入錯誤時顯示紅色x。當然,在任何時候只有一個可見。
<input type="text" id="Zip" class="form-control">
<span id="ZipOK" style="display:none;" class="glyphicon glyphicon-ok"></span>
<span id="ZipBad" style="display:none;" class="glyphicon glyphicon-remove"></span>
<input type="text" id="State">
<span id="StateOK" style="display:none;" class="glyphicon glyphicon-ok"></span>
<span id="StateBad" style="display:none;" class="glyphicon glyphicon-remove"></span>
<input type="text" id="City">
<span id="CityOK" style="display:none;" class="glyphicon glyphicon-ok"></span>
<span id="CityBad" style="display:none;" class="glyphicon glyphicon-remove"></span>
我有一個檢測輸入到zip字段,然後做一個數據庫調用從郵政編碼得到國家和城市,自動填寫表格的函數。
jQuery('.form-control').keyup(function(){
validateZipcode();
});
這是ajax的功能,自動填充州/城市並隱藏/顯示適當的反饋跨度。
function validateZip() {
zip = $('#Zip').val();
if (zip.length === 5 && $.isNumeric(zip)) {
$.ajax({
type:"POST",
url: '?report=ajax&request=getStateAndCityFromZip',
data:"Zip="+encodeURIComponent(zip),
success: function(output) {
output = $.parseJSON(output);
if (output['State'].length > 0 && output['City'].length > 0) {
$('#State').val(output['State']);
$('#City').val(output['City']);
$('#StateOK').fadeIn();
$('#StateBad').hide();
$('#CityOK').fadeIn();
$('#CityBad').hide();
$('#ZipOK').fadeIn();
$('#ZipBad').hide();
} else {
$('#ZipOK').hide();
$('#ZipBad').fadeIn();
}
},
error: function (xhr, ajaxOptions, thrownError) {
}});
} else {
$('#ZipOK').hide();
$('#ZipBad').fadeIn();
}
}
問題:
此代碼工作,然而也有一些情況下,如果我把在郵政編碼極快的地方,無論是#ZipBad
和#ZipGood
跨度最終會可見。以相對正常或緩慢的速度輸入會導致預期的行爲。
我認爲這與異步調用validateZip()有關,但我並不知道如何解決這個問題。有沒有人有任何想法?
您需要製作新的人之前先取消先前的Ajax請求。請參閱:http://stackoverflow.com/questions/4551175/how-to-cancel-abort-jquery-ajax-request –
此外,您需要刪除請求。 Debouncing有點像限速。請參閱:http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/ –
_「#ZipBad和#ZipGood跨度最終都可見」_'#ZipGood'不出現在' html','js'?如果'#ZipOK'隱藏了'keyup'事件處理函數,那麼預期的結果是什麼? – guest271314