将图像添加到具有缓存的jQuery UI自动完成远程源

时间:2012-09-16 02:55:21

标签: jquery-ui jquery-ui-autocomplete

我正在使用带缓存的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将此示例集成到现有的远程中。任何帮助将非常感谢。非常感谢。

后续行动:正如安德鲁·惠特克所说,我已更新了我的剧本如下:

<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元素为null。

err

2 个答案:

答案 0 :(得分:3)

演示图像部分的关键是覆盖_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/

答案 1 :(得分:0)

这就是我的所作所为:

    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}]);
        }

    });