【问题标题】:jquery ui autocomplete with multiple fields带有多个字段的jquery ui自动完成
【发布时间】:2015-04-24 17:19:43
【问题描述】:

此代码运行良好,但第二个输入字段未显示与文本建议一起出现的图像。如果有人可以看一下并让我知道需要在 js 中进行哪些更改才能使其正常工作,我将不胜感激。

查询示例:克林顿、布什

你可以在这里看到脚本http://predcast.com/include/autoc/jqui/test2.php

<!DOCTYPE html>
<html>
<head>
<title>jQuery UI Autocomplete: Custom HTML in Dropdown</title>
<link href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/themes/smoothness/jquery-ui.min.css" rel="stylesheet">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">        </script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.min.js"></script>
<style>
.loading {
  display: none;
  width: 16px;
  height: 16px;
  background-image: url(/img/loading.gif);
  vertical-align: text-bottom;
}
#autocomplete.ui-autocomplete-loading ~ .loading {
  display: inline-block;
}
.ui-menu-item {
  padding:1px;
  margin:1px;
}
.ac-m {
  height:block;
  overflow:auto;
  padding:2px 2px 2px 2px;
}   
.ac-img {
  max-width:30px;
  float:left;
  margin:2px 2px 2px 2px;
}   
.ac-title {
  margin:1px;
  font-size:14px;
}       
.ui-autocomplete {
  margin:1px;
}
</style>
</head>
<body>
<form action="http://www.test.com/">
<input class="autocomplete" type="text" placeholder="Option 1" name="e1">
<input class="autocomplete" type="text" placeholder="Option 2" name="e2">
<span class="loading"></span>
</form>
<script>
    /*
 * jQuery UI Autocomplete: Custom HTML in Dropdown
 * http://salman-w.blogspot.com/2013/12/jquery-ui-autocomplete-examples.html
 */
$(function () {
    $('.autocomplete').autocomplete({
        delay: 500,
        minLength: 3,
        source: function (request, response) {
            $.getJSON("http://predcast.com/include/autoc/jqui/jsond.php", {
                q: request.term,
            }, function (data) {
                var array = data.error ? [] : $.map(data.movies, function (m) {
                    return {
                        label: m.title,
                        year: m.year,
                        img: m.img,
                    };
                });
                response(array);
            });
        },
        focus: function (event, ui) {
            event.preventDefault();
        },
    }).data("ui-autocomplete")._renderItem = function (ul, item) {
        var $a = $("<div class='ac-m'></div>");

        if (item.img) {
            $("<span></span>").addClass(item.icon).appendTo($a).append("<img src='" + item.img + "' border='0' class='ac-img' />");
        }

        $("<span class='ac-title'></span>").text(item.label).appendTo($a);

        return $("<li></li>").append($a).appendTo(ul);
    };
});
</script>
</body>
</html>

【问题讨论】:

  • 您使用旧版本的 JQuery 和 UI 有什么原因吗?
  • 嗨,曲折,没有理由。只是那部分没有改变我在网上找到的演示。一旦一切正常,我可能会更改为最新版本,看看是否有任何问题。

标签: javascript php jquery json jquery-ui


【解决方案1】:

问题与您定义_renderItem 扩展点的方式有关。

在您的代码中,您只为您的第一个小部件实例重新定义了 jquery-ui 自动完成 _renderItem 函数,因此您的第二个自动完成实例的 _renderItem 是 jquery-ui 代码中定义的默认值。

您正在使用此 $('.autocomplete').autocomplete({ ...}) 为您的 2 个输入初始化自动完成,然后您使用此指令 .data("ui-autocomplete") 获得第一个小部件实例,然后仅为此实例重新定义 _renderItem 函数。

您可以像这样为所有实例定义它:

// Create your widget instances
$('.autocomplete').autocomplete({
    delay: 500,
    minLength: 3,
    source: function (request, response) {
        $.getJSON("http://predcast.com/include/autoc/jqui/jsond.php", {
            q: request.term,
        }, function (data) {
            var array = data.error ? [] : $.map(data.movies, function (m) {
                return {
                    label: m.title,
                    year: m.year,
                    img: m.img,
                };
            });
            response(array);
        });
    },
    focus: function (event, ui) {
        event.preventDefault();
    }
});

// Then redefine the _renderItem for each instance
$('.autocomplete').each(function() {
    $(this).data('ui-autocomplete')._renderItem = function (ul, item) {
        var $a = $("<div class='ac-m'></div>");

        if (item.img) {
            $("<span></span>").addClass(item.icon).appendTo($a).append("<img src='" + item.img + "' border='0' class='ac-img' />");
        }

        $("<span class='ac-title'></span>").text(item.label).appendTo($a);

        return $("<li></li>").append($a).appendTo(ul);
    };
});

【讨论】:

  • 谢谢 яden,你能告诉我旧代码在 //your widget options 下的确切形式吗?我试图通过将延迟:500,minLength:3,json源等选项放在那里来编辑它,它似乎不起作用。谢谢。
  • 是的,这就是我所说的//your widget options,但是当我将代码粘贴到 SO 中时,代码中有错字。我更新了代码,试试看
猜你喜欢
  • 2014-08-30
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多