动态创建 HTML5 datalist

6

我正在尝试动态创建一个数据列表并将其附加到现有的输入元素上。但是没有任何反应(没有显示下拉箭头)。 jQuery也可以接受。

var optionList = ["Seattle", "Las Vegas", "New York", "Salt lake City"];

function fillDataList() {
    var container = document.getElementById('my-text-box'),
    i = 0,
    len = optionList.length,
    dl = document.createElement('datalist');

    dl.id = 'dlCities';
    for (; i < len; i += 1) {
        var option = document.createElement('option');
        option.value = optionList[i];
        dl.appendChild(option);
    }
    container.appendChild(dl);
}

工具: https://jsfiddle.net/tomsx/704cxako/

( 例子摘自这个网站: http://blogs.microsoft.co.il/gilf/2012/07/30/quick-tip-autocomplete-using-html5-datalist-element/ )

4个回答

6
您需要将输入元素的`list`属性设置为datalist的id:
<input id="my-text-box" list="dlCities"/>

Working Code Example:

var optionList = ["Seattle", "Las Vegas", "New York", "Salt lake City"];

function fillDataList() {
    var container = document.getElementById('my-text-box'),
    i = 0,
    len = optionList.length,
    dl = document.createElement('datalist');

    dl.id = 'dlCities';
    for (; i < len; i += 1) {
        var option = document.createElement('option');
        option.value = optionList[i];
        dl.appendChild(option);
    }
    container.appendChild(dl);
}
fillDataList();
<input id="my-text-box" list="dlCities"/>

或者:如果您不想修改HTML,可以使用Element.setAttribute()在JavaScript中设置属性:

container.setAttribute('list','dlCities');

var optionList = ["Seattle", "Las Vegas", "New York", "Salt lake City"];

function fillDataList() {
    var container = document.getElementById('my-text-box'),
    i = 0,
    len = optionList.length,
    dl = document.createElement('datalist');
    container.setAttribute('list','dlCities'); // Set the attribute here

    dl.id = 'dlCities';
    for (; i < len; i += 1) {
        var option = document.createElement('option');
        option.value = optionList[i];
        dl.appendChild(option);
    }
    container.appendChild(dl);
}
fillDataList();
<input id="my-text-box"/>


我不能修改 HTML 代码(现有网站)。因此,我需要通过代码添加列表属性。 setAttribute()对我无效:https://jsfiddle.net/tomsx/704cxako/48/ - smolo
谢谢,伙计。现在它可以工作了。看起来addEventListener()没有起作用,我刚刚把它移除了。 - smolo
当输入标签大于600像素时,选项与输入宽度不匹配。 - dragonn

3

仅在页面加载时存在输入:

注意我如何使用 "input.setAttribute('list','datalist')" 而不是直接使用 "input.list = 'datalist'"。

var datalist = document.createElement('datalist');
datalist.id = "datalist";
document.body.appendChild(datalist);
["Seattle", "Las Vegas", "New York", "Salt lake City"].forEach(function(data) {
  var option = document.createElement('option')
  option.value = data
  datalist.appendChild(option)
});
document.querySelector('#my-text-box').setAttribute('list', "datalist");
<input id='my-text-box' />


不错的解决方案,而且更短 :) - smolo
使用 setAttribute 时运行良好。为什么直接使用 input.list = 'datalist' 不起作用? - robert

1
尝试以下解决方案,使用jqueryinput文本更改时追加选项。

$(document).ready(function() {
 $("#search").on("input", function(e) {
  var val = $(this).val();
  if(val === "") return;
   var arr = ['apple','banana','google','code','microsoft'];
   var dataList = $("#searchresults");
   dataList.empty();
   if(arr.length) {
    for(var i=0, len=arr.length; i<len; i++) {
     var opt = $("<option></option>").attr("value", arr[i]);
     dataList.append(opt);
    }
   }

 });
});
<!doctype html>
<html>
<head>
<title>Example 1</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</head>

<body>

<p>
 <input type="text" name="search" id="search" placeholder="Type Something" list="searchresults" autocomplete="off" />
 <datalist id="searchresults"></datalist>
</p>

</body>
</html>


0

JS

    var optionList = ["Seattle", "Las Vegas", "New York", "Salt lake City"];

    function fillDataList() {

        var container = document.getElementById('my-text-box'),
        i = 0,
        len = optionList.length,
        dl = document.createElement('datalist');

        dl.id = 'dlCities';
        for (; i < len; i += 1) {
            var option = document.createElement('option');
            option.value = optionList[i];
            dl.appendChild(option);
        }
        container.appendChild(dl);
    }

fillDataList();

HTML

<input id="my-text-box" list='dlCities'>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接