【问题标题】:Autocomplete with Categories and remote datasource使用类别和远程数据源自动完成
【发布时间】:2012-07-29 05:20:34
【问题描述】:

我想做的是通过 jQueryUI 的功能使用自动完成对结果进行分类。经过一番谷歌搜索后,我发现它有一个内置函数(http://jqueryui.com/demos/autocomplete/#categories),但该示例仅适用于本地数据源(javascript 中的数组)。我正在处理一个远程数据源。它的自动完成功能在没有添加类别代码的情况下工作正常,但在添加时会中断。

这说明php代码没问题(返回json数据的搜索页面)。

我从 jQueryUI 网站获取了这段代码:

$.widget( "custom.catcomplete", $.ui.autocomplete, {
                _renderMenu: function( ul, items ) {
                    var self = this,
                    currentCategory = "";
                $.each( items, function( index, item ) {
                if ( item.category != currentCategory ) {
                    ul.append( "<li class='ui-autocomplete-category'>" + item.category + "</li>" );
                    currentCategory = item.category;
            }
            self._renderItem( ul, item );
        });

然后我将它与它的搜索端结合起来(更改为类别):

$(function() {
        $( "#search" ).catcomplete({
            delay:0,
            source: "query/encode-json.php?term="+ $("#search").val(),
            select: function(event, ui){
                alert(ui.item.label);
            }
        });     
    });

但它不起作用:(我搜索了很多,但其他人都对它的 json 方面有疑问。这是我的 json 数据:

[{"value":"some dude","id":"1","category":"artist"},{"value":"some other dude","id":"2","category":"artist"}]

【问题讨论】:

    标签: javascript jquery jquery-ui autocomplete jquery-ui-autocomplete


    【解决方案1】:

    我很确定您的问题是您传递给自动完成的选项对象的 source 属性:

    $("#search").catcomplete({
        delay:0,
        source: "query/encode-json.php?term="+ $("#search").val(),
        select: function(event, ui){
            alert(ui.item.label);
        }
    });    
    

    source 在您实例化小部件时将被评估一次。换句话说,$("#search").val() 不会在每次用户输入时都被执行。

    由于默认情况下自动完成在查询字符串中发送term,你应该能够做到:

    $("#search").catcomplete({
        delay:0,
        source: "query/encode-json.php",
        select: function(event, ui){
            alert(ui.item.label);
        }
    }); 
    

    我很确定其他一切都是正确的,因为使用您的数组作为具有类别的本地数据源可以正常工作:http://jsfiddle.net/jadPP/

    【讨论】:

    • 感谢您的尝试。还是不行。我在我添加的内容中添加的原因( ?term="+ $("#search").val(), )是输入的值需要传递给尝试查找相似值的 php 脚本。随着您输入的次数越来越多(忽略类别),它确实会缩小当前的结果范围。
    • 你说它在没有类别的情况下有效?这很奇怪...如果您打开 Firebug,请求看起来是否正确?你有一个可以公开访问的网站吗?
    • 我们开始:coverartists.net/artist-search.php 来解释一下。右上角的搜索使用(尝试的)类别代码。更大的搜索使用预先存在的代码等(并且有效)。所以,你会看到增值位是如何工作的等等。谢谢:)
    • 然后开始输入 sam 或 st。编辑:Firefox 中有一些 CSS 问题。我知道。还没来得及看他们。
    • 看起来你的脚本顺序有一些问题——我在$(window).load 代码上遇到了一个 JS 错误。确保在其他脚本之前先加载 jQuery。当我在有问题的文本框中输入时,我没有看到任何 AJAX 请求上升
    【解决方案2】:

    使用这个:

    http://www.jensbits.com/2010/03/29/jquery-ui-autocomplete-widget-with-php-and-mysql/

    (更新)

    希望这会有所帮助:-)

    【讨论】:

    • 我不认为你理解这个问题。我需要在 jqueryui 链接中使用 php 查询的类别。我的 php 查询与 json 数据(包括传递的类别信息)一起工作,但我无法显示它的类别。
    【解决方案3】:

    默认的_renderItem() 方法会查找item.label,但您的json 数据包含item.value。您需要将您的 encode-json.php 脚本更改为使用 label 而不是 value,或者您必须使用您提供自己的回调函数的 source: 版本。

    【讨论】:

    • 尝试过但没有成功。与标签交换值。不过谢谢
    • 这根本不是真的。早在调用 _renderItem 之前,自动完成项目就被规范化为一致的格式。
    • 我认为规范化只有在你使用一种紧凑形式的源时才会发生:返回一个字符串数组。如果您的 AJAX 调用返回对象,那么规范化应该如何知道应该使用对象中的哪个属性?完成此操作的正常方法是使用提取完成数据的回调函数,但他没有这样做。
    • 改回值,它仍然有效。所以...是的 :) 我猜很高兴它可以工作 :)
    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多