我正在使用jquery自动完成功能从数据库中获取项目并替换字段。使用select函数和一些AJAX,它将所需信息替换为当前信息。 但是,我需要它运行两次,并且自动完成似乎只运行select函数中的最后一行:
$(document).ready(function($){
$('#client_name').autocomplete({
source:'suggest_client.php',
minLength:2,
select: function (event, ui) {
$("#client_name").val(ui.item.label); // display the selected text
$("#client_nameID").val(ui.item.value); // save selected id to hidden input
var clientValue = ui.item.value;
getAjax(clientValue, 'client_replace', 'client_info.php?client_id=', "");
getAjax(clientValue, 'client_contact_div', 'get_contact.php?client_key=', "");
return false;
}
});
});
getAjax代码:
function getAjax(seek, getId, destUrl, reset) {
if (seek=="") {
document.getElementById(getId).innerHTML=reset;
return;
}
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else {
// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById(getId).innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET",destUrl+seek,true);
xmlhttp.send();
}
答案 0 :(得分:0)
问题在于getAjax()
功能。在函数的最开始,您需要声明xmlhttp
变量:
function getAjax(seek, getId, destUrl, reset) {
var xmlhttp;
/* ... */
}
问题在于可变范围。在getAjax()
函数中,您可以为xmlhttp
变量指定一个值,而不先声明它(使用var
关键字)。根据{{3}}:
在执行赋值时,为未声明的变量赋值会隐式地将其创建为全局变量(它将成为全局对象的属性)。
因此,每次调用getAjax()
时,您都会将值(XMLHttpRequest
或ActiveXObject
)分配给xmlhttp
,因为它从未声明过 - 被视为全局变量。因此,当getAjax()
的第二次调用在select
回调的最后一行中运行时,它会在第一次请求有机会完成之前覆盖第一次调用的xmlhttp
变量。
如果您在函数开头使用var xmlhttp
声明变量,那么每次调用getAjax()
都会有{em>自己的xmlhttp
变量实例 ,防止它被视为全局变量并被覆盖。