Я создаю небольшой проект: генератор случайных цитат.Почему моя кнопка не работает каждый раз и почему она не печатает первые 6 FIRST?
У меня есть 6 цитат, хранящихся как объекты в файле, quotes.js
. Каждый объект кавычек имеет quote
и source
. Некоторые из них также имеют citation
и year
.
У меня есть html-страница (плюс CSS), которая отображает цитату на экране. Существует также кнопка для клика: click to get a new quote
.
Мой код в основном работает, когда я нажимаю кнопку на своей странице, она загружает новую цитату в случайном порядке. В большинстве случаев ...
Однако я также намерен НЕ отображать случайную цитату более одного раза, пока сначала не будут отображаться ВСЕ цитаты из массива.
Этого еще не происходит.
Моя кнопка, в случайном порядке, не работает. Я могу получить 5 успешных щелчков кнопки, промах, а затем еще один случайный случай. Я не уверен, почему это происходит вообще.
Не могли бы вы предложить, что здесь делать? В консоли нет ошибок.
В самом деле, я полагаю, что кнопка работает каждый раз, это просто загрузка одной и той же цитаты.
Вот мой основной код:
// event listener to respond to "Show another quote" button clicks
// when user clicks anywhere on the button, the "printQuote" function is called
document.getElementById('loadQuote').addEventListener("click", printQuote, false);
// prints quote
function printQuote(){
var finalQuote = buildQuote();
document.getElementById('quote-box').innerHTML = finalQuote;
}
// builds message for html, adding on citation and/or year if necessary
function buildQuote(){
var quote2Print = getQuote();
var message;
message = "<p class='quote'>" + quote2Print.quote + "</p><p class='source'>" + quote2Print.source;
if(quote2Print.hasOwnProperty('citation') === true){
citation = quote2Print.citation;
message += "<span class='citation'>" + quote2Print.citation + "</span>";
if(quote2Print.hasOwnProperty('year') === true){
year = quote2Print.year;
message += "<span class='year'>" + quote2Print.year + "</span></p>";
return message;
} else {
return message += "</p>";
}
}else {
return message;
}
}
// makes sure that if all 6 quotes haven't been printed, getRandomQuote is called again until a new one is found
function getQuote(){
var countArray = [];
var quote;
if(countArray.length < 6){
quote = getRandomQuote();
while(countArray.indexOf(quote) === -1)
{
if(countArray.indexOf(quote) === -1) {
countArray.push(quote);
return quote;
} else{
quote = getRandomQuote();
}
}
} else {
quote = getRandomQuote();
return quote;
}
}
// With random number, goes through array of quotes and chooses one. random number = index position
function getRandomQuote(){
var randomQuoteNum = randomQuoteNo();
var quote = quotes[randomQuoteNum];
return quote;
}
// Gets a random number
function randomQuoteNo() {
var randomNumber = Math.floor(Math.random() * 6);
return randomNumber;
}
Это не очень хороший способ сделать это. Лучше всего случайным образом перетасовать массив (lookup fisher yates shuffle), а затем просто взять элементы из массива последовательно. –
Логику вашей функции 'getQuote' трудно выполнить. Например 'if (countArray.length <6)' всегда будет 'true' и' while (countArray.indexOf (quote) === -1) 'будет всегда запускаться только один раз, потому что вы возвращаетесь из функции, когда это условие правда. – Titus