【问题标题】:Slideshow on key press not working properly按键幻灯片无法正常工作
【发布时间】:2014-12-21 18:59:51
【问题描述】:

所以我有这个代码。我做错了什么。我想让左箭头返回(显示上一张图片),但它不起作用。它显示下一个图像(如右箭头)。无论我点击什么箭头,向左或向右,它都会显示下一个图像。我已经尝试了数百万种不同的方法,但似乎找不到问题所在。谁能帮帮我?

我也喜欢循环播放源。当到达数组的最后一个源时,我想再次循环回到第一个源(当你到达第一个源时再循环到最后一个源)。

顺便说一句,我还有一个代码,用于在点击时更改图像。我很确定这与问题无关,但我决定保留它,以防万一它搞砸了。
谢谢你:)


HTML:

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

JS:

<script>
    var imgs = ["2.jpg", "3.jpg", "4.jpg", "5.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') {
            changeImage() // right -> show next image
        }
    }
</script>

<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>

【问题讨论】:

  • 你重新定义了changeImage,它不能处理前进或后退。
  • 那我怎样才能让它来回前进呢?

标签: javascript html keyboard slideshow onkeypress


【解决方案1】:

你在正确的轨道上,但你做错了一些事情:

  • 您有两个同名变量。
  • 您有两个同名的函数。
  • 如果一个函数需要一个参数,你必须总是发送一个参数(或null),你不能只为左边发送-1,而对右边什么也不发送。 (在您的情况下,您实际上不发送1 是为了让自己变得更加困难)。
  • || imgs[dir ? imgs.length - 1 : 0],没有做你认为的事情。您正在检查dir,就好像它是一个布尔值一样。 JavaScript 可以将1-1 解释为布尔值(分别为truefalse),但是因为您只发送-1,所以它无法正常工作。

以下是修复了这些问题的代码:


JS、HTML:

var imgs = ["http://i.stack.imgur.com/NjC6V.jpg",
            "http://i.stack.imgur.com/0eBBQ.gif",
            "http://i.stack.imgur.com/uhjjB.png",
            "http://i.stack.imgur.com/cNhjf.jpg",
            "http://i.stack.imgur.com/Dn175.png"];

document.onkeydown = function(event) {
  var e = event || window.event;
  if (e.keyCode == '37') { //LEFT
    changeImage(-1);
  } else if (e.keyCode == '39') { //RIGHT
    changeImage(1);
  }
}

function changeImage(dir) {
  var img = document.getElementById("imgClickAndChange");
  img.src = imgs[imgs.indexOf(img.src)+dir] || imgs[(dir==1) ? 0 : imgs.length-1];
}
#imgClickAndChange {
  width: 150px;
  height: 150px;
}
<div class="container">
  <div id="slideshow"> 
    <img id="imgClickAndChange" src="http://i.stack.imgur.com/NjC6V.jpg" alt="" onclick="changeImage(1)" /> 
  </div>
</div>
小提琴:http://jsfiddle.net/k3wxhc58/8/
  • 在三元运算符中,您可以只使用dir 而不是(dir==1),因为JavaScript 将1 转换为true。但是使用 (dir==1) 更安全,因为这会创建一个真正的布尔值。
  • 我将imgs-array 中的图像替换为指向实际存在的图像的链接,这样脚本就可以正常工作。
  • 我添加了一些 CSS,这只是为了回答问题,以便所有图像具有相同的大小。

如果您不希望图像循环播放,请将changeImage() 函数更改为:

function changeImage(dir) {
    var img = document.getElementById("imgClickAndChange");
    var newSrc = imgs[imgs.indexOf(img.src)+dir];

    if (imgs.indexOf(newSrc) != -1) { //only sets new src if it's in the imgs-array (i.e. if it exists)
        img.src = newSrc;
    }
}

小提琴:http://jsfiddle.net/k3wxhc58/9/

【讨论】:

  • 谢谢 :) 但是我已经尝试过了,它仍然无法正常工作。即使我单击左箭头,它仍然会向前更改图像。当我去掉这部分代码时: var imgs = ["2.jpg", "3.jpg", "4.jpg", "5.jpg"];函数 changeImage() { document.getElementById("imgClickAndChange").src = imgs[0]; imgs.push(imgs.shift()) } } 发生的事情是它正确地来回前进,但只有一次。它只显示 2 个不同的图像。有什么想法吗?
  • @Owly - 我修改了我的答案,使其真正适用于 img.src 而不是 img.alt。如果你仍然不能让它在你的电脑上工作,你一定是做错了什么,因为 code sn-pjsfiddle 在 Chrome 上运行完美, Firefox 和 IE。
  • 谢谢。它与您的图像完美配合。不知何故,我的它不起作用。图像正在加载。但是javascript不起作用。它仅更改 2 个图像。我真的一定做错了什么。我不明白...:S
  • 您可以发布指向您网站的链接吗?然后我可以看看那里到底发生了什么
  • 该网站尚未上线,但我设法使用 imageshack 使其正常工作。出于某种原因,当我使用来自互联网的图像时,它可以工作。当图像来自我的本地文件夹时,同样的情况不会发生。
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 2015-07-30
  • 1970-01-01
相关资源
最近更新 更多