按钮未正确更新输出

时间:2016-08-06 07:37:19

标签: javascript jquery html css twitter-bootstrap-3

我正在编写一个randon报价机器,当点击“新报价”按钮时我遇到了问题。为简洁起见,quotescolorsanimations变量的数据已经过简化和缩小。所以问题是这个。当我一直点击按钮并使用较小的数据集时,我注意到响应时间变长,颜色,引号和/或动画都不会改变。这很明显,动画并不总是运行。使用这个较小的数据集,我理解新输出可能与前一个输出完全相同,但动画应该仍然运行,有时则不然。如果没有loadQuotes()函数且没有window.onload = loadQuotes();,则此代码可以正常运行,我可以按键盘上的F5重新加载页面。当我将代码放在loadQuotes()函数中并使用页面底部的window.onload = loadQuotes();来获取初始输出时,问题就出现了。我尝试将所有变量和randomNum()函数移到loadQuotes()函数之外(因为我假设它们是全局的),当我这样做时,然后在初始页面加载后,单击按钮不什么都不做。所以我关心的是如何通过按F5但单击按钮来如上所述加载页面。

function loadQuotes() {
  function randomNum(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }

  var quotes = [
    ["This is quote number one.", "Person 1"],
    ["This is quote number two.", "Person 2"],
    ["This is quote number three.", "Person 3"],
    ["This is quote number four.", "Person 4"],
    ["This is quote number five.", "Person 5"]
  ]

  var colors = [
    ["#096986", "#F69679"],
    ["#000866", "#FFF799"],
    ["#7D3563", "#82CA9C"]
  ]

  var animations = ["animated bounce", "animated flash", "animated pulse"]

  var getQuotes = randomNum(0, quotes.length - 1);
  var getColors = randomNum(0, colors.length - 1);

  var newColor0 = colors[getColors][0];
  var newColor1 = colors[getColors][1];
  var newAnimation1 = animations[randomNum(0, animations.length - 1)]
  var newAnimation2 = animations[randomNum(0, animations.length - 1)]

  document.getElementById("quote").innerHTML = "<h1>" + quotes[getQuotes][0] + "</h1>";
  document.getElementById("author").innerHTML = "<h3>" + "--- " + quotes[getQuotes][1] + "</h3>";

  $(document).ready(function() {
    $(".side-panel").css("background-color", newColor0);
    $(".middle").css("background-color", newColor1);
    $("#quote").addClass(newAnimation1);
    $("#author").addClass(newAnimation2);
    $(".btn").on("click", function() {
      loadQuotes();
    });
  });
}

window.onload = loadQuotes();
h1 {
  text-align: center;
  font-size: 3.5em;
}
h3 {
  font-size: 1.5em;
}
/* div { border: 1px solid black; } */

.full-height {
  height: 100vh;
}
.side-panel {
  background-color: newColor0;
}
.middle {
  background-color: newColor1;
}
.quote-box {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 80%;
  height: 65%;
  border-radius: 7.5%;
  background-color: #FFFFFF;
}
.quote-text {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 90%;
  height: 50%;
}
<!DOCTYPE html>

<html lang="en-us">

<head>
  <title>Random Quote Machine</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css" />
  <link rel="stylesheet" href="style.css" />

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
</head>

<body>
  <div class="container-fluid">
    <div class="row">
      <div class="col-xs-1 side-panel full-height"></div>
      <div class="col-xs-10 middle full-height">
        <div class="quote-box">
          <div class="quote-text">
            <p id="quote"></p>
            <p id="author"></p>
            <button type="button" class="btn btn-lg pull-right">New Quote</button>
          </div>
        </div>
      </div>
      <div class="col-xs-1 side-panel full-height"></div>
    </div>
  </div>
</body>

</html>

2 个答案:

答案 0 :(得分:2)

您的问题是您嵌套功能的方式。

我已经改变了你的逻辑并整理了一切。

这是您的代码放在正确的位置。

https://jsfiddle.net/hj5w5rdq/

var quotes =[
  ["This is quote number one.", "Person 1"], 
  ["This is quote number two.", "Person 2"], 
  ["This is quote number three.", "Person 3"], 
  ["This is quote number four.", "Person 4"], 
  ["This is quote number five.", "Person 5"]
];

var colors = [
["#096986", "#F69679"], 
["#000866", "#FFF799"], 
["#7D3563", "#82CA9C"]
];

var animations = [
  "animated bounce", 
  "animated flash", 
  "animated pulse"
];

var getQuotes,
        getColors,
    newColor0,
    newColor1,
    newAnimation1,
    newAnimation2;

function loadQuotes(){

  getQuotes = randomNum(0, quotes.length - 1);
  getColors = randomNum(0, colors.length - 1);
  newColor0 = colors[getColors][0] ;
  newColor1 = colors[getColors][1];
  newAnimation1 = animations[randomNum(0, animations.length - 1)]
  newAnimation2 = animations[randomNum(0, animations.length - 1)]

  document.getElementById("quote").innerHTML = "<h1>" + quotes[getQuotes][0] + "</h1>";
  document.getElementById("author").innerHTML = "<h3>" + "--- " + quotes[getQuotes][1] + "</h3>";

  $(".side-panel").css("background-color", newColor0);
  $(".middle").css("background-color", newColor1);
  $("#quote").addClass(newAnimation1);
  $("#author").addClass(newAnimation2);
}

function randomNum(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

$(document).ready(function() {
  $(".btn").on("click", function() {
    loadQuotes();
  });

  loadQuotes();
});

答案 1 :(得分:1)

您遇到的问题是因为您在其自身内部调用了loadQuotes函数,这会在点击时产生一个点击循环。点击几下,我的浏览器增加了3GB内存,所以你需要把它拿出来

我在这里做了一些更改,这将有助于您: https://jsfiddle.net/qv5he9z0/6/

首先,我将javascript从html移动到了javascript面板。

现在所有代码都包含在内:

$(document).ready(function () { });

所有变量都在此顶部定义,因此您可以在需要的地方更新它们,并在不同的功能中更改它们的值。现在他们是全球性的。

我也替换了(因为我们有jQuery):

document.getElementById("quote").innerHTML = "<h1>" + quotes[getQuotes][0] + "</h1>";

$("#quote").html("<h1>" + quotes[getQuotes][0] + "</h1>");

document.getElementById("author").innerHTML = "<h3>" + "--- " + quotes[getQuotes][1] + "</h3>";

$("#author").html("<h3>" + "--- " + quotes[getQuotes][1] + "</h3>");

我还在loadQuotes函数之外移动了以下代码(因此我们没有点击循环的点击):

$(".btn").on("click", function() {
    loadQuotes();
});