如何在 JQuery UI 自动完成中使用 source:function()... 和 AJAX

Posted

技术标签:

【中文标题】如何在 JQuery UI 自动完成中使用 source:function()... 和 AJAX【英文标题】:How to use source: function()... and AJAX in JQuery UI autocomplete 【发布时间】:2014-02-18 14:07:37 【问题描述】:

我需要一点关于 JQuery UI 自动完成的帮助。我希望我的文本字段 (.suggest-user) 显示来自 AJAX 请求的名称。这就是我所拥有的:

jQuery("input.suggest-user").autocomplete(
    source : function(request, response) 
        var name = jQuery("input.suggest-user").val();
        jQuery.get("usernames.action?query=" + name, function(data) 
            console.log(data);  // Ok, I get the data. Data looks like that:
            test = data;        // ["one@abc.de", "onf@abc.de","ong@abc.de"]
            return test;        // But what now? How do I display my data?
        );
    ,
    minLength : 3
);

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

在您的 AJAX 回调中,您需要调用 response 函数;传递包含要显示的项目的数组。

jQuery("input.suggest-user").autocomplete(
    source: function (request, response) 
        jQuery.get("usernames.action", 
            query: request.term
        , function (data) 
            // assuming data is a javascript array such as
            // ["one@abc.de", "onf@abc.de","ong@abc.de"]
            // and not a string
            response(data);
        );
    ,
    minLength: 3
);

如果响应 JSON 与 jQuery UI 自动完成接受的格式不匹配,那么您必须在 AJAX 回调中转换结果,然后再将其传递给响应回调。 See this question and the accepted answer.

【讨论】:

简单一点。 jQuery 自动完成支持 'source' 参数的获取 url。 source: "usernames.action" 。您的方法应该返回一个 json 数组,并且应该接受一个名为“term”的参数。 @Elisa:正确。 OP 在示例中使用了回调(可能是出于某种原因),所以我也照做了。 这对我不起作用...它返回列表中的所有项目,而不是与查询词匹配的项目。 OP 在服务器端过滤结果,这个答案是假设的。 @LoryLory 如果你想修改自动完成的建议列表,然后在 *** 中搜索“jquery ui autocomplete _renderItem”。【参考方案2】:

试试这个代码。你可以用$.get代替$.ajax

$( "input.suggest-user" ).autocomplete(
    source: function( request, response ) 
        $.ajax(
            dataType: "json",
            type : 'Get',
            url: 'yourURL',
            success: function(data) 
                $('input.suggest-user').removeClass('ui-autocomplete-loading');  
                // hide loading image

                response( $.map( data, function(item) 
                    // your operation on data
                ));
            ,
            error: function(data) 
                $('input.suggest-user').removeClass('ui-autocomplete-loading');  
            
        );
    ,
    minLength: 3,
    open: function() ,
    close: function() ,
    focus: function(event,ui) ,
    select: function(event, ui) 
);

【讨论】:

【参考方案3】:
$("#id").autocomplete(

    search: function () ,
    source: function (request, response)
    
        $.ajax(
        
            url: ,
            dataType: "json",
            data:
            
                term: request.term,
            ,
            success: function (data)
            
                response(data);
            
        );
    ,
    minLength: 2,
    select: function (event, ui)
    
        var test = ui.item ? ui.item.id : 0;
        if (test > 0)
        
           alert(test);
        
    
);

【讨论】:

【参考方案4】:

这是带有示例 AJAX 调用的全新工作代码。

<link href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.css" rel="stylesheet" />
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.min.js"></script>

<div>
    <div id="project-label">Select a project (type "j" for a start):</div>
    <img id="project-icon" src="images/transparent_1x1.png" class="ui-state-default"  />
    <input id="project" />
    <input type="hidden" id="project-i" />
</div>


@*Auto Complete*@
<script>
    $(function () 

        $("#project").autocomplete(
            minLength: 0,
            source : function( request, response ) 
                $.ajax(
                    url: "http://jsonplaceholder.typicode.com/posts/1/comments",
                    dataType: "jsonp",
                    data: 
                        q: request.term
                    ,
                    success: function (data) 
                        response( data );
                    
                );
            ,
            focus: function (event, ui) 
                $("#project").val(ui.item.label);
                return false;
            ,
            select: function (event, ui) 
                $("#project").val(ui.item.name);
                $("#project-id").val(ui.item.email);                    

                return false;
            
        )
            .data("ui-autocomplete")._renderItem = function (ul, item) 
                return $("<li>")
                    .data("ui-autocomplete-item", item)
                    .append("<a> " + item.name + "<br>" + item.email + "</a>")
                    .appendTo(ul);
            ;
    );
</script>

【讨论】:

我看到您从 ajax 调用中获得了 jsonp 响应。回调函数叫什么名字?【参考方案5】:

.ASPX 页面上:

  <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  <html xmlns="http://www.w3.org/1999/xhtml">
  <head id="Head1" runat="server">
        <title>AutoComplete Box with jQuery</title>
        <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js"></script>  
        <script type="text/javascript">
            $(document).ready(function() 
                SearchText();
            );
            function SearchText() 
                $(".autosuggest").autocomplete(
                    source: function(request, response) 
                        $.ajax(
                            type: "POST",
                            contentType: "application/json; charset=utf-8",
                            url: "Default.aspx/GetAutoCompleteData",
                            data: "'username':'" + document.getElementById('txtSearch').value + "'",
                            dataType: "json",
                            success: function (data) 
                                if (data != null) 

                                    response(data.d);
                                
                            ,
                            error: function(result) 
                                alert("Error");
                            
                        );
                    
                );
            
        </script>
  </head>
  <body>
      <form id="form1" runat="server">
          <div class="demo">
           <div class="ui-widget">
            <label for="tbAuto">Enter UserName: </label>
       <input type="text" id="txtSearch" class="autosuggest" />
    </div>
        </form>
    </body>
    </html>    

在您的 .ASPX.CS 代码隐藏文件中:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Web.Services;
using System.Data;

public partial class _Default : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e)
    
    

    [WebMethod]
    public static List<string> GetAutoCompleteData(string username)
    
        List<string> result = new List<string>();
            SqlConnection con = new SqlConnection("Data Source=YourDatasource;Initial Catalog=DatabseName;uid=sa;password=123");

            SqlCommand cmd = new SqlCommand("select DISTINCT Name from Address where Name LIKE '%'+@Name+'%'", con);
            con.Open();
                cmd.Parameters.AddWithValue("@Name", username);
                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                
                    result.Add(dr["Name"].ToString());
                
                return result;
        

【讨论】:

@Jaikrat 因为 GET 请求导致:“尝试使用 GET 请求调用方法 'GetAutoCompleteData',这是不允许的。”见:***.com/questions/18703838/…【参考方案6】:

设置自动完成:

$("#searchBox").autocomplete(
    source: queryDB
);

获取数据的源函数:

function queryDB(request, response) 
    var query = request.term;
    var data = getDataFromDB(query);
    response(data); //puts the results on the UI

【讨论】:

【参考方案7】:

当您询问时:

块引用 // 但是现在呢?如何显示我的数据? 块引用

你需要映射一个对象数组,这样:

response([label: 'result_name', value: 'result_id',]);

这样当你使用自动完成插件的选择事件时,你可以看到如下结果;

你可以这样使用 select 事件:

jQuery("#field").autocomplete(
      source: function (request, response) 

      ,
      minLength: 3,
      select: function(event, ui)
      
        console.log(ui);
      
  );

我希望它可以帮助和补充答案。

【讨论】:

【参考方案8】:
$("#subject_name").autocomplete(
  source: function(request, response) 
    $.ajax(
      url: "api/listBasicsubject",
      dataType: "json",
      type: "post",
      data: 
        search: request.term
      ,
      success: function(data) 

        if (!data.length) 
          var result = [
            label: 'Subject not found',
            value: response.term
          ];
          response(result);
         else 
          //response(data.data);
          response($.map(data.data, function(item) 
            return 
              label: item.subject_name,
              value: item.subject_id
            
          ));
        
      
    );
  ,
  change: function(event, ui) 
    if (ui.item == null) 
      $("#subject_name").val("");
      $("#subject_code").val("");
      $("#subject_name").focus();
    
  ,

  minLength: 0,
  classes: 
    "ui-autocomplete": "auto_compl-cat"
  ,

  focus: function(event, ui) 
    event.preventDefault();
    // $("#subject_name").val(ui.item.label);

    $("#subject_name").val(ui.item.label);

  ,

  select: function(event, ui) 
    if (ui.item.label == "Subject not found") 

      $("#subject_name").val('');
      $("#subject_code").val('');
      event.preventDefault();
      return false;
    
    //console.log( "Selected: " + ui.item.label + " aka " + ui.item.value);
    $("#subject_name").val(ui.item.label);
    $("#subject_code").val(ui.item.value);
    return false;
  
);

【讨论】:

以上是关于如何在 JQuery UI 自动完成中使用 source:function()... 和 AJAX的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 KnockoutJS 和 JQuery UI 创建自动完成组合框

Jquery UI 自动完成。如何使用 innerHTML 在 div 中写入结果?

如何在 JQuery UI 自动完成中添加一个 html 元素?

如何使用 jquery ui 自动完成使匹配的文本变为粗体?

jQuery UI 自动完成:如何让 TAB 选择列表中的第一个选项?

如何实现类似于 jQuery UI 自动完成的 Dojo 自动完成?