jquery ui autocomplete _renderItem似乎干扰了select事件

arn*_*ird 10 jquery select jquery-ui autocomplete jquery-ui-autocomplete

如果我使用_renderItem,我的选择事件不起作用.如果我注释掉我调用_renderItem的最后一段代码,则select事件有效.当我使用_renderItem时,select事件根本不会触发.

var cache = {}, lastXhr; 

$("#hifind-find").autocomplete({
  source: function(request, response) {

    var term = request.term; 
    if (term in cache) {
      response(cache[term]);
      return;
    }

    var posturl = '/hifind/jquery_ui/autocomplete/'+term; 
    lastXhr = $.post(posturl, function(data, status, xhr) {
      cache[term] = data; 
      if (xhr === lastXhr) {
        response(data); 
      } 
    }, 'json');
  },
  delay: 300,
  minLength: 1,
  select: function(event, ui){
    window.location = ui.item.dest;
  }
});

$.ui.autocomplete.prototype._renderItem = function(ul, item) {
  return $("<li></li>")
    .data("item.autocomplete", item)
    .append('<img src="' + iconImgPath + item.flag + '-search.png" class="icon-autocomplete-bundle">' + item.label )
    .appendTo( ul );
};
Run Code Online (Sandbox Code Playgroud)

如果我这样做,我会得到相同的结果......

$("#hifind-find").autocomplete(myConfig).data("autocomplete")._renderItem = renderItemFunction;
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,选择都不会触发._renderItem做它应该做的事情.它修改了项目并且没有错误,但似乎打破了选择.

And*_*ker 14

相信这是因为您没有将项目包装在anchor(a)标记中.更新你的代码以包装img在一个锚点,它将工作正常:

$.ui.autocomplete.prototype._renderItem = function(ul, item) {
  return $("<li></li>")
    .data("item.autocomplete", item)
    .append('<a><img src="' + iconImgPath + item.flag + '-search.png" class="icon-autocomplete-bundle">' + item.label + '</a>')
    .appendTo( ul );
};
Run Code Online (Sandbox Code Playgroud)

以下是一些可能有用的示例:

  • 令人遗憾的是,jQuery UI的官方文档不仅完全忽略了这一点,而且它们实际上告诉你做错了.这是他们的`_renderItem`的示例代码:`$("<li>").attr("data-value",item.value).append(item.label).appendTo(ul);`(注意缺少一个`<a>`).谢天谢地,这个答案. (2认同)