简体   繁体   English

为什么当我在“数据列表”元素中选择选择时“ keydown”会检测到(从jQuery get中选择项)

[英]Why 'keydown' detect when I chose select in 'datalist' element (select items from jQuery get)

I type in the input. 我输入输入。 After each character entered the key down event is detected. 输入每个字符后,将检测到按键事件。 I get the elements using ajax GET from .json file and save it to datalist as an option. 我从.json文件中使用Ajax GET获取元素,并将其保存为数据列表作为选项。 I want keydown only to fire when typing. 我只想在键入时触发keydown。 Why, when I take one option from datalist 'keydown' is also detect? 为什么当我从数据列表“ keydown”中选择一个选项时也会检测到?

Link to code example: https://playcode.io/453516?tabs=script.js,preview,console 链接到代码示例: https : //playcode.io/453516?tabs=script.js,预览,控制台

For example: 例如:

  1. I type for example 'c' in input 我在输入中输入例如“ c”
  2. keydown detect 按键检测
  3. in the console I have 'success' and list companies. 在控制台中,我有“成功”和上市公司。
  4. I select one element from the list 我从列表中选择一个元素
  5. keydown select - WHY? 按键选择-为什么?
  6. List of items don't disappear 项目清单不会消失

My code is here: 我的代码在这里:

 function debounce(func, wait, immediate) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; } const inputCompany = $('#company'); inputCompany.keydown('input', debounce(function() { //cleaning datalist let datalist = document.getElementById('listOfNames'); while (datalist.lastChild) { datalist.removeChild(datalist.lastChild); } $.ajax({ type: "GET", url: 'https://api.myjson.com/bins/1co0nd', data: "value=" + $(this).val().valueOf(), success: function(data) { console.log('success'); console.log(data); // add elements to datalist data.companies.forEach(item => { let options = document.createElement('option'); options.value = item; datalist.appendChild(options); }); }, error: function() { alert('error'); } }) }, 250)); 

I expect not to detect 'keydown' when I click on datalist option. 我希望在单击数据列表选项时不会检测到“ keydown”。

In that case I should use .keypress, because .keypress fires when an actual character is being inserted in, not keyboard key. 在那种情况下,我应该使用.keypress,因为.keypress是在插入实际字符而不是键盘键时触发的。

Correct code: 正确的代码:

const inputCompany = $('#company');

inputCompany.keypress('input',
    debounce(function () {

    //cleaning datalist
    let datalist = document.getElementById('listOfNames');
    while (datalist.lastChild) {
        datalist.removeChild(datalist.lastChild);
    }

    $.ajax({
        type: "GET",
        url: 'https://api.myjson.com/bins/1co0nd',
        data: "value=" + $(this).val().valueOf(),
        success: function (data) {
            console.log('success');
            console.log(data);

            // add elements to datalist
            data.companies.forEach(item => {
                let options = document.createElement('option');
                options.value = item;
                datalist.appendChild(options);
            });
        },
        error: function () {
            alert('error');
        }
    })

}, 250));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM