Простой ротатор данных
Доброго времени суток уважаемые форумчане! Меня мучает угрызение совести, но все же хочу попросить у вас помощи в написании простого кода на javascript. Дело в том, что я очень далек от программирования и сам догонять буду оооочень долго как реализовать.
Нужен скрипт который по очереди выводит в тело страницы сайта определенные html данные (код javascript, ссылку html и любые другие данные) в порядке очередности по приоритету. 1 строка с данными (выводиться при первой загрузки странички) 2 строка с данными (выводиться при повторной (перезагрузке) загрузке странички) итд. в зависимости от количества строк данных. помогите пожалуйста. |
На каком языке и где хранятся данные для рендеринга?
|
да в принципе без разницы, если можно то прямо в коде javascript указать, если так нельзя то через подключаемый файл data.dat (в нем идут строки с данными)
насчет языка, я даже не знаю, что сказать. формат должен быть, чтобы браузер мог считать код и исполнить. строки с данными могут содержать либо любой html код, либо код на javascript, либо обычный текст |
|
Зачем JSON.parse(phrases.textContent), если скрипт и в нем данные представлены объектом?
|
laimas, а как к ним обратиться то?
|
Цитата:
|
laimas, да, изначально в теге script был заключен json.
Присвоить этот json какой-нибудь переменной я как-то не подумал. Я думал вы поведаете неизвестный мне способ обращения к неименованному объекту) |
Nexus - спасибо, но я не совсем понял.
вот этот код Цитата:
просто сами строки с данными я не хотел бы светить в html коде стр. и лучше их с отдельного файлика подружать. я извиняюсь, за тупизну, может чего не понял ((. ааа просто не привык работать через подобные https://jsfiddle.net сервисы ( заметил CSS #phrases{display:none} так не пойдет, в наш html код должна выводиться только одна строка из отдельного файлика (уж так лучше). |
dr.zoom, дело хозяйское, но вы хотите сделать почти такое - есть десятки изображений весом по N мегабайт, которые вы все грузите клиенту ради того, чтобы показать одно. Понятно, что это бесполезная трата ресурсов клиента.
Хотите чтобы клиент определял контент, ну так пусть определяет, а определение, это не выбор среди множества бесполезно загруженного, а асинхронный запрос указанного с сервера. И можете менять его по любому желаемому интервалу. |
Цитата:
Как это лучше исполнить, я как раз и хочу тут у вас узнать. Помогите с кодом люди добрые :cray: |
Цитата:
|
Цитата:
|
Скрипт клиентский ни из какого файла ничего тянуть не может. В простейшем случае, клиентских усилий может и не потребоваться, если у клиента включены куки. В этом случае при запросе страницы сервер проверяет установлена ли кука у клиента, если нет, то он выводит первый блок (в файле ли он или это базой определяется, не важно, важно что сервер может получать данные любым способом), и устанавливает куку. Если кука установлена, то ее значение увеличивается, сохраняется в куках и уже это значение определяет какой блок выводить.
Что-то более сложное, это уже потребует клиентского сценария. |
я извиняюсь за свои скромные познания, точнее их отсутствие. вот ссылка на скрипт http://phphack.ru/seescript/788/
он меня в принципе устраивает, но я буду выводить через <script src="http://Ваш_адрес/rand_js.php?r=1"></script> нужно только чтобы по порядку строки при ротации выводились, а не в случайном порядке. может кто то допилит код этого скрипта ? черт, там кажется все на php (( глянул rand_js.php код ( я извиняюсь за сумбур |
Какой язык использует сервер?
|
laimas,
Цитата:
|
<?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. Код не тестировал. Вообще. |
Цитата:
Цитата:
А использование кук вообще исключает клиента, сервер сразу может вывести следующий баннер, зачем все эти навороты на JS? |
Цитата:
Цитата:
Вы можете предложить ТС вариант без js. |
Цитата:
Цитата:
Зачем усложнять :) |
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Не нужен тут JS вообще. |
Цитата:
Цитата:
|
Цитата:
Определили изначально переменную $banner равную null. Определились с куками, получили запрашиваемый баннер, присвоив его переменной $banner. А далее где-то уже в представление вывод ее. Будет null (не удалось получить банннер из-за ошибок, да и бог с ним, это не причина выбрасывать исключения), значит на странице его не будет, иначе нарисуется. И как бы там не упрощалось у разработчика, стоит один раз увидеть что нет, один раз придется и проверить, и навсегда исправить. Такие ошибки исправляются на раз-два. |
laimas, в этом случае код нужно будет разбить на 2 части и объяснить тс, что обновление кукисов должно происходить до передачи самой страницы.
|
Цитата:
Так что вам мешает писать такую же логику для сервера, там ведь тоже самое только наоборот - все что прежде вывода нужно делать до вывода. <?php старт сессии, передача заголовков, работа с куками, обработка ajax запросов с выходом, обработка перенаправлений на себя, и т.п., и т.д. ?> <html> вывод, и не возбраняется выполнять иной код </htm> Что тут сложного в понимании? В любом случае даже для средней по условиям отображения страницы не избежать различных подключений и прочего кода, так как можно написать все одной портянкой, но сопровождать такой код очень сложно. |
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> |
На какие части? Это все один файл, а каждая его часть, это его логический блок. Вы же раздолбали код действительно на на две части между сервером и клиентом, считая при этом, что это куда понятнее. :)
Да и написано у вас ... <? $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 и laimas - ребята, спасибо большое за то что откликнулись на мою просьбу о помощи! Nexus-у отдельная благодарность на написание скрипта!
сегодня вечером буду его тестить, по результатам обязательно тут сообщу! готов отблагодарить материально, на ваш wmr или Яденьги. вопрос: Цитата:
нее накидайте файлов - файлы с каким расширением (формата) должны быть? .html .txt .php или .. ?? |
dr.zoom,
Цитата:
|
Цитата:
не удержался затестил сейчас прямо на работе. файлы в каталоге banners создал 1.txt и 2.txt прописал все пути, вроде даже правильно (скрипты правильно по урл открываются), но ничего не выводиться на index.html |
еще вопрос, точнее хотелка, если позволите.
страницы сайта сами по себе динамические - php (wordpress). буду использовать плагин кеширования, странички будут статичными. вопрос - можно ли сделать ротацию баннеров, чтобы не кешировалось ? |
dr.zoom, если использовать первый вариант (где 1 файл php и 1 файл js), то кешироваться не будет.
Во втором варианте (где баннер рисуется сервером) кешироваться, скорее всего, будет. Я не работаю с WP. |
Цитата:
а насчет работоспособности, что скажите? работает у вас код ? <?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(); }); у мня вот не работает ( |
Цитата:
Открыв в браузере консоль можно, что возвращает сервер и не падает ли где на пол пути скрипт, который вставляет на страницу баннер. Если сервер возвращает 500 http code, то смотрите error log. |
Часовой пояс GMT +3, время: 10:47. |