【问题标题】:add image to jQuery UI autocomplete remote source with cache使用缓存将图像添加到 jQuery UI 自动完成远程源
【发布时间】:2014-10-12 23:27:37
【问题描述】:

我正在使用带有缓存的 jQuery 自动完成远程源。 As per demo by jQUery UI website 带有缓存的远程源的javascript是

<script>
$(function() {
    var cache = {},
        lastXhr;
    $( "#birds" ).autocomplete({
        minLength: 2,
        source: function( request, response ) {
            var term = request.term;
            if ( term in cache ) {
                response( cache[ term ] );
                return;
            }

            lastXhr = $.getJSON( "search.php", request, function( data, status, xhr ) {
                cache[ term ] = data;
                if ( xhr === lastXhr ) {
                    response( data );
                }
            });
        }
    });
});
</script>

现在我想在上面的 javascript 中添加一些代码以在自动完成列表中显示图像。在 jQuery 自动完成中显示图像有一个很好的示例,例如: http://jsfiddle.net/3zSMG/ 但它不包括缓存部分。

我一直在尝试,但无法将此示例集成到现有的带有缓存 javascript 的遥控器中。任何帮助将不胜感激。非常感谢。

跟进:根据 Andrew Whitaker 的建议,我已将我的脚本更新如下:

<script>
$(function() {
    var cache = {},
        lastXhr;
    $( "#birds" ).autocomplete({
        minLength: 2,
        source: function( request, response ) {
            var term = request.term;
            if ( term in cache ) {
                response(cache[term]);
                return;
            }

            lastXhr = $.getJSON( "search.php", request, function( data, status, xhr ) {
                var results;
                if ( xhr === lastXhr ) {
                    results = $.map(data, function(item) {
                        return {
                        value: item.value,
                        avatar: item.avatar
                        };
                    });
                    cache[term] = results;
                    response(results);
                }                   
            });
        },
    }).data("autocomplete")._renderItem = function (ul, item) {
    if ( item.value != null ) {
        if ( item.avatar != null) {
            return $("<li/>")
                .data("item.autocomplete", item)
                .append("<a><img src='images/" + item.avatar + "' />" + item.value + "</a>")
                .appendTo(ul);
            }
        else {
            return $("<li/>")
                .data("item.autocomplete", item)
                .append("<a>" + item.value + "</a>")
                .appendTo(ul);
        }
    }
    }; 
});

以及search.php的内容:

<?php
require_once "config.php";
$term = trim(strip_tags($_GET['term']));//retrieve the search term that autocomplete sends
$qstring = "select id, subject as value, avatar from Suggests where subject LIKE '%".$term."%'";
$result = mysql_query($qstring);//query the database for entries containing the term
while ($row = mysql_fetch_array($result,MYSQL_ASSOC))//loop through the retrieved values
{
    $row['value']=htmlentities(stripslashes($row['value']));
    $row['id']=(int)$row['id'];
    $row['avatar']=$row['avatar'];
    $row_set[] = $row;//build an array
}
echo json_encode($row_set);//format the array into json data

?>

我能够在自动完成列表中看到图像。但是有一个问题:输入几个字母后,会显示自动完成列表,如果我继续添加更多随机字母以期望自动完成列表消失(因为用户输入不再匹配)但它没有。 Andrew's example work well。我的javascript有什么问题吗?尝试通过 Firebug 调试,出现错误:TypeError element is null。

【问题讨论】:

    标签: jquery-ui jquery-ui-autocomplete


    【解决方案1】:

    演示图像部分的关键是覆盖_renderItem 函数以更改生成的li 以建议项目。这通常意味着您的源是一个数组,其中包含具有label 和/或value 属性的对象,以及允许您在_renderItem 内正确显示图像的属性。

    缓存代码仅将搜索词和结果存储在哈希中,并在访问服务器之前查看该哈希。

    以您链接的 JSFiddle 为例,下面是使用 StackOverflow 的 API 进行缓存和图像处理的内容:

    $(document).ready(function() {
        var cache = {},
            lastXhr;
    
        $("#auto").autocomplete({
            source: function(request, response) {
                var term = request.term;
    
                if (term in cache) {
                    response(cache[term]);
                    return;
                }
    
                lastXhr = $.ajax({
                    url: "http://api.stackoverflow.com/1.1/users",
                    data: {
                        filter: request.term,
                        pagesize: 10
                    },
                    jsonp: "jsonp",
                    dataType: "jsonp",
                    success: function(data, status, xhr) {
                        var results;
                        if (xhr === lastXhr) {
                            results = $.map(data.users, function(el, index) {
                                return {
                                    value: el.display_name,
                                    avatar: "http://www.gravatar.com/avatar/" + el.email_hash
                                };
                            });
    
                            cache[term] = results;
                            response(results);                                 
                        }
                    }
                });
            },
            delay: 500
        }).data("autocomplete")._renderItem = function(ul, item) {
            return $("<li />")
                .data("item.autocomplete", item)
                .append("<a><img src='" + item.avatar + "' />" + item.value + "</a>")
                .appendTo(ul);
        };
    });​
    

    注意事项

    • 这个示例比 jQueryUI 网站上的示例更复杂,因为来自 API 的数据必须进行转换(具有avatar/value 属性)。需要注意的重要一点是,我们在 $.map 调用转换结果数组之后缓存接收到的值。
    • 这看起来很复杂,但请记住答案顶部的两条准则,您应该会很好。

    示例: http://jsfiddle.net/rK7TS/

    【讨论】:

    • 谢谢安德鲁。但是仍然存在一个问题:当用户输入不再匹配时,自动完成列表不会消失。
    • 你的演示抛出错误Uncaught SyntaxError: Unexpected token &lt;
    【解决方案2】:

    这就是我所做的:

        lastXhr = $.getJSON( action, request, function( data, status, xhr ) {
    
            if( data && data !== null ) {
                var results;
                if( xhr === lastXhr ) {
                    results = $.map(data, function(item) {
                        return {
                            value: item.value,
                            avatar: item.avatar
                        };
                    });
                    cache[term] = results;
                    response(results);
                }
            } else {
                response([{ value: 'No results found.', avatar: null}]);
            }
    
        });
    

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多