JQuery автозаполнение позиции раскрывающегося меню - PullRequest
4 голосов
/ 08 января 2020

Я использую виджет автозаполнения jQuery в своем проекте. Работает нормально, ожидаем, что выпадающее меню добавляется к телу вместо ввода. Мои коды следующие:

html

    <div class="flddiv fw"  id="mealcommentsdiv">

    <input id="foodautotest"  type="text" placeholder="autocomplete">

</div>

Javascript

function getVectors(VectorTypeID) {

Vectortype[VectorTypeID]={}

return $.ajax

({

    url: "functions.php",

    data: {
        method: "getvectors",
        VectorTypeID:VectorTypeID
    },

    method: "post",

    dataType: 'json',

    success: function(result)

    {
        Vectortype[VectorTypeID]=result



        switch(VectorTypeID){

            case 1:

                $.each(result,function(key,value){

                    strfoods.push(value)

                })

                $( "#foodautotest" ).autocomplete({
                    source: strfoods,
                    appendTo: "#foodautotest",

                }

                })
                break
        }

    }

});

}

Сайт использует сеточную структуру ccs

Спасибо за вашу помощь

Ответы [ 3 ]

1 голос
/ 13 января 2020

Как вы упомянули, выпадающее меню автозаполнения добавляется к телу. Из-за отсутствия опции appendTo

Независимо от значения, если элемент не найден, меню будет добавлено к телу.

Предоставление опции для div с позицией absolute решает проблему.

HTML

<input id="foodautotest" type="text" placeholder="autocomplete">
<div id="autocomplete-cont"></div>

JS

appendTo: '#autocomplete-cont',

CSS

#autocomplete-cont {
  position: absolute;
}

DEMO

var strfoods = ["Bread", "Beef", "Mango", "Salad", "Eggs", "Chicken", "Pork", "Cabagge", "Ice Cream", "Banana", "Rice", "Xmas Cake", "Cassava", "Potatochip", "Chickhen Curry", "Steak Sandwich", "Bbq Pork", "Pavalova", "Calamari", "Sushi", "Roast Beef", "Duck", "Asparagus"]

function getVectors(VectorTypeID) {
  console.log("Got Vectors:", strfoods);
  $("#foodautotest").autocomplete({
    appendTo: '#autocomplete-cont',
    source: strfoods
  });
}

getVectors();
body {
  color: #000;
  font-family: Tahoma;
  font-size: 15px;
  height: 100%;
  margin: 0;
  padding: 0;
  position: absolute;
  width: 100%;
  overflow: auto;
  overflow-x: hidden;
  display: contents;
}

#container {
  display: grid;
  grid-template-areas: "fixedpart""movingpart";
  grid-template-columns: 1fr
}


/* placement and layout of items in container grids  */

#fixedpart {
  grid-area: fixedpart;
  display: grid;
  grid-template-areas: "mainnav""caselabel""case";
  grid-template-columns: 1fr;
  position: fixed;
  width: 100%;
  z-index: 3;
}

#movingpart {
  grid-area: movingpart;
  display: grid;
  grid-template-areas: "interviewlabel interviewlabel""interview interview""investigation information";
  grid-template-columns: 450px 1fr;
  /* 	margin-top: 195px; */
}

@media screen and (max-width:1280px) {
  #movingpart {
    grid-template-columns: 350px 1fr
  }
}


/* placement and layout of items in fixedpart grids  */

#mainnav {
  grid-area: mainnav;
  padding: 10px;
  display: grid;
  grid-template-areas: "button form fullscreen";
  grid-template-columns: max-content max-content 1fr;
  grid-gap: 10px;
  background-color: white;
  width: 99%;
}

#caseform {
  display: grid;
  grid-template-rows: repeat(4, auto);
  grid-template-areas: "name""comments""nav""error";
}

#caseslabel {
  grid-area: caselabel;
  border-bottom: rgb(232, 205, 201) solid thin
}

#caseform {
  grid-area: case;
  padding: 0 10px 10px;
}


/* placement and layout of items in movingpart grids  */

#interviewlabel {
  grid-area: interviewlabel
}

#interviewform {
  grid-area: interview;
  padding: 10px;
  display: grid;
  grid-template-areas: "date firstname lastname age address phone email""gotsick comments comments comments comments comments comments ""nav nav nav nav nav nav nav""error error error error error error error";
  grid-gap: 10px;
  grid-template-columns: 1fr 1fr 1fr 1fr 2fr 1fr 1fr;
}

#investigation {
  grid-area: investigation;
}

#result {
  grid-area: information;
}

#investigation,
#result {
  display: grid;
  grid-template-areas: "nav""display";
  grid-template-rows: 40px 1fr;
}


/* placement and layout of items in mainnav grids  */

#mainnav>form {
  grid-area: form
}

#mainnav form {
  display: none;
  grid-row-gap: 10px;
}


}

/* placement and layout of items in casenamediv and casecommentsdiv grids  */
#casenamediv p,
#casecommentsdiv p {
  grid-area: label;
}
#casename,
#casecomments {
  grid-area: input;
}

/* placement and layout of items in investigation div grids  */
#investigatornav {
  grid-area: nav;
  display: grid;
  grid-template-areas: "button""ul";
  grid-template-rows: 40px 1fr;
}
#mealform {
  grid-area: display;
  display: grid;
  grid-template-areas: "date time""provider provider""food food""comments comments""nav nav";
  grid-template-columns: 1fr 1fr;
  padding: 10px;
  grid-gap: 10px;
}

/* placement and layout of items in mealform grids  */
#mealdatediv {
  grid-area: date;
  display: grid
}
#mealtimediv {
  grid-area: time;
  display: grid
}
#mealproviderdiv {
  grid-area: provider;
  grid-template-areas: "searchbox""button";
  display: grid;
}
#foodconsumeddiv {
  grid-area: food
}
#mealcommentsdiv {
  grid-area: comments
}
#mealnavigatior {
  grid-area: nav
}

/* end grid setup */
p {
  padding: 0;
  margin: 0;
}
input,
textarea {
  border: grey thin solid;
}
.pac-container {
  display: none;
}

/*Color scheme */
.casecol {
  background-color: rgb(232, 205, 201)
}
.interviewcol {
  background-color: rgb(177, 188, 173)
}
.bodycol {
  background-color: rgb(244, 252, 242)
}
.buttoncol {
  background-color: rgb(226, 216, 216)
}
.labelcol {
  background-color: rgb(221, 221, 221)
}

/*End Color Scheme */
#toggle {
  background-color: transparent;
  border: none;
  padding: 0
}
#interviewlabel {
  border-bottom: rgb(177, 188, 173) solid thin
}
#btnfirst {
  border-bottom-left-radius: 10px;
  border-top-left-radius: 10px;
}
#btnlast {
  border-bottom-right-radius: 10px;
  border-top-right-radius: 10px;
}
#btnnew {
  margin-left: 10px;
}
#mealsdiv {
  background-color: rgb(244, 252, 242);
}
#result {
  background-color: rgb(244, 252, 242);
  border-left: black thin solid;
}
#interviewnavigatior {
  padding-top: 1%
}
.maindivslabel {
  text-align: center;
  background-color: rgb(221, 221, 221);
  padding: 5px 0
}
.ta {
  text-align: center
}
#mealform {
  overflow: hidden;
  margin: 10px;
  border: thin black
}
#autocomplete-cont {
  position: absolute;
}
<!DOCTYPE HTML>

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.js"></script>
  <link href="https://code.jquery.com/ui/1.10.4/themes/ui-lightness/jquery-ui.css" rel="stylesheet">
  <script src="https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
</head>

<body class="bodycol">

  <div id="container">

    <div id="fixedpart">
      <div class="interviewcol maindivslabel" id="caseslabel">
        <span>CASES</span>
      </div>
      <form name="caseform" class="casecol" id="caseform"></form>
    </div>

    <div id="movingpart">
      <div class="interviewcol maindivslabel" id="interviewlabel">
        <span>INTERVIEWS</span>
      </div>


      <form id="interviewform" class=" interviewcol"> </form>

      <div id="investigation">
        <div id="investigatornav">
          <ul class="buttoncol"></ul>
        </div>

        <form id="mealform" name="mealform">

          <div class="flddiv fw" id="mealcommentsdiv">

            <input id="foodautotest" type="text" placeholder="autocomplete">
            <div id="autocomplete-cont"></div>
          </div>


        </form>
      </div>

      <div id="result">
        <div id=navdiv class="buttoncol">
          <div id="uldiv">
            <ul id="resultnav" class="buttoncol"></ul>
          </div>
        </div>
      </div>
    </div>
  </div>

</body>
0 голосов
/ 12 января 2020

Я не думаю, что можно даже визуализировать элементы внутри элемента ввода. Как насчет рендеринга выпадающего рядом с входом в качестве родственного брата.

html

<div>
    <div class="flddiv fw" id="mealcommentsdiv">
    <input id="foodautotest" type="text" placeholder="autocomplete">

    <!-- let's take this one as parent-->
    <div id="autocomplete-wrapper"></div>
</div>

js

$( "#foodautotest" ).autocomplete({
    source: strfoods,
    appendTo: "#autocomplete-wrapper",
});

Если это не соответствует вашим потребностям, пожалуйста, добавьте дополнительную информацию к вопросу, почему вам нужно добавить раскрывающийся список к элементу ввода.

РЕДАКТИРОВАТЬ: Пожалуйста, убедитесь, что ваши JQuery и JQueryUI обновлены, поскольку существуют некоторые несовместимости, которые привели к ошибкам в функции JQuerys offset.

См. здесь: https://github.com/vanderlee/colorpicker/issues/132

В настоящее время последние версии:

https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.js
https://code.jquery.com/ui/1.12.1/themes/ui-lightness/jquery-ui.css
https://code.jquery.com/ui/1.12.1/jquery-ui.js
0 голосов
/ 11 января 2020

Мне не удалось воспроизвести проблему, когда вы ее опубликовали. Я проверил следующий код:

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

  function getVectors(VectorTypeID) {
    console.log("Got Vectors:", strfoods);
    $("#foodautotest").autocomplete({
      source: strfoods
    });
  }
  
  getVectors();
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div class="flddiv fw" id="mealcommentsdiv">
  <input id="foodautotest" type="text" placeholder="autocomplete">
</div>

Работает как положено.

Вы упомянули, что ваша страница использует сетку CSS, но вы не включили в свой пример CSS. Что касается опции appendTo, см.:

К какому элементу следует добавить меню. Когда значение равно null, родители поля ввода будут проверены на класс ui-front. Если найден элемент с классом ui-front, к этому элементу будет добавлено меню. Независимо от значения, если элемент не найден, меню будет добавлено к body.

Примечание: Параметр appendTo не следует изменять, пока меню предложений open.

Таким образом, по умолчанию, он добавляется к телу с позицией, поэтому он появляется "под" полем ввода. Я думаю, что вы хотите добавить к родителю #mealcommentsdiv, а не сам элемент <input>. Невозможно проверить это на данном примере, так как он не содержит все нужные элементы или стили.

Поскольку виджет создает элементы, для отображения меню его нельзя добавить в поле ввода. Он может быть добавлен к родителю, а затем помещен для отображения под полем.

...