【问题标题】:Why am I getting this JS error?为什么我会收到这个 JS 错误?
【发布时间】:2011-04-08 05:21:33
【问题描述】:

我收到这个 JS 错误:

jquery-1.5.1.min.js:16Uncaught TypeError: Cannot set property '_renderItem' of undefined
d.d.extend._Deferred.f.resolveWithjquery-1.5.1.min.js:16
d.d.extend.readyjquery-1.5.1.min.js:16
d.c.addEventListener.A

它来自我的 application.js 文件中 jquery UI 自动完成插件的代码:

    .data( "autocomplete" )._renderItem = function( ul, item ) {
         return $( "<li></li>" )
           .data( "item.autocomplete", item )
           .append( "<a>" + item.topic.name + "</a>" )
           .appendTo( ul );
            };

每当我加载一个没有自动完成代码所作用的文本字段的页面时,我都会收到此代码。为什么以及如何消除此错误?

我想指出,虽然我收到此错误,但我的应用程序运行正常。我什至应该担心这个错误吗?

【问题讨论】:

    标签: javascript jquery debugging autocomplete


    【解决方案1】:
    $(...).data('autocomplete')
    

    未定义,您不能设置未定义的属性。试试:

    var obj = $(...).data('autocomplete');
    obj && (obj._renderItem = function(){
       ...
    });
    

    【讨论】:

    • @Blender,因为 jQuery 选择器返回一个空数组。该空数组没有 .data() 函数,因此 .data 函数返回未定义,并且您不能设置未定义的属性,正如 cwolves 所解释的那样。
    • 正如最初的问题所说:“每当我加载一个没有自动完成代码所作用的文本字段的页面时,我都会得到这个代码”——因此$(...) 是一个空的 jQuery 集和$(...).data('anything') == undefined
    • @nathan -- 不完全是。空的 jQuery 集仍然有一个 .data() 函数,它总是返回 undefined
    • 嗯,这是由错误解释的。但我明白你的意思。
    • @cwolves 我从你的代码中得到这个错误:Uncaught ReferenceError: Invalid left-hand side in assignment
    【解决方案2】:

    当我将 jquery ui 从旧版本升级到 1.10.0 时,我出现了这个问题

    改变一下

    $('.foo').data("autocomplete")._render...;
    

    到

    $('.foo').data("uiAutocomplete")._render...;
    

    来源 JQueryUI 1.10.0 Autocompleter renderItem problems

    【讨论】:

      【解决方案3】:

      为什么不将自动完成代码封装在检查中以查看该元素是否存在?

      类似这样的:

      if ($'#myElementId').length) {
          $('#myElementId').data( "autocomplete" )._renderItem = function( ul, item ) {
               return $( "<li></li>" )
                 .data( "item.autocomplete", item )
                 .append( "<a>" + item.topic.name + "</a>" )
                 .appendTo( ul );
          };
      }
      

      【讨论】:

        【解决方案4】:

        我认为.data("autocomplete") 没有返回对象,正如错误所说:

        无法设置未定义的属性“_renderItem”

        如果你这样做:

        $('.foo').data("autocomplete")._render...;
        

        你试着打破它:

        $('.foo').data("autocomplete");
        $('.foo')._renderItem = ...;
        

        我从来没有遇到过_renderItem,所以我会进一步了解。


        实际上,这个问题似乎解释了一个与您的问题非常相似的问题:Using _renderItem kind of breaks autocomplete field

        【讨论】:

        • _renderItem 是自动完成的一部分,他无法分解它,因为它在$('.foo').data('autocomplete') 的结果上设置_renderItem,而不是在$('.foo') 上
        • 啊,好点子。你可能知道你在说什么,因为我不倾向于使用 jQuery 插件;它本身很重。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多