БлогNot. JQuery: выбираем из текстового файла несколько случайных строк и выводим их в до...

JQuery: выбираем из текстового файла несколько случайных строк и выводим их в документ

Как ответ на вопрос, да и пригодиться может:

а если я хочу выводить два значения со 100% вероятностью? их лучше запихать в один файл и первое брать с 1 по 100 строки, а 2 значение с 100 по 200 строк или распихать на два файла? не страшно, что функция будет срабатывать дважды?

Что изменится по отношению к этой статье, если нам не нужны "вероятности", а нужно просто выбирать и выводить n случайных строк из набора, содержащегося в текстовом файле?

Сначала ответы на вопросы из цитаты.

Всегда лучше одно обращение к файловой системе, чем два или несколько, особенно при удалённом доступе к ней! Поэтому будем "вытаскивать" из прочитанного текстового файла несколько строк за один запрос.

Также напоминаю, что с большими объёмами данных лучше делать подобную задачу выбора нескольких записей через базу данных, как в этой заметке.

Третье замечание - код не рассчитан на "самые новые" версии JQuery, здесь хватит версии 1.2 из архива. :)

Не будем обновлять архив с исходным приложением, лишь перепишем код файлов index.html и random.php из него, учтя, по возможности, исключения.

Предусмотрим в разметке HTML контейнеры с идентификаторами myElement_1, myElement_2 и т.д. для размещаемых случайных строк. В реальности эти контейнеры тоже можно создавать динамически, как, скажем, таблички в этом примере.

Вот как будут выглядеть изменённые файлы (с подробными комментариями).

Файл index.html
<!DOCTYPE html>
<html lang="RU-ru">
 <head>
  <title>Rnd</title>
  <meta charset="UTF-8">
 </head>
 <body>

<script type="text/javascript" src="jquery.js"></script>

<p id="myElement_1"></p>
<p id="myElement_2"></p>

<script>
function loadRandomString (prefix, n) { 
  //Выбрать n случайных строк из файла на сервере и записать в элементы
  //с идентификаторами prefix_1, ..., prefix_n
 $.ajax({
  type: "POST",
  url: "random.php",
  cache: false,
  datatype: "text",
  data: { n : n }, //Сколько строк вернуть
  success: function (result, status) {
   var arr = result.split("\n"), n = arr.length;
    //php-скрипт вернет строку, разделенную переводами строки \n
   for (var i = 0; i < n; i++) {
    var id = '#'+prefix+(i+1); //id элемента, куда писать
    if (!($(id).length)) break; //нет такого элемента - выйти из цикла
    $(id).html(arr[i]); //иначе записать значение
   }
  },
  error: function (jqXHR, exception) {
   var msg = ''; //Сообщение об ошибке
   if (jqXHR.status === 0) msg = 'Not connect.\n Verify Network.';
   else if (jqXHR.status == 404)  msg = 'Requested page not found. [404]';
   else if (jqXHR.status == 500)  msg = 'Internal Server Error [500].';
   else if (exception === 'parsererror') msg = 'Requested JSON parse failed.';
   else if (exception === 'timeout') msg = 'Time out error.';
   else if (exception === 'abort') msg = 'Ajax request aborted.';
   else msg = "Uncaught Error.\n" + jqXHR.responseText;
   $('#'+prefix+1).html (msg); //Об ошибке пишем только в первый элемент
  }
 });
}

window.addEventListener('load', function (e) {
 loadRandomString('myElement_',3); //Выведется 2 строки, т.к. имеем 2 элемента HTML!
}, false); 
</script>
<noscript><p>Включите Javascript для работы приложения!</p></noscript>

 </body>
</html>

Заодно мы здесь детализировали сообщение об ошибке AJAХ в error: function

Файл random.php
<?php
 if (!isset($_POST['n']) or intval($_POST['n']) < 1) { echo 'N value error'; exit; }
 $n = intval($_POST['n']); //Передано допустимое целое $n>0
 $filename = 'text.txt';
 $data = @file ($filename);
 if ($data === FALSE) { echo 'File reading error'; exit; }
 $len = count ($data); //Сколько строк прочитано из файла?
 if ($len < 1) { echo 'Void file!'; exit; }
 $rand_keys = array_rand ($data, min($len,$n)); 
  //Нельзя выбрать случайных значений больше, чем строк в файле
 $result = ''; //Строка-результат с разделителями-переводами строк
 $cnt = count ($rand_keys); //Сколько случайных значений выбрано из файла?
 if ($n == 1) { //При одном выбранном значении $rand_keys не возвращает массива
  echo trim($data[$rand_keys]); exit;  
 }
 for ($i = 0; $i < $n; $i++) { //Всегда вернём $n значений, как просили
  if ($i < $cnt) $result .= trim($data[$rand_keys[$i]]);
   //Если ещё есть выбранные элементы, пишем их
  $result .= ($i < $n-1 ? "\n" : ""); //"Лишние" пополнятся просто пустыми строками
 }
 echo $result;
?>

теги: javascript random php jquery

12.06.2019, 13:24; рейтинг: 73