【问题标题】:Can anyone tell me what's wrong with this switch statement (javascript)?谁能告诉我这个 switch 语句(javascript)有什么问题?
【发布时间】:2011-04-08 19:24:29
【问题描述】:

大家好,它是典型的滑块 - 由用户点击自动控制和控制。问题是当你点击时,如果你在最后一张幻灯片上,它不应该显示右箭头,如果你在第一张幻灯片上,它不应该显示左箭头。如果您在其他任何地方,它应该显示两个箭头。但是,当在最后一张幻灯片上时,它仍然显示向右箭头。但是,在第一张幻灯片上,它正确地不显示左箭头。但是当你进入中间幻灯片时,它不会带回右箭头:

    $(".paging").show();
$(".image_reel img:first").addClass("active");
$active = $(".image_reel img:first"); 

var imageWidth = $(".window").width();  
var imageSum = $(".image_reel img").size();  
var imageReelWidth = imageWidth * imageSum;

$(".image_reel").css({'width' : imageReelWidth});

rotate = function(){

    var triggerId = $active.attr('src').substring(7,8);
    var image_reelPosition = (triggerId - 1) * imageWidth;



    $(".image_reel img").removeClass("active");
    $active.addClass("active");

    switch ($active.attr('src')) {
        case "images/4.png":
            var $lastPic = $active.attr("src");
            manageControls($lastPic);
            break;
        case "images/1.png":
            var $firstPic = $active.attr('src');
            manageControls($firstPic);
            break;
        case "image/2.png":
            var $standardPic = $active.attr('src');
            manageControls($standardPic);
            break;
        case "image/3.png":
            var $standardPic = $actice.attr('src');
            manageControls($standardPic);
            break;
    } 




    $(".image_reel").animate({
        left: -image_reelPosition
    }, 500);
};

rotateSwitch = function(){
    play = setInterval(function(){
    if(!$(".paging a").show()) $(".paging a").show(); //This is CRITICAL - this makes sure the arrows reappear after they have been removed
        $active = $(".image_reel img.active").parent().next().find("img");
        if ($active.length === 0){
            $active = $('.image_reel img:first');
            var $firstPic = $active.attr("src");
            manageControls($firstPic); 
        }
        rotate();
    }, 5000);
};

rotateSwitch();

$(".paging a").click(function(){
    $active = ($(this).attr('id')=='rightCtr') ? $(".image_reel img.active").parent().next().find('img') : $(".image_reel img.active").parent().prev().find('img');


    if ($active.length === 0){
        $active = $('.image_reel img:first');
    }


    clearInterval(play);  
    rotate();
    rotateSwitch();  


    return false; 
});


manageControls = function(whichImg){
    (whichImg == "images/4.png") ? $(".paging a#rightCtr").hide() : $(".paging a#rightCtr").show();
    (whichImg == "images/1.png") ? $(".paging a#leftCtr").hide() : $(".paging a#rightCtr").show();

    if(whichImg != "images/1.png" || whichImg != "images/4.png"){
        $(".paging a#rightCtr").show();
        $(".paging a#rightCtr").show();
    }

};

html:

<div class="window">
            <div class="image_reel">
                <a href="#"><img src="images/1.png" alt="" /></a>
                <a href="#"><img src="images/2.png" alt="" /></a>
                <a href="#"><img src="images/3.png" alt="" /></a>
                <a href="#"><img src="images/4.png" alt="" /></a>
            </div>
        </div>
        <div class="paging">
            <a href="#" id="leftCtr">Left</a>
            <a href="#" id="rightCtr">Right</a>
        </div>
 </div>

感谢您的任何回复。

【问题讨论】:

  • 你从错误控制台得到什么输出?另外,javascript switch 语句中的“默认”是强制性的吗?
  • 我没有收到任何错误。我所知道的是,当我在最后一张幻灯片上时,左箭头不会消失,它应该基于 switch 语句。在第一张幻灯片上,左箭头会消失,但在第二张幻灯片上,左箭头不会回来。
  • @Stephen 不,default 大小写不是强制性的。

标签: javascript jquery slider hide show


【解决方案1】:

它正在工作,你只是有一个错字:

        var $standardPic = $actice.attr('src');
                                ^

应该是

        var $standardPic = $active.attr('src');

注意事项:

  • 您的代码可以用更优雅的方式重写,您可以使用其他逻辑代替switch 语句,尤其是在jquery 选择器的帮助下。
  • 使用firebug,它有助于一般的 javascript 调试和 Web 开发,并且它有一个显示错误的控制台。

【讨论】:

    【解决方案2】:

    switch 声明很奇怪,但我认为没关系。我相信问题出在“manageControls”功能上。在最后一个 if 语句中,你做了两次同样的事情。 if 中的表达式也将始终为真。

    我说switch 很“奇怪”,因为它是:

        switch ($active.attr('src')) {
        case "images/4.png":
            var $lastPic = $active.attr("src");
            manageControls($lastPic);
            break;
    

    好的。所以对于第一个case,您现在知道活动元素的“src”属性是“images/4.png”。所以,如果你知道这一点,为什么需要再次获取它来设置“$lastPic”变量?为什么你需要这些变量?为什么不直接将整个 switch 折叠到

     manageControls($active.attr('src'));
    

    【讨论】:

    • 一个问题出在manageControls中,在第二个三元组中应该是leftctr而不是rightctr。但你的建议实际上也使它起作用。例如,使用 switch 语句,当不在第一张和最后一张幻灯片上时,它不会返回两个按钮,但我们的解决方案可以。你知道为什么你的开关没有吗?奇怪,因为他们似乎在做同样的事情。
    • 这可能是@aularon 发现的问题。
    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2017-12-11
    • 2011-01-07
    • 2018-05-15
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多