jQuery autocomplete给出了TypeError:this._renderItem(…)是未定义的

我目前在页面的三个位置使用.data( "ui-autocomplete" )._renderItem = function( ul, item ) 。 现在我需要再添加一个,我已经完成了。

但是这次我得到了错误信息

TypeError:this._renderItem(…)未定义

奇怪的是,如果我的IF测试是假的,我只会得到这个。

  .data( "ui-autocomplete" )._renderItem = function( ul, item ) { // If only one row is returned and ID = 0, then return 'no result' message if(item.id == '0') { return jQuery( "
  • " ) .data( "item.autocomplete", item ) .append( "
    "+ item.value + "
    " ) .appendTo( ul ); }

    我无法弄清楚为什么它在这里失败了,而不是在其他3个地方。 某处有冲突吗?

    这是我的代码

     jQuery('#my-selector').autocomplete({ minLength: 2, source: function( request, response ) { jQuery.ajax({ url: callback_url, dataType: "json", data: { term: request.term }, success: function( data ) { response( jQuery.map( data, function( item ) { return { id: item.id, value: item.name, name_encoded: item.name_encoded } })); } }); }, select: function( event, ui ) { return false; } }).data( "ui-autocomplete" )._renderItem = function( ul, item ) { if(item.id == '0') { return jQuery( "
  • " ) .data( "item.autocomplete", item ) .append( "
    "+ item.value + "
    " ) .appendTo( ul ); } };

    更新

    这种改变有效。 但我仍然不明白为什么我必须在这里使用else语句,当我没有在其他两个autocomplete函数中使用它时。

     .data( "ui-autocomplete" )._renderItemData = function( ul, item ) { if(item.id == '0') { return jQuery( "
  • " ) .data( "item.autocomplete", item ) .append( "
    "+ item.value + "
    " ) .appendTo( ul ); } else { return this._renderItem( ul, item ).data( "ui-autocomplete-item", item ); } };

    从查询返回数据,搜索词为some

     [ {"id":"8186","name":"Some Are Thieves"}, {"id":"6149","name":"Somet"}, {"id":"6150","name":"Somethin'Else from SKECHERS"} ] 

    正是因为测试,如果测试失败,那么_renderItem不会返回任何等于返回undefined

    但是_renderItem被调用如下所示,这会导致错误,因为jquery尝试将数据值设置为返回值。

     return this._renderItem( ul, item ).data( "ui-autocomplete-item", item ); 

    在您的情况下,您必须覆盖_renderItemData而不是_renderItem

     var el = $(''); var _renderItemData = el.data("ui-autocomplete")._renderItemData; el.data("ui-autocomplete")._renderItemData = function(ul, item) { // If only one row is returned and ID = 0, then return 'no result' message if (item.id == '0') { return jQuery("
  • ").data("item.autocomplete", item).data( "ui-autocomplete-item", item).append("
    " + item.value + "
    ").appendTo(ul); } else { _renderItemData.apply(this, arguments) } }

    演示: Plunker