需要jQuery代码重构帮助

时间:2010-12-03 01:08:34

标签: javascript jquery refactoring

之前的更新,这是我正在处理的内容:

<body>
<div class="header"> <img class="imgLogo" src="img/vegtablelogo.jpg"> </div>
<div id="thumbsContainer">
  <div class="thumb" id="carrotThumb"> <img id="showCarrot" class="imgThumb" src="img/carot.jpg" onClick=setupVeg("showCarrot", "carrotBig") /> </div>
  <div class="hidden" id="carrotBig"> <img class="imgBig" src="img/carot.jpg" /> </div>
  <div class="thumb" id="brocThumb"> <img id="showBroc" class="imgThumb" src="img/brocoli.jpg" onClick=setupVeg("showBroc", "brocBig") /> </div>
  <div class="hidden" id="brocBig"> <img class="imgBig" src="img/brocoli.jpg" /> </div>
</div>
<!-- end thumbs container --> 

<script>
var active = "";

function setupVeg(thumbVeg, hiddenVeg) {
    $("#" + thumbVeg).click(function() {
        if (active != hiddenVeg) {
            $("div.hidden").hide("fast");
            $("#" + hiddenVeg).show("fast", function() {});
            active = hiddenVeg;
        }
        else {
            $("div.hidden").hide("fast");
            active="";
        }
    });
}

$("div.hidden").click(function () {
    $("div.hidden").hide("fast");
    isAnyBig=false;
});

</script>
</body>

不幸的是,此代码无效。我借鉴了以下建议的解决方案。

如果确实有效会很好! 任何建议,非常欢迎。

5 个答案:

答案 0 :(得分:3)

我认为你不需要任何标志或if条件。我认为你的逻辑是:

    每当showCarrot时,
  • 切换carrotBig 点击。
  • 只要点击showCarrot,
  • 隐藏div.hidden。

所以你需要的只是:

$("#showCarrot").click(function () {
   $("#carrotBig").toggle("fast");
   $("#div.hidden").hide();
});

.toggle将处理你的一个标志(isCarrotBig),如果div.hidden已被隐藏,.hide()将不会做任何事情,因此它会处理你的isAnyBig标志。

现在..让我们同样使用broc工作......

function setupVegetable(showId, toggleId) {
   $("#" + showId).click(function () {
      $("#" + toggleId).toggle("fast");
      $("#div.hidden").hide();
   });
}

setupVegetable("showCarrot", "carrotBig");
setupVegetable("showBroc", "brocBig");

如果您有兴趣,可以进一步重构,这样您就不需要为每种蔬菜提供ID。我需要看看你的HTML标记。

答案 1 :(得分:1)

好的,我会发布一个新答案以回应编辑。

值得注意的一点:

  • 删除了imgs周围的div - 它们是不必要的,并且使thumnnails和大图像之间的关系变得复杂。
  • 从HTML中删除了onclick属性 - 您将在JS中附加事件处理程序,因此不需要这样做。
  • 由于缩略图和大图像之间的关系非常明显(大图像只是下一个元素),因此您不需要ID来识别它们中的任何一个。您只需要缩略图上的课程。
  • 由于我们不使用ID,只使用类,您可以根据需要添加任意数量的蔬菜,而无需触及JS

您的代码已修改:

<body>
<div class="header"> <img class="imgLogo" src="img/vegtablelogo.jpg"> </div>
<div id="thumbsContainer">
  <img class="imgThumb" src="img/carot.jpg" /> 
  <img class="imgBig hidden" src="img/carot.jpg" />
  <img class="imgThumb" src="img/brocoli.jpg" />
  <img class="imgBig hidden" src="img/brocoli.jpg" />
</div>
<!-- end thumbs container --> 

<script>

$("#thumbsContainer .imgThumb").click(function () {
   var thisImgBig = $(this).next();

   // Hide all imgBigs, except for this one
   $("#thumbsContainer .imgBig").not(thisImgBig[0]).hide();
   // Toggle this imgBig
   thisImgBig.toggle();
});

$("#thumbsContainer .imgBig").click(function () {
   // Hide this imgBig
   $(this).hide();
});

</script>
</body>

答案 2 :(得分:0)

创建一个函数并重用它....类似于:

/**
 * document here....
 */
var toggleElements = function() {
// your code here
}

然后

$("#whatever").click(toggleElements);

答案 3 :(得分:0)

我个人建议创建一个简单的jQuery插件。像这样:

(function($){
 $.fn.big = function(options) {

  var defaults = {
   target: '#carrotBig',
  };
  var options = $.extend(defaults, options);

  return this.each(function() {
$(this).click(function () {
    isBrocBig=false;
  if (isCarrotBig == false && isAnyBig == false) {
    $(options.target).show("fast", function() {});
    isCarrotBig=true;
    isAnyBig=true;
    }
  else if (isCarrotBig == true) {
    $(options.target).hide("fast");
    isCarrotBig=false;
    isAnyBig=false;
  }
  else if (isCarrotBig == false && isAnyBig == true) {
    $("div.hidden").hide("fast");
    $(options.target).show("fast", function() {});
    isCarrotBig=true;
  }
  else {
      $("div.hidden").hide("fast");
      isCarrotBig=false;
      isAnyBig=false;
  }
});
  });
 };
})(jQuery);

然后你只需要这样说:

 $("#showCarrot").big({target: '#carrotBig'})

您的下一步应该是调查是否可以摆脱全局变量。

答案 4 :(得分:0)

好的,我发现了一个纯净的(ish)溶质,取决于每个隐藏的DIV是.next()。如果它不是它将无法工作,但一般应该是好的。黑客攻击!

<div class="header"> <img class="imgLogo" src="img/vegtablelogo.jpg"> </div>
<div id="thumbsContainer">
  <div class="thumb" id="carrotThumb"> <img id="showCarrot" class="imgThumb" src="img/carot.jpg" /> </div>
  <div class="hidden" id="carrotBig"> <img class="imgBig" src="img/carot.jpg" /> </div>
  <div class="thumb" id="brocThumb"> <img id="showBroc" class="imgThumb" src="img/brocoli.jpg" /> </div>
  <div class="hidden" id="brocBig"> <img class="imgBig" src="img/brocoli.jpg" /> </div>
</div>
<!-- end thumbs container --> 

<script>
var active = "";

$("div.thumb").click(function() {
    var thumbVeg = $(this).attr("id");
    var hiddenVeg = $(this).next().attr("id");
    setupVeg(thumbVeg, hiddenVeg);
});



function setupVeg(thumbVeg, hiddenVeg) {
    if (active != hiddenVeg) {
        $("div.hidden").hide("fast");
        $("#" + hiddenVeg).show("fast", function() {});
        active = hiddenVeg;
    }
    else {
        $("div.hidden").hide("fast");
        active="";
    }
}

$("div.hidden").click(function () {
    $("div.hidden").hide("fast");
});

</script>