【问题标题】:Press left and right arrow to change image?按左右箭头更改图像?
【发布时间】:2014-12-14 03:32:11
【问题描述】:

所以我有这个简单的幻灯片:

<div class="container">
    <div id="slideshow">
        <img alt="slideshow" src="1.jpg" id="imgClickAndChange" onclick="changeImage()" />
    </div>
</div>

当我像这样单击时,我设法使图像发生变化:

<script language="javascript">
    var imgs = ["2.jpg", "3.jpg", "4.jpg", "5.jpg"];

    function changeImage() {
        document.getElementById("imgClickAndChange").src = imgs[0];
        imgs.push(imgs.shift())
    }
</script>

问题是我还希望在按右箭头(用于下一步)和左箭头(返回)时更改图像。 我该怎么做? 我尝试添加一个“onkeypress”事件,但似乎没有任何效果。我做错了什么。我对javascript很陌生,所以如果你能帮助我,那就太好了。谢谢你:)

【问题讨论】:

    标签: javascript html image slideshow arrow-keys


    【解决方案1】:

    查看实际答案http://jsfiddle.net/7LhLsh7L/(提琴手注意:因为它在按箭头(左,右)键之前在编辑器本身中运行,您应该将焦点(只需单击结果区域)放在结果区域)

    这是标记和脚本:

    <div class="container">
        <div id="slideshow">
            <img alt="slideshow" src="http://thumb7.shutterstock.com/photos/thumb_large/253822/156271139.jpg" id="imgClickAndChange" onclick="changeImage()" />
        </div>
    </div>
    <script>
        var imgs = ["http://thumb7.shutterstock.com/photos/thumb_large/253822/156271139.jpg", "http://thumb9.shutterstock.com/photos/thumb_large/554278/132632972.jpg", "http://thumb7.shutterstock.com/photos/thumb_large/101304/133879079.jpg", "http://thumb101.shutterstock.com/photos/thumb_large/422038/422038,1327874090,3.jpg", "http://thumb1.shutterstock.com/photos/thumb_large/975647/149914934.jpg", "http://thumb9.shutterstock.com/photos/thumb_large/195826/148988282.jpg"];
    
        function changeImage(dir) {
            var img = document.getElementById("imgClickAndChange");
            img.src = imgs[imgs.indexOf(img.src) + (dir || 1)] || imgs[dir ? imgs.length - 1 : 0];
        }
    
        document.onkeydown = function(e) {
            e = e || window.event;
            if (e.keyCode == '37') {
                changeImage(-1) //left <- show Prev image
            } else if (e.keyCode == '39') {
                // right -> show next image
                changeImage()
            }
        }
    </script>
    

    上述方案的特点:

    • 如果您单击图像,它将带您到下一张图像,并在到达最后一张图像时重复循环。
    • 对于左箭头 (
    • 右箭头 (->) 的行为类似于单击。

    【讨论】:

    • 耶!有用。谢谢 :) 只有一件事,我希望左箭头返回并显示上一张图片,但它也显示下一张图片。我能做些什么来纠正这个问题?
    • @Owly:左箭头不显示上一张图片吗?我通过将所有图像放在一起检查了这个小提琴jsfiddle.net/7LhLsh7L/1
    【解决方案2】:

    虽然您已经接受了答案,但我自己解决问题的方法是:

    function imgCycle(e) {
        // obviously use your own images here:
        var imgs = ['nightlife', 'people', 'sports', 'cats'],
            // reference to the img element:
            imgElement = document.getElementById('imgClickAndChange'),
            // finding the string of the src after the last '/' character:
            curImg = imgElement.src.split('/').pop(),
            // finding that string from the array of images:
            curIndex = imgs.indexOf(curImg),
            // initialising the nextIndex variable:
            nextIndex;
    
        // if we have a keyCode (therefore we have a keydown or keyup event:
        if (e.keyCode) {
            // we do different things based on which key was pressed:
            switch (e.keyCode) {
                // keyCode 37 is the left arrow key:
                case 37:
                    // if the current index is 0 (the first element in the array)
                    // we next show the last image in the array, at position 'imgs.length - 1'
                    // otherwise we show the image at the previous index:
                    nextIndex = curIndex === 0 ? (imgs.length - 1) : curIndex - 1;
                    break;
                    // keyCode 39 is the right arrow key:
                case 39:
                    // if curIndex + 1 is equal to the length of the images array,
                    // we show the first element from the array, otherwise we use the next:
                    nextIndex = curIndex + 1 === imgs.length ? 0 : curIndex + 1;
                    break;
            }
            // if we don't have a keyCode, we check if the event-type (in lowercase)
            // is a mousedown:
        } else if (e.type.toLowerCase() === 'mousedown') {
            // I'm assuming you'd like to advance to the next image, rather
            // than regress to the previous (same check as above):
            nextIndex = curIndex + 1 === imgs.length ? 0 : curIndex + 1;
        }
        // setting the src of the image to the relevant URL + the string from the array
        // at the 'nextIndex':
        imgElement.src = 'http://lorempixel.com/200/200/' + imgs[nextIndex];
    }
    
    // binding a mousedown event-handler to the 'img' element:
    document.getElementById('imgClickAndChange').addEventListener('mousedown', imgCycle);
    // binding the keydown event-handler to the 'body' element:
    document.body.addEventListener('keydown', imgCycle);
    

    JS Fiddle demo.

    参考资料:

    【讨论】:

      【解决方案3】:

      您可以检测 JavaScript 中的箭头键按下,然后将每个键附加到一个事件。 This SO answer 展示了它是如何完成的,但本质上是:

      document.onkeydown = checkKey;
      
      function checkKey(e) {
      
          e = e || window.event;
      
          if (e.keyCode == '37') {
              // left arrow
          }
          else if (e.keyCode == '39') {
              // right arrow
          }
      }
      

      【讨论】:

      • 我尝试将这个
      猜你喜欢
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 2022-07-15
      • 1970-01-01
      • 2014-01-19
      相关资源
      最近更新 更多