【问题标题】:Else statement is running twice jQueryElse 语句运行两次 jQuery
【发布时间】:2016-04-25 02:23:20
【问题描述】:

https://jsfiddle.net/mpcbLgtt/2/

我在做什么:一个函数,当一个类 card 的 div 被点击时,它应该将它的名字添加到一个名为 deck 的数组中,并将它的 id 添加到一个名为 cardIds 的数组中。

这是卡片:

<div class='card' id='1' name='dinosaur'>Dinosaur</div>
<div class='card' id='2' name='crab'>Crab</div>

如果阵列中已经有 2 张这张卡,那么它应该什么都不做。

如果没有卡片,那么它会将一个deckItem div 附加到decklist div 上。

<div class="decklist"></div>

这就是问题所在。如果数组中已经有 1 张卡片,我不想将卡片附加到 'decklist' div,而是删除前一张卡片并添加一张上面有“x2”的新卡片。

此时的代码可以删除之前的卡。但是,当它附加以下代码时,它会执行两次。例如。我单击一张名为“Dinosaur”的卡片,它会将其附加到数组中。然后,如果我再次单击卡片“恐龙”,它将输出“恐龙 x2”“恐龙 x2”,而不仅仅是“恐龙 x2”

$(".decklist").append($replacement);

完整的代码如下。

var deck = [];
var cardIds = [];
$(".card").click(function(){
    $cardName = $(this).attr("name");
        $cardId = $(this).attr("id");
        $occurances = 0;
        for (var i = 0; i<deck.length; i++) {
            if (deck[i]==$cardName) {
                $occurances++;
            }
        }

        //if there are less than 2 of this card in deck array
        if ($occurances<2) {
            //add the card to array
            deck.push($cardName);
            cardIds.push($cardId);
            deck.sort();
            //empty the decklist div
            $(".decklist").empty(); 
            //go through all the cards in the deck array.
            //if that card appears once append it else replace it
            for (var i = 0; i < deck.length; i++) {
                //count the number of times this card is in the deck array
                $count = 0;
                for (var k = 0; k < deck.length; k++) {
                    if (deck[k] == deck[i]) {
                        $count++;
                    }
                }
                if ($count == 1) {
                    //this runs once
                    var $toBeAppended = $("<div class='deckItem' id='"+cardIds[i]+"'>"+deck[i]+"</div>");
                    $(".decklist").append($toBeAppended);
                } else {
                    //this runs twice
                    var $replacement = $("<div class='deckItem' id='"+cardIds[i]+"'>"+deck[i]+" x2</div>");
                    $(".decklist").remove(".deckItem#"+cardIds[i]);
                    $(".decklist").append($replacement);
                }
            }
        }

【问题讨论】:

  • 你是否绑定了多次点击?
  • 它在一个循环中,所以每次迭代都会评估if。创建复制问题的基本演示。我们很难在各种场景下对您的应用进行心理评估

标签: javascript jquery arrays append


【解决方案1】:

我认为问题在于计数。 如果deck=[Max, Dinosaur, Dinosaur] 你算1 Max,然后对于每个 Dinosaur 你算2 Dinosaurs。

编辑,这是错误的:您的计数应该从 k=i+1 开始,而不是从 0 开始 - 这样您就不会计算过去的次数。

您的计数应该简化过去的出现次数,您可以创建一个数组,并在第一次出现后将卡片放在那里,并在计数之前检查卡片是否已添加到数组中。

【讨论】:

  • 抱歉,max 打错了 - 也应该说恐龙
  • 好吧,即使使用deck=[Dinosaur, Dinosaur] 我的答案保持不变——你将为每个恐龙计算2个恐龙(对于i=0计数将是2,对于i=1计数也是将是 2)。
  • 提早取件不错,但这只是这里的问题之一。
【解决方案2】:

你实际上有多个问题。

  • 您对每张卡的计数不排除已匹配的重复项
  • 您的页面中有重复的 ID 值,这是无效的 HTML,浏览器只会找到第一个匹配项。我在较低的卡片 ID 中添加了 card 前缀,并为上面的卡片添加了唯一编号 1-3

代码:

$(document).ready(function() {
  var deck = [];
  var cardIds = [];
  $(".card").click(function() {
    $cardName = $(this).attr("name");
    $cardId = $(this).attr("id");
    $occurances = 0;
    for (var i = 0; i < deck.length; i++) {
      if (deck[i] == $cardName) {
        $occurances++;
      }
    }
      //if there are less than 2 of this card in deck array
    if ($occurances < 2) {
      //add the card to array
      deck.push($cardName);
      cardIds.push($cardId);
      deck.sort();
      console.log(deck);
      //empty the decklist div
      $(".decklist").empty();
      //go through all the cards in the deck array.
      //if that card appears once append it else replace it
      alert(deck.length);
      for (var i = 0; i < deck.length; i++) {
        //count the number of times this card is in the deck array
        $count = 1;
        for (var k = i + 1; k < deck.length; k++) {
          if (deck[k] == deck[i]) {
            $count++;
            i++; // Skip the item just matched as well
          }
        }
        alert($count);
        if ($count == 1) {
          //this runs once
          var $toBeAppended = $("<div class='deckItem' id='card" + cardIds[i] + "'>" + deck[i] + "</div>");
          $(".decklist").append($toBeAppended);
        } else if ($count == 2) {
          //this runs twice
          var $replacement = $("<div class='deckItem' id='" + cardIds[i] + "'>" + deck[i] + " x2</div>");
          $(".decklist").remove(".deckItem#" + cardIds[i]);
          $(".decklist").append($replacement);
        }
      }
    }
  });
});

JSFiddle: https://jsfiddle.net/TrueBlueAussie/mpcbLgtt/3/

【讨论】:

  • 我认为这是正确的。但是,不是在单击一次后添加卡片并在第二次后添加卡片 x2,而是在第一次单击后不添加任何内容并在第二次单击后添加卡片
  • @TomOborne:您有没有机会将您的问题放入 JSFiddle 等?我现在没有空闲时间来设置演示和调试:)
  • 好主意,我会做一个 Jfiddle 并尽快回复
  • @TomOborne:没问题。如果可以的话,请接受作为答案:)
猜你喜欢
  • 1970-01-01
  • 2015-05-20
  • 2019-05-09
  • 2016-11-06
  • 2017-09-11
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多