链接jquery keydown事件

时间:2015-05-06 00:23:13

标签: javascript jquery html css

我正在尝试创建一个下拉式功能,一旦某人开始在输入框中输入,就会显示div。我可以在单个元素上附加鼠标单击事件以选择它们。但是我无法通过按Enter键来选择它们。

HTML

<input type="text" class="input" name="example" id="example" placeholder="example..." autocomplete="off" list="examplelist" />

<div class="autofill">
    <ul class="autocomplete">
        <li class="autocomplete-list">John Doe (San Jose, CA)</li>
        <li class="autocomplete-list">Jane Doe (San Francisco, CA)</li>
        <li class="autocomplete-list">John Jane (San Carlos, CA)</li>
    </ul>
</div>

JQuery的

$(document).ready(function () {
var $listItems = $('li.autocomplete-list'),
    $div = $('div.autofill'),
    $input = $('#example');

$div.hide();

$('input#example').on('keydown', function (e) {
    var key = e.keyCode,
        $selected = $listItems.filter('.selected'),
        $current;

    $div.show();

    if (key != 40 && key != 38) return;

    $listItems.removeClass('selected');

    if (key == 40) { // Down key
        if (!$selected.length || $selected.is(':last-child')) {
            $current = $listItems.eq(0);
        } else {
            $current = $selected.next();
        }
    } else if (key == 38) { // Up key
        if (!$selected.length || $selected.is(':first-child')) {
            $current = $listItems.last();
        } else {
            $current = $selected.prev();
        }
    }

    $current.addClass('selected');

    // When I press enter after selecting the li element
    // Does not work :(
    $current.on('keypress keydown keyup', 'li', function (event) {
        if (event.keyCode == 13) {
            var value = $(this).text().split('(')[0].trim();
            $input.val(value) ;
            $div.hide();
        }
    });
});


// If somebody clicks on the li item
$('li.autocomplete-list').on('click', function (e) {
    var value = $(this).text().split('(')[0].trim();
    $input.val(value);
    $div.hide();
});

// change color on hover
$('li.autocomplete-list').hover(
    function(){ $(this).addClass('hover') },
    function(){ $(this).removeClass('hover') }
);

// When I press enter after selecting the li element
// Does not work :( 

$('li.autocomplete-list').on('keypress keydown keyup', 'li', function (event) {
    if (event.keyCode == 13) {
        var value = $(this).text().split('(')[0].trim();
        $input.val(value) ;
        $div.hide();
    }
  });
});

如何选择特定的li元素,然后在输入时获取其值?这是JSFiddle

2 个答案:

答案 0 :(得分:1)

<li>元素没有焦点,即使它在视觉上被选中。文本输入仍然具有焦点。

您需要检查文本<input>上的回车键。不在<li>

$('input#example').on('keydown', function (e) {
    //...
    var key = e.keyCode
    if (key == 40) { // Down key
        //...
    } else if (key == 38) { // Up key
        //...
    } else if (key == 13) { // Enter key
        //... make sure $current is not null
    }
 //...
 }

另外要小心这句话

 if (key != 40 && key != 38) return;

当按下回车键时,将从事件处理程序返回。

这是一个小提琴:http://jsfiddle.net/q1vtwtdp/4/

答案 1 :(得分:0)

Jordan P是正确的,列表的处理应该都在输入的keydown处理函数内发生。

$('input#example').on('keydown', function (e) {

    var key = e.keyCode,
        $selected = $listItems.filter('.selected'),
        $current;

    $div.show();        

    $listItems.removeClass('selected');

    if (key == 40) { // Down key
        if (!$selected.length || $selected.is(':last-child')) {
            $current = $listItems.eq(0);
        } else {
            $current = $selected.next();
        }
    }

    if (key == 38) { // Up key
        if (!$selected.length || $selected.is(':first-child')) {
            $current = $listItems.last();
        } else {
            $current = $selected.prev();
        }
    }

    if (key == 13) {
        var value = $('.autocomplete-list').html().split('(')[0].trim();
        $input.val(value);
        $div.hide();
        $current = $selected
    }


    $current.addClass('selected');

});

所以你不需要:

$('li.autocomplete-list').on('keypress keydown keyup', 'li', function (event) {
    if (event.keyCode == 13) {
        var value = $(this).text().split('(')[0].trim();
        $input.val(value) ;
        $div.hide();
    }
  });

工作JSFiddle