чтение из случайного файла
Как с помощью JavaScript'a сделать следующее:
Есть куча файлов cat1.txt cat2.txt cat3.txt и т.д. в них различные куски html кода. Надо что бы при загрузке index.html включал в себя кусок кода из любого случайно выбранного файла. |
<script type='text/javascript'> var n=Math.floor(Math.random() * 3) + 1; var s="<script type='text/javascript' src='"+n+".js'>"; document.write(s); </script> Работает только в ФФ. Думаю из за того, что нет закрывающегося тега у строки s. Но, тогда страница думает, что Весь скрипт заканчивается на этом месте. Т.е. думаю надо заменить '<' аски эквивалентами, но не знаю как это сделать ) |
Phoenix,
Можно сделать так: <script type='text/javascript'> var n=Math.floor(Math.random() * 3) + 1; var s="<script type='text/javascript' src='"+n+".js'><"+"/scr"+"ipt>"; document.write(s); </script> Но этот вариант неправильный, с точки зрения постановки задачи нам нужно получать куски html кода из файлов, а в вашем варианте файлы должны быть правильным JavaScript. lesik, Самым оптимальным решением вашей задачи будет использование серверных скриптов, написанных, например, на PHP. Там эта задача решается тривиально. Тем не менее, если вам принципиально использовать JavaScript, то вы можете использовать AJAX, для загрузки произвольного содержания и его отображения на странице. Но в таком случае нужно знать точное количество вариантов таких файлов. Для этого решения вам нужно будет использовать какую-нибудь простую обертку объекта XMLHttpRequest, например такую: var ajaxRequest = function() { var xhrObject = null; var callback = null; var params = null; if(typeof XMLHttpRequest != "undefined") { xhrObject = new XMLHttpRequest(); } else { try { xhrObject = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { xhrObject = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { return null; } } } var readyStateHandler = function() { if(xhrObject.readyState == 4) { if(xhrObject.status == 200) { callback(xhrObject.responseText, params); } } } return function(file, callbackFunc, callbackParams) { if(!file) return false; if(typeof callbackFunc != "function") return false; params = callbackParams || null; callback = callbackFunc; xhrObject.open("GET", file, true); xhrObject.onreadystatechange = readyStateHandler; xhrObject.send(null); } }(); Затем вам нужно будет написать обработчик, который сможет работать с этой оберткой, в вашем случае подобный этому: function addRandomHTML(htmlstr, id) { var element = document.getElementById(id); element.innerHTML = htmlstr; } Теперь вы можете подключать файл с сервера, и выдавать результат в обработчик, в который, помимо этого, можно передать еще и параметр (в нашем случае id элемента, в который будет вставлен результат с сервера). Вот простой пример, как это будет выглядеть, если будет 3 варианта файлов: <script> // Тут цифра "3" обозначает общее количество файлов: var filename = (Math.floor(Math.random() * 3) + 1) + ".txt" </script> <body onLoad="ajaxRequest(filename, addRandomHTML, 'mydiv');"> <div id="mydiv"></div> </body> |
но ничего не мешает выводить ХТМЛ теги в document.write('......') и будет мой вариант рабочим :)
|
Спасибо Андрею Параничеву и Phoenix'у за ответ.
Использование XMLHttpRequest слишком сложный вариант для меня (ничего не понял). С помощью Java это я так понял не решаемо. А что можете предложить из PHP. |
$a=rand(1,3);
include($a.".html"); Это на PHP. (1,3) граница интервала. файлы для подключения 1.html, 2.html и тд... расширение можно менять |
lesik,
Допустим у вас в какой-то папке (пусть будет "parts") есть файлы cat1.txt, cat2.txt, cat3.txt, ..., catN.txt. Если вы знаете это самое N число файлов, то тут все просто. В нужном месте страницы просто вставьте такой код: <? readfile('parts/cat'. rand(1, $n) .'.txt'); ?> Если вы его не знаете, то можете попробовать предварительно посчитать количество файлов в директории, например вот так: $n = 0; $d = dir('parts'); while (false !== ($entry = $d->read())) if ($entry != '..' && $entry != '.' && is_file('parts/'. $entry)) { $n++; } $d->close(); |
Спасибо большое. Все работает как я мечтал!!!
|
Часовой пояс GMT +3, время: 20:16. |