【问题标题】:jQuery autocomplete get idjQuery自动完成获取ID
【发布时间】:2012-02-12 11:21:01
【问题描述】:

有一个演示效果很好。 http://jsfiddle.net/salman/VaKfP/

但是我在遵循示例代码时遇到了一些问题。

<script>
var js = '<?php echo $json; ?>';
console.log(typeof js);
$(document).ready(function() {
    var arr = jQuery.parseJSON(js);

    //local = [{value:1, label: "c++"},{value:2, label: "java"},{value:3, label: "ruby"},{value:4, label: "rubyonrails"}];

    $("#nominee_input").autocomplete({
          source: arr,
          focus: function(event, ui){
                 $('#nominee_input').val(ui.item.name);
                 return false;
          },
          select: function(event, ui){
                 $('#nominee_input').val(ui.item.name);
                 $('#hidden').val(ui.item.uid);
                 return false;
          }
    });

    $('#submit').click(function(){
          alert($('#hidden').val());
    });

});
</script>

$json 变量为 JSON 类型,其格式为:[Object { uid="11443624", name="angela"}, Object { uid="21503235", name="Sunny Lee"} ]。

如果我将源更改为 本地,它会很好地工作。但是当我使用 arr 作为源时它不起作用。

需要你的帮助。谢谢。

【问题讨论】:

  • 为了获得最佳实践,您可能希望在注释行中将 'local = ...' 稍微更改为 'var local = ...'。

标签: jquery json autocomplete


【解决方案1】:

来自documentation

本地数据可以是简单的字符串数组,也可以包含 数组中每个项目的对象,带有 label值 财产或两者兼而有之

自动完成插件需要一个具有以下属性的对象数组作为源:label 或/和 value

你的变量js不适合这个:

  1. 语法不正确。对象数组应该这样定义:[{key1: 'key1', key2: 'key2'}, ...]

  2. 你不能使用 $.parseJSON() 因为它不是一个 json 对象而是一个数组。像这样输出你的php:

    var js = <?php echo $json; ?>; // $json being [{uid:"11443624",name:"angela"},...]
    

当自动完成根据输入进行搜索时,它使用source 选项。在内部,插件实际上期望 source 选项是一个要执行的函数。诀窍是,当您指定数组或 url 时,插件会在其周围创建一个包装器以便能够使用它(参见 answer)。

如果您有自定义数据源,则可以将source 选项作为预期函数传递给自己。它的形式是:

source: function(request, response) { ... }

请求参数包含一个属性request.term,它是输入中输入的文本,响应参数是显示带有建议的菜单的功能。像这样使用它:

$("#nominee_input").autocomplete({
    source: function(request, response) {

        // $.map() builds an array understandable by autocomplete
        // $.ui.autocomplete.filter() will filter the array based on the request.term
        var filteredData = $.ui.autocomplete.filter($.map(arr, function(item) {
            return {
                value: item.name,
                label: item.name,
                uid: item.uid
            };
        }), request.term);

        // use the response callback to display the results
        response(filteredData);

    }
});


jsfiddle上的演示


当您拥有特定数据源(具有除标签和值之外的其他属性)时,您可能不希望以自定义方式显示结果。为此,您不能覆盖自动完成插件的默认 _renderItem 方法:

$("#nominee_input").autocomplete({ ... })
    .data("autocomplete")
    ._renderItem = function( ul, item ) {
       return $( "<li></li>" )
           .data( "item.autocomplete", item )
           .append( $('<a>' + item.label + ' - ' + item.uid  + '</a>')
                          .attr('data-uid', item.uid)
           )
           .appendTo( ul );
    };

【讨论】:

  • 非常感谢。它开始工作,但仍有一些问题。当我输入字母“e”时,它会显示许多与“e”无关的答案。如果我从滚动菜单中选择一个名称,我可以获得 id。好的。但是我尝试了其他字母,它似乎不起作用。
  • .append( $('&lt;a&gt;&lt;/a&gt;').attr('data-uid', item.uid).text(item.name) ) 这是什么意思,尤其是data-uid
  • 这是一个data attribute。它是 HTML5 的一个特性(但可以与以前的版本一起使用,因为它们只是属性)。它允许在 html 属性中存储与元素相关的数据。注意:它实际上在自动完成插件中没有特定用途。
【解决方案2】:

如果 arr 变量格式真的是 [{ uid="11443624", name="angela"}] = 是你的问题。确保您的 php 正确格式化对象。如果格式正确,则不需要在其上运行 parseJSON。 php 输出应该像本地示例{value:1, label: "c++"} 那样使用标签/值对进行格式化。除非您按照 the ui example 覆盖 renderItem 方法,否则自动完成不会识别 uid/name 对。

$( "#project" ).autocomplete({
            minLength: 0,
            source: projects,
            focus: function( event, ui ) {
                $( "#project" ).val( ui.item.label );
                return false;
            },
            select: function( event, ui ) {
                $( "#project" ).val( ui.item.label );
                $( "#project-id" ).val( ui.item.value );
                $( "#project-description" ).html( ui.item.desc );
                $( "#project-icon" ).attr( "src", "images/" + ui.item.icon );

                return false;
            }
        })
        .data( "autocomplete" )._renderItem = function( ul, item ) {
            return $( "<li></li>" )
                .data( "item.autocomplete", item )
                .append( "<a>" + item.label + "<br>" + item.desc + "</a>" )
                .appendTo( ul );
        };

【讨论】:

  • 谢谢。问题可能是变量的格式。当我输入一些字母时,您知道如何更改代码以呈现正确的名称吗?我尝试了 Didier 的代码,但它似乎无法正常工作。代码是.append( $('&lt;a&gt;&lt;/a&gt;').attr('data-uid', item.uid).text(item.name) )
  • 其实我用了console.log(arr)和console.log(local)来检查arr和local的区别,但是好像是同一个类型……跨度>
  • console.log(arr) 的实际输出是什么?
  • console.log(arr): [Object { uid="11123432", name="Shen Wang"}, Object { uid="21545263", name="Siwen Chen"}, Object { uid="324785670", name="Suleng Soeung"}, Object { uid="49723430", name="Di Zhao"}, Object { uid="936543247", name="Yumin Lu"}, Object { uid="507789969", name="Sebastian Mitre"}] ---------- console.log(local): [Object { value=1, label="c++"}, Object { value=2, label="java"}, Object { value=3, label="ruby"}, Object { value=4, label="rubyonrails"}]
  • 我想通了。我刚刚重建了arr,将属性名称从uidname更改为valuelabel,因为插件似乎只支持这两个属性名称。
【解决方案3】:

$.parseJSON 返回一个对象,但看起来自动完成功能使用数组作为 source 参数。您是否尝试过将js 变量直接用于source

【讨论】:

    【解决方案4】:

    你试过了吗

    $("#nominee_input").autocomplete({
        source: <?php echo $json; ?>, /* without '' ! */
        ...
    

    ?

    你能写出“echo $json”到底写了什么吗?

    【讨论】:

    • 我试过了,还是不行。我认为可能是JSON和数组(变量:本地)的格式问题。但是我尝试了很多可能的方法,都没有工作......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2015-12-09
    相关资源
    最近更新 更多