2

只有在用户输入至少 3 个字母后才能自动完成?这是我当前的代码:

HTML/PHP:

<form name="form" class="form-container" method="post" onsubmit="return doValidate()" id="myForm2">

                    <label> <input placeholder="Organisator" id="name" list="users" name="mitarbeiter" required /> </label> 
                         <datalist id="users" class="dle" >
                            <?php
                                for ($i=0; $i<$counts; $i++) {
                                    echo '<option value="'.$AllData[$i]["mail"][0].'">'.$AllData[$i]["cn"][0].'</option>'; 
                                }
                            ?>
                         </datalist>
                    <br><br>
                    von <input type="time" name="zeitstart" class="zeitangaben" id="startzeitid"> Uhr bis <input type="time" name="zeitende" id="endzeitid" class="zeitangaben"> Uhr <br><br> 

            <button type="submit" class="btn" name="submit">Reservierung erstellen</button>
            <button type="reset" class="btn cancel" onclick="hideDiv()">Abbrechen</button>
        </form>

我只找到一些带有 Jquery 的代码,没有 jquery 就不可能做到这一点吗?

甚至可能吗?有任何想法吗?

4

3 回答 3

6

这是一种方法:删除datalist ID属性

首先,声明querySelector()方法。

var input    = document.querySelector("#name"), // Selects the input.
    datalist = document.querySelector("datalist"); // Selects the datalist.

然后在元素上声明addEventListener方法。input

// Adds a keyup listener on the input.
input.addEventListener("keyup", (e) => {

    // If input value is longer or equal than 2 chars, adding "users" on ID attribute.
    if (e.target.value.length >= 2) {
        datalist.setAttribute("id", "users");
    } else {
        datalist.setAttribute("id", "");
    }
});

解释

当输入值的长度大于或等于 2 时,该setAttribute()方法将datalist ID属性设置为"users"

我将运算符设置为>= 2and not >= 3。原因如下:datalist下拉元素在每次按键时触发。

过程是这样的:

  1. length == 1 id=""- 下拉列表不显示,没有ID链接到datalist
  2. length == 2 id="users"- 不显示下拉列表,然后datalist将其ID设置为"users";
  3. length == 3 id="users"- 下拉列表现在读取ID设置为"users"并显示下拉列表。

缺点

  • 由于输入长度时设置了属性>= 2,如果输入长度== 3,输入长度时属性会被移除,输入长度时== 2下拉会隐藏== 1
  • 由于下拉列表是 的一部分OS且不是DOM 元素,因此无法设置样式(在本例中为隐藏)。这就是我使用该setAttribute()方法设置或删除ID.

升级?

一个很好的升级/完美的解决方案是JS在输入下方创建一个下拉列表。下拉列表将是 DOM 元素,您可以按照自己的方式对其进行样式设置。您可以将其显示为> 2字符并隐藏它< 3的字符。

片段

var input    = document.querySelector("#name"), // Selects the input.
    datalist = document.querySelector("datalist"); // Selects the datalist.

// Adds a keyup listener on the input.
input.addEventListener("keyup", (e) => {

    // If input value is larger or equal than 2 chars, adding "users" on ID attribute.
    if (e.target.value.length >= 2) {
        datalist.setAttribute("id", "users");
    } else {
        datalist.setAttribute("id", "");
    }
});

// I had to include your doValidate() function otherwise I would get an error while validaing.
function doValidate() {};
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>reading json</title>
    <script type="text/javascript">function log(p) {return console.log(p)}</script>
</head>
<body>


<form name="form" class="form-container" method="post" onsubmit="return doValidate()" id="myForm2">

    <label><input placeholder="Organisator" id="name" list="users" name="mitarbeiter" autocomplete='off' required /></label>
    <datalist id="users" class="dle">
        <option value="alicia@keys.com">Alicia Keys</option>
        <option value="alicia@keyssecond.com">Alicia The Second</option>
        <option value="john@doe.com">John Doe</option>
        <option value="martin@scorsese.com">Martin Scorsese</option>
        <option value="iron@man.com">Iron Man</option>
    </datalist><br><br>

    von <input type="time" name="zeitstart" class="zeitangaben" id="startzeitid"> Uhr bis <input type="time" name="zeitende" id="endzeitid" class="zeitangaben"> Uhr <br><br> 

<button type="submit" class="btn" name="submit">Reservierung erstellen</button>
<button type="reset" class="btn cancel" onclick="hideDiv()">Abbrechen</button>

</form>
</body>
</html>

于 2019-07-25T14:40:11.537 回答
3

您需要使用 javascript 并监听keyup输入元素的事件。

然后检查输入的值是否超过 3 个字符,如果是,则需要向服务器发出 ajax 请求以获取相关名称并使用它们来填充datalist

于 2019-07-25T13:39:52.440 回答
0

只是想当文本框包含至少 3 个字符并处理 Backspace ( ) 以防止在扩大搜索结果时显示完整列表时,我会使用setAttributeremoveAttribute来分享我所做的事情。keyUpkeyDowndirkeyCode=8

<input type="search" name="q" id="q" autofocus="true"
       onkeyup="if(this.value.length>=3)this.setAttribute('list','dir');" 
       onkeydown="if(this.value.length<3||event.keyCode==8)this.removeAttribute('list');"
       placeholder="Search Staff Directory"
/>

希望这可以帮助任何寻找不需要 jQuery 或 Ajax 的简单解决方案的人,只需一个简单的数据列表。

于 2021-04-08T14:44:38.850 回答