我使用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();
}发布于 2014-08-17 17:13:23
问题在于getAjax()函数。在函数的开头,您需要声明xmlhttp变量:
function getAjax(seek, getId, destUrl, reset) {
var xmlhttp;
/* ... */
}解释
问题是范围是可变的。在getAjax()函数中,不需要首先声明xmlhttp变量(使用var关键字),就可以为它赋值。根据 keyword
在执行赋值时,将值分配给未声明的变量隐式地创建为全局变量(它成为全局对象的属性)。
因此,每次调用getAjax()时,您都要将一个值( XMLHttpRequest或ActiveXObject)分配给xmlhttp,因为它从未声明过,因此它被视为全局变量。因此,当对getAjax()的第二个调用在select回调的最后一行中运行时,它将在第一个请求有机会完成之前覆盖第一个调用中的xmlhttp变量。
如果在函数开始时使用var xmlhttp声明变量,那么每次对getAjax()的调用都会有它自己的xmlhttp变量实例,从而防止它被视为全局变量并被覆盖。
https://stackoverflow.com/questions/25351172
复制相似问题