上下文的功能:的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