【问题标题】:Second search box takes too long time to display result, sometimes browser crashed第二个搜索框显示结果时间过长,有时浏览器崩溃
【发布时间】:2017-02-20 23:13:00
【问题描述】:

我有一个下拉列表 - 国家,由 jquery 生成,选择后会将所选国家下的所有城市加载到另一个 UL 中。我为第二个 UL 添加了搜索功能;每当我输入任何字母时,都需要很长时间才能响应,并且有时会导致浏览器崩溃。我该如何处理。

对于那些城市数量最少的国家,第二个搜索功能非常好用,只是当遇到像中国,美国,英国等大国时,搜索/过滤功能会导致崩溃。

需要有关如何使搜索/过滤器正常运行的建议。

$(document).ready(function() {
      origin_dropdown();
    }

    function myFunction(e) {
      name = e;
      $("." + e + "_dropdown").toggle();
      //document.getElementById("myDropdown").classList.toggle("show");
    }

    function filterFunction(e) {
      var input, filter, ul, li, a, i;
      name = e;
      input = $(".input_" + e).val();
      filter = input.toUpperCase();
      a = $("." + e + "_dropdown").find("li");

      for (i = 0; i < a.length; i++) {
        if (a[i].innerText.toUpperCase().indexOf(filter) > -1) {
          $(a[i]).show();
        } else {
          $(a[i]).hide();
        }
      }
    }

    function filterFunction_cities(e) {
      var input, filter, ul, li, a, i;
      name = e;
      input = $(".input_" + e).val();
      filter = input.toUpperCase();
      a = $("#origin_cities_list").find("li");

      for (i = 0; i < a.length; i++) {
        if (a[i].innerText.toUpperCase().indexOf(filter) > -1) {
          $(a[i]).show();
        } else {
          $(a[i]).hide();
        }
      }
    }

    function origin_dropdown() {
      $.ajax({
        url: "/advance/origin",
        type: 'POST',
        dataType: 'json',
        success: function(data) {
          $(data.result).each(function(key, value) {
            name = value.country_name.replace(/ /g, "_");
            //cities = value.full_name_nd.replace(/ /g,"_");
            list = $("<li>").addClass(name).text(value.country_name);
            cbox = $("<input>").addClass(name).attr("type", "checkbox").val(value.country_name).click(function() {
              selected_cBox = $(this).val();
              new_div = $("<div>").addClass("selected_origin").text(selected_cBox);
              $('.selected_container').append(new_div);

              var tmp = {
                'country': []
              };
              tmp['country'].push(selected_cBox);
              console.log(tmp);
              // to get cities within the selected country and append to list
              $.ajax({
                url: "/advance/origin_cities",
                type: 'POST',
                data: tmp,
                dataType: 'json',
                success: function(data) {
                  $(data.result).each(function(key, value) {
                    city_name = value.full_name_nd.replace(/ /g, "_");
                    country_name = value.country_name.replace(/ /g, "_");
                    list = $("<li>").addClass(value.country_name, city_name).text(value.full_name_nd);
                    cbox = $("<input>").addClass(value.country_name, city_name).attr("type", "checkbox").val(value.full_name_nd).click(function() {
                      selected_cBox = $(this).val();
                      new_div = $("<div>").addClass("selected_origin").text(selected_cBox);
                      $('.selected_container').append(new_div);
                    })
                    combine = list.prepend(cbox);
                    $('#origin_cities_list').append(combine);
                  })
                }
              })
            });
            combine = list.prepend(cbox);
            $('#origin_list').append(combine);
          })
        }
      });
    }
<div id="myModal_origin" class="modal">
  <div class="modal-content">
    <span class="close">&times;</span>
    <div class="dropdown_origin">
      <button onclick="myFunction('origin')" class="dropbtn">Country of Origin</button>
      <div id="myDropdown" class="dropdown-content origin_dropdown">
        <input type="text" placeholder="Search.." id="myInput" class="input_origin" onkeyup="filterFunction('Origin')">
        <ul id="origin_list" class="dynamic_list">
        </ul>
        <ul id="origin_cities_list" class="dynamic_list">
          <input type="text" placeholder="Search.." id="myInput" class="input_cities" onkeyup="filterFunction_cities('Cities')">
        </ul>
      </div>
    </div>
  </div>
</div>

我已经改进了我的 JQuery 并试图解决这个问题,因为我发现以前的代码一直在为城市调用 ajax。

下面是我的新代码,但我仍然遇到同样的问题

function origin_dropdown(){
$.ajax({
    url:"/advance/origin",
    type:'POST',
    dataType:'json',
    success: function(data){
        $(data.result).each(function(key,value){ 
            name = value.country_name.replace(/ /g,"_");
            //cities = value.full_name_nd.replace(/ /g,"_");
            list = $("<li>").addClass(name).text(value.country_name);
            cbox = $("<input>").addClass(name).addClass("_country").attr("type","checkbox").val(value.country_name);
            combine = list.prepend(cbox);
            $('#origin_list').append(combine);
        }); 
    }
})
}

function Origin_cities_dropdown(ctry){

$(".origin_dropdown").toggle();
var tmp = {'country':[]};
tmp['country'].push(ctry);
console.log(tmp);

$.ajax({
    url:"/advance/origin_cities",
    type:'POST',
    data:tmp,
    dataType:'json',
    success: function(data){
        console.log("success");
        $(data.result).each(function(key,value){        
            city_name = value.full_name_nd.replace(/ /g,"_");
            country_name = value.country_name.replace(/ /g,"_");
            list = $("<li>").addClass(value.country_name, city_name).text(value.full_name_nd);
            cbox = $("<input>").addClass(value.country_name, city_name).attr("type","checkbox").val(value.full_name_nd).click(function(){
                selected_cBox = $(this).val();
                new_div = $("<div>").addClass("selected_origin").text(selected_cBox);
                $('.selected_container').append(new_div);
            })
            combine = list.prepend(cbox);
            $('#origin_cities_list').append(combine);
        })
    }
})
}

<!--Location Selection Modal-->
        <div id="myModal_origin" class="modal">
            <div class="container">
                <div class="row">
                    <div class="row modal-content">
                        <span class="close">&times;</span>
                            <div class="dropdown_origin  col-sm-12 col-md-12 centered">
                                <div class="col-sm-12 col-md-12 centered"><p>Country of Origin</p></div>
                                <input onclick="myFunction('origin')" class="dropbtn" readonly></input>
                                <input type="text" placeholder="Search.." id="myInput" class="input_origin" onkeyup="filterFunction('Origin')" style="display: none;">
                                <input type="text" placeholder="Search.." id="myInput" class="input_cities" onkeyup="filterFunction_cities('Cities')" style="display: none;">
                                <div id="myDropdown" class="dropdown-content origin_dropdown col-sm-12 col-md-12 centered">                        
                                    <ul id="origin_list" class="dynamic_list">
                                    </ul>
                                </div>        
                                <div id="myDropdown" class="dropdown-content cities_dropdown col-sm-12 col-md-12 centered">        
                                    <ul id="origin_cities_list" class="dynamic_list">

                                    </ul> 
                                </div>
                            </div>
                    </div>
                </div>
            </div>
        </div>

$(document).ready(function() {
  origin_dropdown();
}

【问题讨论】:

  • 您的代码有语法错误。请改正。 - 这是无效的:$(document).ready(function() { origin_dropdown(); }
  • 我建议您创建一个连接的 html 字符串并注入它,而不是创建新对象并附加它们
  • @mplungjan,对不起,我不明白什么是连接的html字符串,脚本可以正常运行而没有任何错误,只是过滤功能会导致浏览器崩溃。

标签: jquery performance laravel-5.3


【解决方案1】:

这对于大数字来说更快

$("##origin_cities_list").on("click","[type=checkbox]",function() {
  var new_div = $("<div>").addClass("selected_origin").text(this.value);
  $('.selected_container').append(new_div);
});    

使用

success: function(data) {
  var html = [];
  $(data.result).each(function(key, value) {
    city_name = value.full_name_nd.replace(/ /g, "_");
    country_name = value.country_name.replace(/ /g, "_");
    html.push('<li class="'+value.country_name +" " + city_name+">'+value.full_name_nd+'<input class="'+value.country_name +" "+ city_name +' type="checkbox" value="'+value.full_name_nd+'"/>');
  })
  $("#origin_cities_list").append(html.join(''));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2019-10-30
    • 1970-01-01
    • 2019-07-29
    • 2022-11-20
    • 2014-05-13
    • 1970-01-01
    相关资源
    最近更新 更多