JQuery自动完成选择功能仅完成一个项目

时间:2014-08-17 16:25:34

标签: javascript jquery ajax autocomplete

我正在使用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();
}

1 个答案:

答案 0 :(得分:0)

问题在于getAjax()功能。在函数的最开始,您需要声明xmlhttp变量:

function getAjax(seek, getId, destUrl, reset) {
    var xmlhttp;
    /* ... */
}

解释

问题在于可变范围。在getAjax()函数中,您可以为xmlhttp变量指定一个值,而不先声明它(使用var关键字)。根据{{​​3}}:

  

在执行赋值时,为未声明的变量赋值会隐式地将其创建为全局变量(它将成为全局对象的属性)。

因此,每次调用getAjax()时,您都会将值(XMLHttpRequestActiveXObject)分配给xmlhttp,因为它从未声明过 - 被视为全局变量。因此,当getAjax()的第二次调用在select回调的最后一行中运行时,它会在第一次请求有机会完成之前覆盖第一次调用的xmlhttp变量。

如果您在函数开头使用var xmlhttp声明变量,那么每次调用getAjax()都会有{em>自己的xmlhttp变量实例 ,防止它被视为全局变量并被覆盖。