Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery自动完成不';t处理第一个按键事件(源是一个数组)_Javascript_Jquery_Ajax_Jquery Ui_Autocomplete - Fatal编程技术网

Javascript JQuery自动完成不';t处理第一个按键事件(源是一个数组)

Javascript JQuery自动完成不';t处理第一个按键事件(源是一个数组),javascript,jquery,ajax,jquery-ui,autocomplete,Javascript,Jquery,Ajax,Jquery Ui,Autocomplete,我正在创建一个搜索结果自动完成像谷歌 自动完成的结果(或源)将是一个动态数组(该数组是使用从$.ajax调用中的URL属性访问的对象创建的),并且元素在每个按键事件中都会快速变化 我的意思很简单: 我们有一个变量autocompleteResults 在$.ajax成功回调函数中,我们将此变量分配给空数组:autocompleteResults=[] 在此之后,我们将执行$。each()函数: $.each(d.query.pages, function(i) { autocompleteR

我正在创建一个搜索结果自动完成像谷歌

自动完成的结果(或源)将是一个动态数组(该数组是使用从
$.ajax
调用中的
URL
属性访问的对象创建的),并且元素在每个
按键
事件中都会快速变化

我的意思很简单:

  • 我们有一个变量
    autocompleteResults
  • $.ajax
    成功回调函数中,我们将此变量分配给空数组:
    autocompleteResults=[]
  • 在此之后,我们将执行
    $。each()
    函数:

    $.each(d.query.pages, function(i) {
      autocompleteResults.push(d.query.pages[i].title);
    });  
    
    // d.query.pages - JSON object from the success callback (success: function(d) {...}
    
  • 我们在成功回调结束时调用
    回调(autocompleteResults)

  • 调用此函数可以正常工作并正确返回数组:

    getAutocompleteResults(function() {
      console.log(autocompleteResults);
    });
    
  • 然后在同一范围内:

    $("#search").autocomplete({source: autocompleteResults},...);
    
    它只在我第二次打字时起作用


  • 使用图像进行快速概述:

  • 重新加载页面后,首先查看该页面:
  • 让我们在输入字段中输入一些内容(“a”),例如:
  • 正如您在前面的图像中所看到的,我们没有自动完成结果(“a”结果只是由JS创建的一个表,与此问题无关)。让我们尝试使用键盘上的退格按钮删除“a”字符:
  • 我们得到了与第一张图片相同的结果。但是等等,有些事情已经改变了。让我们尝试输入与第二幅图中相同的键,看看我们得到了什么:
  • 奇迹!在前一张图片中,一切都是它应该看起来的样子。问题是,只有在第二次尝试向字段中输入某些内容后,才能获得此结果。第一次尝试就应该可以了

  • 我所有关于这个问题的研究成果:

  • 如果未将Autocomplete置于
    按键
    事件功能中,则它可以完美工作。然而,在这种情况下,我们得到一次结果,然后它停止响应未来的类型(输入“a”-5个结果,输入“aa”-与“a”相同的结果,并且它没有响应

    我想我应该使用前面提到的
    $(“.selector”).autocomplete(“search”,”);
    再次更改源代码,但我不确定它是否能解决此问题

  • 我的代码以某种方式堆积了AJAX请求,相同的请求重复了很多次。我如何解决这个问题

  • 像这样的线程没有帮助: , , ,


  • 要查看完整的项目代码,请转到此处:

    或者使用一小段代码(这样您就可以看到问题发生的最重要部分):

    $(函数(){
    var自动完成结果;
    var changeText2=函数(e){
    var request=$(“input”).val()+String.fromCharCode(e.which);
    $(“#即时搜索”).text(请求);
    var getAutocompleteResults=函数(回调){
    $.ajax({
    url:“https://en.wikipedia.org/w/api.php?action=query&format=json&gsrlimit=5&generator=search&origin=*&gsrsearch=“+$('#即时搜索”).text(),
    成功:功能(d){
    自动完成结果=[];
    $。每个(d.query.pages,函数(i){
    autocompleteResults.push(d.query.pages[i].title);
    });
    回调(自动完成结果);
    },
    数据类型:“json”,
    缓存:false
    });
    };
    getAutocompleteResults(函数(){
    console.log(自动完成结果);
    });
    $(“#搜索”).autocomplete({
    资料来源:autocompleteResults,
    答复:函数(){
    如果(
    $(“#即时搜索”)
    .text()
    ) {
    $(“表格”).css(“显示”、“表格”);
    }
    },
    关闭:函数(){
    如果(!$(“.ui自动完成”)。是(“:可见”)){
    $(“.ui自动完成”).show();
    }
    },
    追加:“.input”,
    重点:职能(e){
    e、 预防默认值();
    },
    延迟:0
    });
    };
    var changeText1=函数(e){
    如果(
    /[-a-z0-90áèèèèèèèèèèèèèèèèèèèèèèèèèèè(
    String.fromCharCode(e.which)
    )
    ) {
    $(“输入”)。在(“按键”,changeText2);
    }
    //此部分与此问题无关,删除此部分将使HTML创建的表无法正常工作
    var getInputSelection=函数(输入){
    var start=0,
    结束=0;
    input.focus();
    如果(
    输入的类型。选择开始==“编号”&&
    typeof input.selectionEnd==“数字”
    ) {
    开始=输入。选择开始;
    结束=输入。选择结束;
    }else if(document.selection&&document.selection.createRange){
    var range=document.selection.createRange();
    如果(范围){
    var inputRange=input.createTextRange();
    var workingRange=inputRange.duplicate();
    var bookmark=range.getBookmark();
    inputRange.moveToBookmark(书签);
    工作范围.setEndPoint(“EndToEnd”,输入范围);
    结束=工作范围.text.length;
    工作范围.setEndPoint(“EndToStart”,输入范围);
    开始=工作范围.text.length;
    }
    }
    返回{
    开始:开始,
    完:完,,
    长度:结束-开始
    };
    };
    开关(电子钥匙){
    案例“Backspace”:
    案例“删除”:
    e=e | | window.event;
    var-keyCode=e.keyCode;
    var deleteKey=keyCode==46;
    var sel、deletedText、val;
    val=该值;
    sel=getInputSelection(此);
    如果(选择长度){
    //0 kai paprastai trini po viena o 1 ar daugiau kai select su pele trini
    $(“#即时搜索”).text(
    val.substr(0,选择开始)+val.substr(选择结束)
    );
    }否则{
    $(“#即时搜索”).text(
    val.substr(0,删除键?选择启动:选择启动-1)+
    val.substr(德尔
    
    source: function (request, response) {
        getAutocompleteResults(function(data){
          response(data);
        });
      },