在jQuery自动完成中覆盖_renderItem函数

时间:2017-10-08 15:40:05

标签: javascript jquery jquery-ui autocomplete

在覆盖_renderItem函数时,我无法使jQuery自动完成工作。以下代码有效,但当我取消注释_renderItem时,它会破坏它。在我尝试添加_renderItem函数之前,其他所有内容似乎都正常工作。

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"></script>
<script>
   $(function() {
      var availableTags = [
            <?php
            include ("./includes/open_database.php");
            $SQL = "CALL orders.get_inventory_2 ()";

            $q = mysqli_query($conn, $SQL);
            $i = 1;

            while ($qRow = mysqli_fetch_array($q))
            {
                echo '{ value: "' . $qRow["part_number"] . '", label: "' . $qRow["part_number"] . '", desc: "' . $qRow["description"] . '", file: "' . $qRow["filename"] . '", vendor: "' . $qRow["name"] . '" },';
            }

            include ("./includes/close_database.php");
            ?>
      ];

      function split(val) {
         return val.split(/;\s*/);
      }

      function extractLast(term) {
         return split(term).pop();
      }
      $("#part_numbers1")
         // don't navigate away from the field on tab when selecting an item
         .on("keydown", function(event) {
            if (event.keyCode === $.ui.keyCode.TAB && $(this).autocomplete("instance").menu.active) {
               event.preventDefault();
            }
         }).autocomplete({
            minLength: 0,
            source: function(request, response) {
               // delegate back to autocomplete, but extract the last term
               response($.ui.autocomplete.filter(availableTags, extractLast(request.term)));
            },
            focus: function() {
               // prevent value inserted on focus
               return false;
            },
            select: function(event, ui) {
               var terms = split(this.value);
               // remove the current input
               terms.pop();
               // add the selected item
               terms.push(ui.item.value);
               // add placeholder to get the comma-and-space at the end
               terms.push("");
               this.value = terms.join("; ");
               return false;
            }
         });.data("ui-autocomplete")._renderItem = function(ul, item) {
         return $("<li></li>").data("item.autocomplete", item).append("<a>" + item.label + "<br>" + item.desc + "</a>").appendTo(ul);
      };
   });
</script>

availableTags变量最终看起来像这样:

var availableTags = [{
   value: "",
   label: "",
   desc: "",
   file: "",
   vendor: ""
}, {
   value: "WES504",
   label: "WES504",
   desc: "",
   file: "",
   vendor: ""
}, {
   value: "WV057C",
   label: "WV057C",
   desc: "",
   file: "",
   vendor: ""
}];

除了大约2000个值。

1 个答案:

答案 0 :(得分:0)

我在这里看到两个问题。

首先,您遇到语法错误:

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

我相信你希望这样:

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

;})之间的额外.data会导致JavaScript无法读取其他命令。

第二个问题是菜单项本身:

     return $("<li></li>").data("item.autocomplete", item).append("<a>" + item.label + "<br>" + item.desc + "</a>").appendTo(ul);

您希望生成的HTML是包含Div的包含标签的List Item。不确定为什么使用链接。

您将要使用:

     return $("<li></li>").data("item.autocomplete", item).append("<div><a>" + item.label + "<br>" + item.desc + "</div></a>").appendTo(ul);

工作示例:https://jsfiddle.net/Twisty/d4hq5txc/