#javascript #jquery #random
#javascript #jquery #Случайный
Вопрос:
Эта функция выбирает случайную цитату из текстового файла quotes.txt (каждая кавычка разделяется символом @) и отображает ее в разделе кавычек, например, <div class="quotes">quote shown here</div>
при каждой загрузке страницы.
Но почему иногда оно пропускает цитату и ничего не показывает в <div>
?
$.get('quotes.txt', function(data) {
var quotes = data.split("@");
var idx = Math.floor(quotes.length * Math.random());
$('.quotes').html(quotes[idx]);
});
Это проблема с генератором случайных чисел (который, судя по моему чтению, не очень случайный)? Есть ли способ сделать его только случайным выбором из заданного количества кавычек, т.е. 50? Есть ли лучший способ — возможно, php — генерировать случайное число от 1 до 50?
quotes.txt выглядит так:
Lorem ipsum dolor sit amet, consectetur adipiscing elit@
Fusce tincidunt, ante ut scelerisque@
Mauris lacinia, magna sed auctor pellentesque, diam nisl rutrum ligula@
Etiam tempor elementum augue, vitae cursus eros laoreet@
Donec imperdiet ullamcorper pharetra@
Редактировать 27.04.11 В итоге я использовал другую функцию, у которой нет проблем с отображением пустых строк. кавычки.html структурирован таким образом:
<div class="quote">Lorem ipsum dolor sit amet, consectetur adipiscing elit</div>
<div class="quote">Lorem ipsum dolor sit amet, consectetur.</div>
Функция:
$('div#quotescontainer').load('quotes.html',function(){
var $quotes = $(this).find('div.quote');
var n = $quotes.length;
var random = Math.floor( Math.random()*n );
$quotes.hide().eq(random).fadeIn();
});
Комментарии:
1. Проверьте содержимое
quotes
массива в отладчике.
Ответ №1:
После разделения файла на @
последний элемент в quotes
, вероятно, будет пустой строкой, так как перед новой строкой в конце файла у вас есть @
.
Что касается воспринимаемой «случайности» генератора случайных чисел, здесь, вероятно, нет проблем. Люди, как известно, плохо определяют, является ли последовательность случайной или нет.
Комментарии:
1. Да. Вероятно, это все! Хороший выбор
2. Ну, я всего лишь человек 🙂 Я удалил пробелы в конце — моя ошибка — и последнее @, но безуспешно. Я снова получил пустые строки после 17, 6 и 24 загрузок страницы. Как можно исправить разделитель, чтобы я не получал пустых строк?
3. Ну, вы могли бы использовать
n
(перевод строки) в качестве разделителя, поскольку ваш текстовый файл уже разбит на одну кавычку в строке. Однако текстовые файлы обычно заканчиваются символом finaln
, и.split()
метод предоставит вам одну дополнительную пустую запись в конце. Что вы могли бы сделать, так это отфильтровать результат.split()
, чтобы удалить все пустые записи, прежде чем выбирать одну для отображения.4. Спасибо, но я нашел другую функцию, которая не страдает от пустых строк. Отредактировано выше.
Ответ №2:
Я думаю, вам следует убрать знак at (@) в конце вашего quotes.txt , потому что это создаст пустую строку в переменной массива, заключенной в кавычки.
Ответ №3:
В итоге я использовал другую функцию, у которой нет проблем с отображением пустых строк. кавычки.html структурирован таким образом:
<div class="quote">Lorem ipsum dolor sit amet, consectetur adipiscing elit</div>
<div class="quote">Lorem ipsum dolor sit amet, consectetur.</div>
Функция:
$('div#quotescontainer').load('quotes.html',function(){
var $quotes = $(this).find('div.quote');
var n = $quotes.length;
var random = Math.floor( Math.random()*n );
$quotes.hide().eq(random).fadeIn();
});
Ответ №4:
Это не функция jQuery, а скорее общая функция JavaScript. По крайней мере, код для создания случайного числа. Вы правы, хотя это не очень случайно. Я столкнулся с этой проблемой и нашел справку в этом сообщении в блоге, которая помогла мне.
Ответ №5:
Я думаю, причина, по которой вы можете получать пробелы, заключается в том, что ваш массив имеет завершающий пробел. Если файл заканчивается на @, а вы разделяете на @, последним элементом будет пустая строка.
Ответ №6:
Вы могли бы удалить пустые элементы из массива
var quotes = data.split("@").filter(function(itm){return !!itm});