I\'m trying to create a datalist on they fly and attach it to an existing input element. But nothing happens (no dropdown arrow is shown) jQuery would be acceptable, too.
You have to set the input element's list
property as the id of the datalist:
<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"/>
OR: If you do not want to modify the HTML, you can use Element.setAttribute() to set the attribute in 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"/>
try below solution using jquery
on change of input
text its appending options.
$(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>
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'>
With only the input present when the page is loaded :
notice how I use "input.setAttribute('list','datalist')" and not "input.list = 'datalist' " directly.
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' />