jQuery自动完成渲染项目未执行

jvi*_*iza 10 javascript jquery autocomplete

我在使用相同自动完成的同一HTML上有两个文本框(输入类型文本).第一个文本框工作正常,但第二个文本框不呈现结果.它与服务器通信,我得到结果,但甚至没有调用渲染功能.输入之间的唯一区别是,一个在div中开始隐藏,我通过设置z-order high和屏蔽HTML来显示类似Dialog窗口.

这是第二个输入框所在的div的CSS.

   .windowBooking  {
      position:absolute;
      width:450px;
     /* height:200px; */
      display:none;
      z-index:9999;
      padding:20px;
    }
Run Code Online (Sandbox Code Playgroud)

自动完成功能:

$(".makeClass").autocomplete({
    source: function (request, response) {
        $('#Code').val(); //clear code value
        $.ajax({
            url: "myUrl",
            type: 'POST',
            contentType: "application/json; charset=utf-8",
            dataType: 'json', //What kind of Result is expected. (Ex json, xml, etc)
            data: "{'searchItem':'" + request.term + "'}",
            success: function (data) {
                var item = [];
                var len = data.d.length;
                for (var i = 0; i < len; i++) {
                    var obj = { name: data.d[i].MakeReport, code: data.d[i].MakeCode };
                    item.push(obj);
                }
                response(item);
            }
        })
    },
    focus: function (event, ui) {
        $(this).val(ui.item.name);
        return false;
    },
    select: function (event, ui) {
        $('#Code').val(ui.item.code);
        $('#Name').val(ui.item.name);
        $(this).val(ui.item.name);
        return false;
    },
    open: function () {
        $(this).removeClass("ui-corner-all").addClass("ui-corner-top");
    },
    close: function () {
        $(this).removeClass("ui-corner-top").addClass("ui-corner-all");
    },
    minLength: 2,
    delay: 250
}).data("autocomplete")._renderItem = function (ul, item) {
    var temp = item.name;
    return $("<li></li>")
                .data("item.autocomplete", item)
                .append("<a>" + item.name + "</a>")
                .appendTo(ul);
};
Run Code Online (Sandbox Code Playgroud)

输入框使用相同的类来调用自动完成.

  <input id="OtherMake" type="text" maxlength="30" size="20" class="makeClass"/> <!-- It works -->

  <div id="dialogPlus" class="windowBooking">
                                     :
    <input  type="text" id="MakeName"  class="makeClass" /> <!-- doesn't work.-->
                                     :
 </div>
Run Code Online (Sandbox Code Playgroud)

任何想法,为什么在一个输入框上渲染而在另一个输入框中没有?让我说清楚,在第二个输入框中,唯一不起作用的是renderItem函数,由于某种原因它不会被执行.在屏幕上,您可以看到许多未定义但如果您选择任何未定义的值,则输入框将填充正确的值.

小智 7

我有一个类似的问题在类选择器上应用_renderItem()但是用它来解决它

$.each($( ".makeClass" ), function(index, item) {
        $(item).data("autocomplete")._renderItem = function (ul, item) {
        return $("<li></li>")
                .data("item.autocomplete", item)
                .append("<a>" + item.value + " - " + item.label + "</a>")
                .appendTo(ul);
        };
          });
Run Code Online (Sandbox Code Playgroud)


jvi*_*iza 1

我仍然不知道是什么导致了这个问题,但我能够通过使用 ID 而不是使用类来访问自动完成功能来使其工作。我的猜测是附加的渲染函数不能在两个输入框之间共享?我不知道,如果有人知道答案并可以与我们分享,那就太好了。

不管怎样,如果有人碰巧遇到了和我一样奇怪的问题,并且被这个问题困扰,这就是我解决它的方法。由于我不想重复相同的代码两次,因此我将所有自动完成逻辑移至一个 var,将渲染函数移至另一个 var,并使用输入框 ID 来分配自动完成。

  var makeAutocomplete = {
        source: function (request, response) {
            $('#Code').val(); //clear code value
            $.ajax({
                url: myUrl,
                type: 'POST',
                contentType: "application/json; charset=utf-8",
                dataType: 'json', //What kind of Result is expected. (Ex json, xml, etc)
                data: "{'searchItem':'" + request.term + "'}",
                success: function (data) {
                    var item = [];
                    var len = data.d.length;
                    for (var i = 0; i < len; i++) {
                        var obj = { name: data.d[i].MakeReport, code: data.d[i].MakeCode };
                        item.push(obj);
                    }
                    response(item);
                }
            })
        },
        focus: function (event, ui) {
            $(this).val(ui.item.name);
            return false;
        },
        select: function (event, ui) {
            $('#Code').val(ui.item.code);
            $('#Name').val(ui.item.name);
            $(this).val(ui.item.name);
            return false;
        },
        open: function () {
            $(this).removeClass("ui-corner-all").addClass("ui-corner-top");
        },
        close: function () {
            $(this).removeClass("ui-corner-top").addClass("ui-corner-all");
        },
        minLength: 2,
        delay: 250
    };

    var renderList = function (ul, item) {
        return $("<li></li>")
                .data("item.autocomplete", item)
                .append("<a>" + item.name + "</a>")
                .appendTo(ul);
    };

    $("#OtherMake").autocomplete(makeAutocomplete).data("autocomplete")._renderItem = renderList;
    $("#MakeName").autocomplete(makeAutocomplete).data("autocomplete")._renderItem = renderList;
Run Code Online (Sandbox Code Playgroud)