【问题标题】:jQuery script works great with a click, doesn't work with keydown eventjQuery 脚本在单击时效果很好,不适用于 keydown 事件
【发布时间】:2016-02-04 22:06:03
【问题描述】:

我是一名学习 jQuery 的设计师。所以请原谅我缺乏理解;)我正在尝试将一种旋转木马的东西放在一起,其中一个主幻灯片可见,另外两个部分隐藏的幻灯片触发下一个/上一个幻灯片动作。

我已经这样解决了这个话题:当收到上一个/下一个点击时,部分可见的上一个/下一个 li 会重新排列 ul,使 ul 的最后一个 li 成为第一个,反之亦然,并使用 CSS 进行动画处理。我已经能够正确响应 li.next / li.prev 点击,但是当我尝试以相同的方式响应左/右按键时 - 它不起作用。

这是 HTML:

<ul>
    <li class="prev" data-id="1">

    </li><!--
    --><li class="main" data-id="2">

    </li><!--
    --><li class="next" data-id="3">

    </li><!--
    --><li data-id="4">

    </li><!--
    --><li data-id="5">

    </li>
</ul>

然后是 CSS(我知道它缺少包装溢出:隐藏的 div,为了清楚起见将其删除):

ul {
    list-style-type: none;
    display: block;
    height: 100%;
    width: 100%;
    margin: 0;
    padding: 0;
    white-space: nowrap;
    position: absolute;
    bottom: 0;
}

ul li {
    position: relative;
    display: inline-block;
    width: 100%;
    height: 95%;
    margin: 0;
    padding: 0;
    -webkit-transition: all 0.5s ease-out;
    transition: all 0.5s ease-out;
    white-space: normal;
    background: #eee;
    cursor: pointer;
}

ul li.main {
    height: 80%;
    width: 70%;
    margin: 0 15%;
    z-index: 4;
}

ul li.prev {
    height: 75%;
    margin: 0 -8% 0.5% -92%;
    z-index: 1;
}

ul li.next {
    height: 75%;
    margin: 0 0 0.5% -8%;
    z-index: 1;
}

现在是半成品脚本:

    //this works great

    $('body').on('click', 'li.prev', function() {
        $("body").find( "li" ).eq( 2 ).removeClass("next");
            $(this).next().removeClass().addClass("next");
            $(this).removeClass("prev").addClass("main");
            $(this).prev().removeClass().addClass("prev");

            var $this = $(this), callback = function() {         
$this.siblings(':last()').insertBefore($this).addClass("prev");
                    };
                $this.fadeIn(100, callback).fadeIn(100);
            }); 

            $('body').on('click', 'li.next', function() {
                $("body").find( "li" ).eq( 0 ).removeClass();
                $(this).prev().removeClass().addClass("prev");
                $(this).removeClass().addClass("main");
                $(this).next().removeClass().addClass("next");

                var $this = $(this), callback = function() {            
$this.siblings(':first()').insertAfter($this.siblings(':last()'));
                    };
                    $this.fadeIn(100, callback).fadeIn(100);
                }); 



    // now the left-right keys control attempt

    $(document).keydown(function(e) {
        switch(e.which) {

            case 37: // key right
                $("body").find( "ul li" ).eq( 2 ).removeClass("next");
                $("li.prev").next().removeClass().addClass("next");
                $("li.prev").removeClass("prev").addClass("main");
                $("li.prev").prev().removeClass().addClass("prev");

                var $this = $("li.prev"), callback = function() {      
                  $this.siblings(':first()').insertAfter($this.siblings(':last()'));
                    };
                    $this.fadeIn(100, callback).fadeIn(100);
                break;


            case 39: // key left
                $(".body").find( ".view ul li" ).eq( 0 ).removeClass();
                $("li.next").prev().removeClass().addClass("prev");
                $("li.next").removeClass().addClass("main");
                $("li.next").next().removeClass().addClass("next");

                var $this = $("li.next"), callback = function() {      $this.siblings(':first()').insertAfter($this.siblings(':last()'));
                    };
                    $this.fadeIn(100, callback).fadeIn(100);
            break;

            default: return;
        }
    });

这里是放在小提琴上的:

https://jsfiddle.net/nfp828yc/

能否请您帮帮我,告诉我让左/右键与li.prev/li.next 点击一样,我缺少什么?

非常感谢!

【问题讨论】:

  • 首先,e.which 包含什么?它是否包含任何键的任何内容?此外,它是否包含您正在使用的键的正确值?

标签: javascript jquery css


【解决方案1】:

您的问题是在 keydown 函数中您有一个未声明的 $this 因为您不在范围内。最简单的方法是在 keydown 时触发点击。看看这个:

$(document).keydown(function(e) {
    switch(e.which) {

        case 37: // key right
                $('li.next').trigger('click');
            break;


        case 39: // key left
                $('li.prev').trigger('click');
        break;

        default: return;
    }
});

所以你只做一次功能NEXT / PREV,然后当你按左右键箭头时,点击会在正确的&lt;li&gt;触发

看看它的工作原理:

https://jsfiddle.net/nfp828yc/4/

【讨论】:

  • 什么?我不明白你的评论@AnoopJoshi :(
  • 实际上我正要发布相同的答案。但后来我注意到,你已经在 40 秒前发布了答案..
  • 伙计们,非常感谢@Marcos 和 Anoop。这太棒了,不知道你可以这样做(我正在开始这个 jQuery 冒险;),现在我知道了,我是一个更好的人 :))谢谢!
  • 啊好吧!大声笑对不起,因为我更快xD。请注意,我有时间拒绝不相关的编辑,阅读所有代码,找出问题,制作小提琴并写下答案,所以这是旧西部更快;)下次祝你好运
  • @Marcos 感谢您的提示!我永远不会滥用它;)干杯!
【解决方案2】:

击键时触发点击:

case 37: // key right
     $('li.prev').trigger('click');
  break;

case 39: // key left
     $('li.next').trigger('click');
  break;

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2018-08-12
    • 2014-12-29
    相关资源
    最近更新 更多