如何在单击数据列表选项列表上触发事件?

时间:2015-08-09 05:53:56

标签: javascript html

我有一个看起来像这样的数据列表:

<datalist id="foodlist">
	
		<option value="one" ></option
		<option value="two" ></option>
		<option value="three" ></option>
	
</datalist>

<input type="text" list="foodlist" autocomplete=true id="inputItem"/>

当用户使用JavaScript选择列表中的选项时,我希望触发一个事件。

如何实现它?

onClick,onChange似乎不起作用。

3 个答案:

答案 0 :(得分:5)

我知道这有点旧,但我想我应该把它记录在某个地方。如果您尝试从下拉选择中检测输入而不是单击本身,则可以使用“输入”事件并检查传递的事件对象的类型 - 剪切/粘贴/按键输入将传递“InputEvent”对象,而数据列表选择将传递通用的“事件”对象。

var textbox = document.getElementById("inputItem");
textbox.addEventListener("input", function(e){
    
    var isInputEvent = (Object.prototype.toString.call(e).indexOf("InputEvent") > -1);
    
    if(!isInputEvent)
        alert("Selected: " + e.target.value);
    }, false);
<datalist id="foodlist">
	
		<option value="one" ></option>
		<option value="two" ></option>
		<option value="three" ></option>
	
</datalist>

<input type="text" list="foodlist" autocomplete=true id="inputItem"/>

答案 1 :(得分:0)

<datalist id="foodlist">    
    <option value="one" ></option>
    <option value="two" ></option>
    <option value="three"></option> 
</datalist>

<input id="txt" type="text" list="foodlist" autocomplete=true id="inputItem"/>

document.getElementById('txt').addEventListener('input', function () {
    console.log('changed'); 
    var val = document.getElementById("txt").value;
    alert(val);
});

仅在某些浏览器中支持datalist标记。这是获取选定值的简单技巧。

答案 2 :(得分:0)

虽然已经4岁了,但今天我偶然发现了它,并遇到了其他人报告的跨浏览器问题。通过侦听输入字段上的keyup事件,然后检查事件类型,可以解决此问题。

<input type="text" name="field_name" id="field_id" list="fields_list">
<datalist id="fields_list"></datalist>
<script>
var fieldInput = document.getElementById("field_id");

fieldInput.addEventListener('keyup', function(e) { if (isKeyboardEvent(e)) { myFunction(); } });

function isKeyboardEvent(e) {
    return (e instanceof KeyboardEvent);
}

function myFunction() {
   /* function that does something only on keyboard input */
}
</script>

实际击键将为KeyboardEvent,而数据列表选项单击将仅为Event

确认可以在Chrome,Firefox和Edge中使用。