Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Простой ротатор данных (https://javascript.ru/forum/project/75261-prostojj-rotator-dannykh.html)

dr.zoom 17.09.2018 15:52

Простой ротатор данных
 
Доброго времени суток уважаемые форумчане! Меня мучает угрызение совести, но все же хочу попросить у вас помощи в написании простого кода на javascript. Дело в том, что я очень далек от программирования и сам догонять буду оооочень долго как реализовать.

Нужен скрипт который по очереди выводит в тело страницы сайта определенные html данные (код javascript, ссылку html и любые другие данные) в порядке очередности по приоритету.

1 строка с данными (выводиться при первой загрузки странички)
2 строка с данными (выводиться при повторной (перезагрузке) загрузке странички)
итд. в зависимости от количества строк данных.

помогите пожалуйста.

Nexus 17.09.2018 16:14

На каком языке и где хранятся данные для рендеринга?

dr.zoom 17.09.2018 16:44

да в принципе без разницы, если можно то прямо в коде javascript указать, если так нельзя то через подключаемый файл data.dat (в нем идут строки с данными)

насчет языка, я даже не знаю, что сказать. формат должен быть, чтобы браузер мог считать код и исполнить.

строки с данными могут содержать либо любой html код, либо код на javascript, либо обычный текст

Nexus 17.09.2018 17:05

https://jsfiddle.net/gsnj45Lk/

laimas 17.09.2018 17:21

Зачем JSON.parse(phrases.textContent), если скрипт и в нем данные представлены объектом?

Nexus 17.09.2018 18:57

laimas, а как к ним обратиться то?

laimas 17.09.2018 19:03

Цитата:

Сообщение от Nexus
а как к ним обратиться то?

Ну так изначально у вас же было <script>[....]</script>, бог знает формат data.dat , но уж коли это js, так почему бы не <script>var name = [....]</script>. Это сейчас у вас html.

Nexus 17.09.2018 21:34

laimas, да, изначально в теге script был заключен json.
Присвоить этот json какой-нибудь переменной я как-то не подумал.

Я думал вы поведаете неизвестный мне способ обращения к неименованному объекту)

dr.zoom 18.09.2018 12:17

Nexus - спасибо, но я не совсем понял.

вот этот код

Цитата:

<div id="phrases">
<textarea>First</textarea>
<textarea>Second</textarea>
<textarea><script type="text/javascript">alert('Third');console.clear();</script></textarea>
</div>
<div id="content"></div>
у нас в теле html кода страницы ? или куда это ?

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

я извиняюсь, за тупизну, может чего не понял ((. ааа просто не привык работать через подобные https://jsfiddle.net сервисы ( заметил CSS

#phrases{display:none}

так не пойдет, в наш html код должна выводиться только одна строка из отдельного файлика (уж так лучше).

laimas 18.09.2018 13:07

dr.zoom, дело хозяйское, но вы хотите сделать почти такое - есть десятки изображений весом по N мегабайт, которые вы все грузите клиенту ради того, чтобы показать одно. Понятно, что это бесполезная трата ресурсов клиента.

Хотите чтобы клиент определял контент, ну так пусть определяет, а определение, это не выбор среди множества бесполезно загруженного, а асинхронный запрос указанного с сервера. И можете менять его по любому желаемому интервалу.

dr.zoom 18.09.2018 14:22

Цитата:

Сообщение от laimas (Сообщение 494951)
dr.zoom, дело хозяйское, но вы хотите сделать почти такое - есть десятки изображений весом по N мегабайт, которые вы все грузите клиенту ради того, чтобы показать одно. Понятно, что это бесполезная трата ресурсов клиента.

Хотите чтобы клиент определял контент, ну так пусть определяет, а определение, это не выбор среди множества бесполезно загруженного, а асинхронный запрос указанного с сервера. И можете менять его по любому желаемому интервалу.

дело в том, что мне нужно ротировать рекламный блок при каждом обновлении странички и показывать разные материалы, будь то баннер, или код на javascript.

Как это лучше исполнить, я как раз и хочу тут у вас узнать. Помогите с кодом люди добрые :cray:

laimas 18.09.2018 14:25

Цитата:

Сообщение от dr.zoom
дело в том, что мне нужно ротировать рекламный блок при каждом обновлении странички

Это не означает, что эти блоки нужно все грузить клиенту, они как раз должны находиться на сервере. Причем рекламный блок не просто обновляется, там куча условий - число показов за определенное время, приоритеты, место отображения и т.п. А этим как раз заведует не клиент, а сервер.

dr.zoom 18.09.2018 14:37

Цитата:

Сообщение от laimas (Сообщение 494957)
Это не означает, что эти блоки нужно все грузить клиенту, они как раз должны находиться на сервере. Причем рекламный блок не просто обновляется, там куча условий - число показов за определенное время, приоритеты, место отображения и т.п. А этим как раз заведует не клиент, а сервер.

я с вами не спорю, да пусть так и будет. ну а если скрипт будет тянуть одну строку с кодом из файлика data.dat к примеру.

laimas 18.09.2018 14:45

Скрипт клиентский ни из какого файла ничего тянуть не может. В простейшем случае, клиентских усилий может и не потребоваться, если у клиента включены куки. В этом случае при запросе страницы сервер проверяет установлена ли кука у клиента, если нет, то он выводит первый блок (в файле ли он или это базой определяется, не важно, важно что сервер может получать данные любым способом), и устанавливает куку. Если кука установлена, то ее значение увеличивается, сохраняется в куках и уже это значение определяет какой блок выводить.

Что-то более сложное, это уже потребует клиентского сценария.

dr.zoom 18.09.2018 14:51

я извиняюсь за свои скромные познания, точнее их отсутствие. вот ссылка на скрипт http://phphack.ru/seescript/788/

он меня в принципе устраивает, но я буду выводить через <script src="http://Ваш_адрес/rand_js.php?r=1"></script>

нужно только чтобы по порядку строки при ротации выводились, а не в случайном порядке. может кто то допилит код этого скрипта ?

черт, там кажется все на php (( глянул rand_js.php код (

я извиняюсь за сумбур

laimas 18.09.2018 15:13

Какой язык использует сервер?

Nexus 18.09.2018 19:07

laimas,
Цитата:

Сообщение от laimas
Какой язык использует сервер?

Судя по 15-му комментарию - PHP.

Nexus 18.09.2018 19:09

<?php
//getBanner.php
$visit=isset($_COOKIE['visit'])?(int)$_COOKIE['visit']:0;
$directory=__DIR__.'/banners/';
if(!is_dir($directory))
  throw new \Exсeption("Directory [$directory] not found");

$banners=array_diff(scandir($directory),['.','..']);
$response=$directory.$banners[$visit%count($banners)];
$response=file_get_contents($response);
setcookie('visit',++$visit,time()+365*24*3600,'/');

echo $response;


//banners.js
[].filter.call(document.scripts,function(script){
  return !!script.src && script.src.indexOf('banners.js')>0;
}).forEach(function(script,index){
	if(index)
      return;
  
  var xhr=new XMLHttpRequest();
  xhr.open('GET','/path/to/getBanner.php?'+Math.random(),true);
  xhr.onload=function(){
  	script.insertAdjacentHTML('beforebegin',this.responseText);
  };
  xhr.send();
});


//index.html
<script src="/path/to/banners.js" async></script>


В директории, в которую положите файл "getBanner.php" создайте еще одну директорию с именем "banners", в нее накидайте файлов, контент которых - код вставляемых на страницу баннеров.
1 файл - 1 баннер.
В том месте, где расположите подключение js-скрипта появится код баннера.

PS. Код не тестировал. Вообще.

laimas 18.09.2018 19:38

Цитата:

Сообщение от Nexus
throw new \Exсeption("Directory [$directory] not found");

Для кого? :)

Цитата:

Сообщение от Nexus
$banners=array_diff(scandir($directory),['.','..']);

glob()

А использование кук вообще исключает клиента, сервер сразу может вывести следующий баннер, зачем все эти навороты на JS?

Nexus 18.09.2018 20:04

Цитата:

Сообщение от laimas
Для кого?

Для обработчика ошибок или самого сервера.
Цитата:

Сообщение от laimas
А использование кук вообще исключает клиента, сервер сразу может вывести следующий баннер, зачем все эти навороты на JS?

Так, пожалуй, проще для пользователя, который будет использовать этот код, а мне не придется объяснять, что куки нужно писать до того, как контент будет выведен на страницу.

Вы можете предложить ТС вариант без js.

laimas 18.09.2018 20:36

Цитата:

Сообщение от Nexus
Для обработчика ошибок или самого сервера.

Это не фатальная ошибка, чтобы заморачиваться таким образом. Такие мелочи нужно писать в лог и отдавать страницу без баннера. Да и трудно представить, чтобы директория имела свойство пропадать. )

Цитата:

Сообщение от Nexus
Так, пожалуй, проще для пользователя, который будет использовать этот код

Это не проще, это сложнее там, где совсем не нужно. Зачем клиент, если сервер извлекает номер из куки, а далее достаточно сразу поместить выбранный баннер в вывод в нужное место - include(path).

Зачем усложнять :)

Nexus 18.09.2018 20:52

Цитата:

Сообщение от laimas
Такие мелочи нужно писать в лог и отдавать страницу без баннера

Так информация о не перехваченном исключении будет записана в лог, а клиент получит status code отличный от 200, т.е. не отрисует баннер.
Цитата:

Сообщение от laimas
Да и трудно представить, чтобы директория имела свойство пропадать

Спору нет, однако совсем не трудно представить изначальное отсутствие директории.
Цитата:

Сообщение от laimas
далее достаточно сразу поместить выбранный баннер в вывод в нужное место - include(path)

А перезаписать в куку? Посреди тела страницы её не запишешь.

laimas 18.09.2018 21:10

Цитата:

Сообщение от Nexus
однако совсем не трудно представить изначальное отсутствие директории

И что для этого нужно бросать исключение? Отлаживают скрипты прежде чем помещают на сервер. Это надуманная проблема, а если есть, то однажды заметив решается раз и навсегда.

Цитата:

Сообщение от Nexus
А перезаписать в куку? Посреди тела страницы её не запишешь.

И что этому мешает? Считали, изменили, установили, какие проблемы?

Не нужен тут JS вообще.

Nexus 18.09.2018 21:30

Цитата:

Сообщение от laimas
Отлаживают скрипты прежде чем помещают на сервер.

Это в идеале :) В большинстве случае copy-paste и новый коммент: "Не работает".

Цитата:

Сообщение от laimas
И что этому мешает?

В смысле? Куки передаются в заголовках страницы, не в контенте.

laimas 19.09.2018 05:20

Цитата:

Сообщение от Nexus
Куки передаются в заголовках страницы, не в контенте.

И что? Динамические страницы тем и отличаются от статических, что их содержание во многом определяется запросами клиента. А это означает, что серверный код, это "солянка" в чистом виде - много кода и представления. И если запрос к индексному файлу, то в итоге это это может быть сборкой множества различных файлов. При этом нет никаких проблем стартовать сессию, передать заголовки, включая и куки, как первичный ингредиент солянки, а все остальное потом.

Определили изначально переменную $banner равную null. Определились с куками, получили запрашиваемый баннер, присвоив его переменной $banner. А далее где-то уже в представление вывод ее. Будет null (не удалось получить банннер из-за ошибок, да и бог с ним, это не причина выбрасывать исключения), значит на странице его не будет, иначе нарисуется.

И как бы там не упрощалось у разработчика, стоит один раз увидеть что нет, один раз придется и проверить, и навсегда исправить. Такие ошибки исправляются на раз-два.

Nexus 19.09.2018 07:42

laimas, в этом случае код нужно будет разбить на 2 части и объяснить тс, что обновление кукисов должно происходить до передачи самой страницы.

laimas 19.09.2018 08:27

Цитата:

Сообщение от Nexus
в этом случае код нужно будет разбить на 2 части

Зачем? Вы же не пишите в своем JS, что нужно дождаться загрузки документа, обработав событие onload или же поместить JS после соответствующего html кода. Вы это как само собой подразумеваете и вас это нисколько не удивляется ибо это есть логика. :)

Так что вам мешает писать такую же логику для сервера, там ведь тоже самое только наоборот - все что прежде вывода нужно делать до вывода.

<?php
старт сессии, передача заголовков, работа с куками,
обработка ajax запросов с выходом, обработка перенаправлений на себя, и т.п., и т.д.
?>
<html>
вывод, и не возбраняется выполнять иной код
</htm>

Что тут сложного в понимании? В любом случае даже для средней по условиям отображения страницы не избежать различных подключений и прочего кода, так как можно написать все одной портянкой, но сопровождать такой код очень сложно.

Nexus 19.09.2018 09:05

laimas, ну так у вас все равно будет разбитие на 2 части.
Первая: до вывода контента страницы;
Вторая: в представлении.


<?php

$directory=__DIR__.'/banners/';
$banner='';
if(is_dir($directory)){
    $visit=isset($_COOKIE['visit'])?(int)$_COOKIE['visit']:0;
    $banners=array_diff(scandir($directory),['.','..']);
    $response=$directory.$banners[$visit%count($banners)];
    $banner=file_get_contents($response);
    setcookie('visit',++$visit,time()+365*24*3600,'/');
};

?><html>
<?php echo $banner; ?>
</html>

laimas 19.09.2018 10:21

На какие части? Это все один файл, а каждая его часть, это его логический блок. Вы же раздолбали код действительно на на две части между сервером и клиентом, считая при этом, что это куда понятнее. :)

Да и написано у вас ...

<?
$visit = $_COOKIE['visit'] ?: 0;
$banner = glob($dir)[$visit];
setcookie('visit', ++$visit, не слишком ли до ... ? ), '/');
//и прочий код который обязательно всегда будет
?>
<html>
<head>
<?=$var?> и прочий вывод определенных значений
</head>
<body>
как и в нужном месте где-то
<div class="banner">
<?
if($banner) include '$banner';
?></div>
</html>


Это логика одного файла, а по уму ее разделяют на код и представление (шаблонизаторы).

Nexus 19.09.2018 10:37

Цитата:

Сообщение от laimas
На какие части? Это все один файл

Это печально, если все действительно будет в одном файле )

dr.zoom 19.09.2018 11:18

Nexus и laimas - ребята, спасибо большое за то что откликнулись на мою просьбу о помощи! Nexus-у отдельная благодарность на написание скрипта!

сегодня вечером буду его тестить, по результатам обязательно тут сообщу!

готов отблагодарить материально, на ваш wmr или Яденьги.

вопрос:

Цитата:

В директории, в которую положите файл "getBanner.php" создайте еще одну директорию с именем "banners", в нее накидайте файлов, контент которых - код вставляемых на страницу баннеров.
1 файл - 1 баннер.

нее накидайте файлов - файлы с каким расширением (формата) должны быть? .html .txt .php или .. ??

Nexus 19.09.2018 11:26

dr.zoom,
Цитата:

Сообщение от dr.zoom
файлы с каким расширением (формата) должны быть?

Без разницы, однако исполняемые файлы заливать смысла нет, т.к. исполнены они не будут.

dr.zoom 19.09.2018 11:39

Цитата:

Сообщение от Nexus (Сообщение 495091)
dr.zoom,
Без разницы, однако исполняемые файлы заливать смысла нет, т.к. исполнены они не будут.


не удержался затестил сейчас прямо на работе.

файлы в каталоге banners создал 1.txt и 2.txt

прописал все пути, вроде даже правильно (скрипты правильно по урл открываются), но ничего не выводиться на index.html

dr.zoom 19.09.2018 11:56

еще вопрос, точнее хотелка, если позволите.

страницы сайта сами по себе динамические - php (wordpress). буду использовать плагин кеширования, странички будут статичными.

вопрос - можно ли сделать ротацию баннеров, чтобы не кешировалось ?

Nexus 19.09.2018 12:03

dr.zoom, если использовать первый вариант (где 1 файл php и 1 файл js), то кешироваться не будет.
Во втором варианте (где баннер рисуется сервером) кешироваться, скорее всего, будет.
Я не работаю с WP.

dr.zoom 20.09.2018 12:16

Цитата:

Во втором варианте (где баннер рисуется сервером)
я не совсем догнал, где второй вариант (

а насчет работоспособности, что скажите? работает у вас код ?

<?php
//getBanner.php
$visit=isset($_COOKIE['visit'])?(int)$_COOKIE['visit']:0;
$directory=__DIR__.'/banners/';
if(!is_dir($directory))
throw new \Exсeption("Directory [$directory] not found");

$banners=array_diff(scandir($directory),['.','..']);
$response=$directory.$banners[$visit%count($banners)];
$response=file_get_contents($response);
setcookie('visit',++$visit,time()+365*24*3600,'/');

echo $response;


//banners.js
[].filter.call(document.scripts,function(script){
return !!script.src && script.src.indexOf('banners.js')>0;
}).forEach(function(script,index){
if(index)
return;

var xhr=new XMLHttpRequest();
xhr.open('GET','/path/to/getBanner.php?'+Math.random(),true);
xhr.onload=function(){
script.insertAdjacentHTML('beforebegin',this.respo nseText);
};
xhr.send();
});


у мня вот не работает (

Nexus 24.09.2018 14:32

Цитата:

Сообщение от dr.zoom
у мня вот не работает

Я не тестировал.
Открыв в браузере консоль можно, что возвращает сервер и не падает ли где на пол пути скрипт, который вставляет на страницу баннер.
Если сервер возвращает 500 http code, то смотрите error log.


Часовой пояс GMT +3, время: 12:49.