12

在一个 jquery 对话框中,我想使用 jqueryUI 的 jquery 自动完成功能。

然后我在我的控制器中准备了一个动作(我正在使用 ASP.NET MVC2),如下所示

public ActionResult GetForos(string startsWith, int pageSize)
{
    // get records from underlying store
    int totalCount = 0;
    string whereClause = "Foro Like '" + startsWith + "%'";
    List<Foro> allForos = _svc.GetPaged(whereClause, "Foro", 0, pageSize, out totalCount);

    //transform records in form of Json data
    List<ForoModelWS> foros = new List<ForoModelWS>();
    foreach ( Foro f in allForos)
        foros.Add( new ForoModelWS() { id= Convert.ToString(f.ForoId), 
            text= f.Foro + ", Sezione: " + f.Sezione + ", " + f.AuthorityIdSource.Name });

    return Json(foros);
}

ForoModelWS 类是一个简单的类,仅用于保存应以 json 格式传输的数据。这里是

public class ForoModelWS
{
    public string id;
    public string text;
}

在客户端,我有以下 jquery 代码:

<input id="theForo" />

<script type="text/javascript">
    $(document).ready(function() {

        $("#theForo").autocomplete({
            source: function(request, response) {
                $.ajax({
                    type: "post",
                    url: "/Foro/GetForos",
                    dataType: "json",
                    data: {
                        startsWith: request.term,
                        pageSize: 15
                    },
                    success: function(data) {
                        response($.map(data, function(item) {
                            return {
                                label: item.text,
                                value: item.text
                            }
                        }))
                    }
                })
            },
            minLength: 2,
            select: function(event, ui) {
            },
            open: function() {
                $(this).removeClass("ui-corner-all").addClass("ui-corner-top");
            },
            close: function() {
                $(this).removeClass("ui-corner-top").addClass("ui-corner-all");
            }
        });

    });
</script>

但是没有出现带有建议的滑动窗口。如果我在响应函数中添加警报,我可以看到正确的数据。

我错过了什么吗?

感谢您的帮助

第一次编辑:此外,如何更改代码以使用返回列表中所选元素的“id”属性?

第二次编辑:我用 Chrome 开发者工具检查了更多,我发现当自动完成启动时会出现一些错误。以下:

Uncaught TypeError: Cannot call method 'zIndex' of undefined  @ _assets/js/jquery-ui-1.8.4.custom.min.js:317
Uncaught TypeError: Cannot read property 'element' of undefined @ _assets/js/jquery-ui-1.8.4.custom.min.js:321
Uncaught TypeError: Cannot read property 'element' of undefined @ _assets/js/jquery-ui-1.8.4.custom.min.js:320

似乎自动完成插件在尝试将滑动建议的 z-Index 设置为 1 提升其容器时找不到元素。当 jquery UI Dialog 打开时出现第一个错误。自动完成的输入位于 jquery 对话框内的 jquery 选项卡内

第三次编辑:我正在添加 HTML 标记以完成

<td width="40%">
   <%= Html.LabelFor(model => model.ForoID)%>
   <br />
   <%= Html.HiddenFor(model => model.ForoID) %>
   <input id="theForo" />
   <%= Html.ValidationMessageFor(model => model.ForoID, "*")%>
</td>
4

5 回答 5

7

我发现了问题。

就我而言,我还使用了另一个插件,这个.

该插件包含在我的脚本末尾并导致问题中描述的错误。我已经删除了插件,一切都很好。

在删除它之前,我还尝试隔离将两个脚本都放入静态 html 的问题。我经历过即使是最简单的自动完成功能的使用,像这样

<script type="text/javascript">
$(document).ready(function() {

    var availableTags = ["ActionScript", "AppleScript", "Asp", "BASIC", "C", "C++", "Clojure",
    "COBOL", "ColdFusion", "Erlang", "Fortran", "Groovy", "Haskell", "Java", "JavaScript",
    "Lisp", "Perl", "PHP", "Python", "Ruby", "Scala", "Scheme"];

    $("#theForo").autocomplete({
        source: availableTags
    });
});
</script>

会导致我得到的错误。

我的选择是删除菜单插件,即使不再支持该代码。

谢谢!

于 2010-09-24T18:54:43.993 回答
5

这个讨论真的很老了,但是在这里添加它以防万一它对某人有帮助......如果自动完成功能根本不起作用,因为下拉菜单中没有显示,那么首先使用硬编码建议检查最简单的形式以下。

$("#txtLanguage").autocomplete({ source: ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby"] });

如果这不起作用,那么它是 jquery 脚本链接的问题。在我的例子中,jquery.min.js 是旧版本 1.7.1,而所有其他脚本都是 1.8.18。

只需更换正确版本的脚本即可解决问题。

希望这可以帮助那些遇到自动完成工作的基本问题的人。

于 2012-04-06T12:55:00.417 回答
2

就像我在这里回答的那样,看看我的 jQuery UI 自动完成的工作示例。注意source部分。希望能帮助到你:

    var cache = {};
    $("#textbox").autocomplete({
      source: function(request, response) {
       if (request.term in cache) {
        response($.map(cache[request.term].d, function(item) {
         return { value: item.value, id: item.id }
        }))
        return;
       }
       $.ajax({
        url: "/Services/AutoCompleteService.asmx/GetEmployees",  /* I use a web service */
        data: "{ 'term': '" + request.term + "' }",
        dataType: "json",
        type: "POST",
        contentType: "application/json; charset=utf-8",
        dataFilter: function(data) { return data; },
        success: function(data) {
         cache[request.term] = data;
         response($.map(data.d, function(item) {
          return {
           value: item.value,
           id: item.id
          }
         }))
        },
        error: HandleAjaxError  // custom method
       });
      },
      minLength: 3,
      select: function(event, ui) {
       if (ui.item) {
        formatAutoComplete(ui.item);   // custom method
       }
      }
     });

如果您现在还没有这样做,请获取Firebug。它是 Web 开发的宝贵工具。你可以在这个 JavaScript 上设置一个断点,看看会发生什么。

于 2010-09-14T16:53:29.247 回答
1

fgmenu 使用函数 menu() AND autocomplete 使用函数

函数名相同会出现问题

您可以在 fgmenu.js 中更改函数名称

  $('#hierarchybreadcrumb6').menuA({content: $('#hierarchybreadcrumb6').next().html(),backLink: false});
于 2012-05-28T08:01:17.803 回答
0

基于我修改的洛伦佐答案

$.fn.fgmenu = function(options) { ... 

$.fn.fgmenu = function(options) { ...    

从这个插件菜单,它工作正常(自动完成和菜单插件)

于 2011-07-20T16:27:28.523 回答