【问题标题】:Adding Scroll to Div Function With UI Auto Complete使用 UI 自动完成添加滚动到 Div 功能
【发布时间】:2015-10-04 05:30:32
【问题描述】:

能否请您看一下This Demo,让我知道如何启用从自动完成滚动到所选项目的 div?

$(document).ready(function () {
    $('#tags').on('change', function () {
        $('#tagsname').html('You selected: ' + this.value);
        $('html,body').animate({
               scrollTop: $("#"+ this.value).offset().top
         });
    }).change();
    $('#tags').on('autocompleteselect', function (e, ui) {
        $('#tagsname').html('You selected: ' + ui.item.value);
    });
});

但我收到此错误

未捕获的类型错误:无法读取未定义的属性“顶部”

【问题讨论】:

    标签: javascript jquery jquery-ui jquery-ui-autocomplete


    【解决方案1】:

    代码在正确触发时工作。但只有当您输入与其中一个查找项的 id 匹配的值时才会正确触发。

    根据 ID 选择器的Jquery documentation

    对于 id 选择器,jQuery 使用 JavaScript 函数 document.getElementById(),效率极高。

    根据 MDN 的 document.getElementById 参数

    • element 是对 Element 对象的引用,如果具有指定 ID 的元素不在文档中,则为 null。
    • id 是一个区分大小写字符串,表示正在查找的元素的唯一 ID。

    由于您的元素是使用 Proper Cased 字符串使用 id 定义的,并且由于 id 查找区分大小写,如果您为 Asp 元素输入 asp,它将返回 null 进行查找。

    随后在null 上调用offset() 将返回undefined。由于undefined 没有top 属性,您会收到错误消息:

    未捕获的类型错误:无法读取未定义的属性“顶部”

    因此,解决方案是将您的 id 设置为某种情况并规范您的通话。例如,如果您使用小写,则:

    $("#"+ this.value.toLower()).offset().top
    

    或者更好的是做一些空检查等,以确保你在开始调用方法之前确实有一个项目:

    function getOffset(id){
       if (this.value)
       {
          var matches = $("#"+ this.value.toLower());
          if (matches.length){
             return matches.offset().top;
          }
       }
       return 0;
    }
    
    scrollTop: getOffset(this.value);
    

    【讨论】:

      【解决方案2】:

      change 事件不存在,因此您的代码不会被触发。你必须这样做:

      $(document).ready(function () {
          $('#tags').on('autocompleteselect', function (e, ui) {
              $('#tagsname').html('You selected: ' + ui.item.value);
              $('html,body').animate({
                     scrollTop: $("#"+ this.value).offset().top
               });
          });
      });
      

      检查this demo

      【讨论】:

      • change 不存在是什么意思? OP 将其应用于文本框而不是选择。如果它不存在,则不会触发,因此 OP 不会收到错误消息。
      • JavaScript 编译器在执行前检查所有代码分配变量,它可以在执行前检查变量或变量属性是否存在。另一方面,change 事件必须被初始化才能被触发,这就是为什么你必须在autocomplete 初始化时添加一个回调。这是一个可观察的模式。 api.jqueryui.com/autocomplete/#event-change
      • 不,事件触发是因为 OP 调用它。 .change();
      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 2016-07-19
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多