Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.07.2008, 13:09
Новичок на форуме
Отправить личное сообщение для lesik Посмотреть профиль Найти все сообщения от lesik
 
Регистрация: 07.07.2008
Сообщений: 3

чтение из случайного файла
Как с помощью JavaScript'a сделать следующее:

Есть куча файлов cat1.txt cat2.txt cat3.txt и т.д. в них различные куски html кода. Надо что бы при загрузке index.html включал в себя кусок кода из любого случайно выбранного файла.

Последний раз редактировалось lesik, 07.07.2008 в 13:17.
Ответить с цитированием
  #2 (permalink)  
Старый 07.07.2008, 15:01
Аватар для Phoenix
Профессор
Отправить личное сообщение для Phoenix Посмотреть профиль Найти все сообщения от Phoenix
 
Регистрация: 24.09.2007
Сообщений: 165

<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. Но, тогда страница думает, что Весь скрипт заканчивается на этом месте. Т.е. думаю надо заменить '<' аски эквивалентами, но не знаю как это сделать )
__________________
После каждой девятки все снова с нуля,
Все снова с нуля, но не сначала...

Последний раз редактировалось Андрей Параничев, 07.07.2008 в 15:42. Причина: Обрамляйте код в теле сообщения bb-кодами, пожалуйста.
Ответить с цитированием
  #3 (permalink)  
Старый 07.07.2008, 16:07
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

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>
Ответить с цитированием
  #4 (permalink)  
Старый 07.07.2008, 16:11
Аватар для Phoenix
Профессор
Отправить личное сообщение для Phoenix Посмотреть профиль Найти все сообщения от Phoenix
 
Регистрация: 24.09.2007
Сообщений: 165

но ничего не мешает выводить ХТМЛ теги в document.write('......') и будет мой вариант рабочим
__________________
После каждой девятки все снова с нуля,
Все снова с нуля, но не сначала...
Ответить с цитированием
  #5 (permalink)  
Старый 07.07.2008, 16:58
Новичок на форуме
Отправить личное сообщение для lesik Посмотреть профиль Найти все сообщения от lesik
 
Регистрация: 07.07.2008
Сообщений: 3

Спасибо Андрею Параничеву и Phoenix'у за ответ.

Использование XMLHttpRequest слишком сложный вариант для меня (ничего не понял). С помощью Java это я так понял не решаемо. А что можете предложить из PHP.
Ответить с цитированием
  #6 (permalink)  
Старый 07.07.2008, 17:09
Аватар для Phoenix
Профессор
Отправить личное сообщение для Phoenix Посмотреть профиль Найти все сообщения от Phoenix
 
Регистрация: 24.09.2007
Сообщений: 165

$a=rand(1,3);
include($a.".html");

Это на PHP. (1,3) граница интервала. файлы для подключения 1.html, 2.html и тд... расширение можно менять
__________________
После каждой девятки все снова с нуля,
Все снова с нуля, но не сначала...
Ответить с цитированием
  #7 (permalink)  
Старый 07.07.2008, 17:13
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

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();
Ответить с цитированием
  #8 (permalink)  
Старый 07.07.2008, 17:24
Новичок на форуме
Отправить личное сообщение для lesik Посмотреть профиль Найти все сообщения от lesik
 
Регистрация: 07.07.2008
Сообщений: 3

Спасибо большое. Все работает как я мечтал!!!

Последний раз редактировалось lesik, 07.07.2008 в 20:03.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из тектового файла Jackky Общие вопросы Javascript 14 30.06.2012 01:00
Высота фрейма и высота загружаемого файла findman Events/DOM/Window 5 15.09.2008 03:33
Как узнать какие ошибки произошли при парсинге xml файла faunder Events/DOM/Window 0 12.09.2008 14:17
оприделить имя файла www Общие вопросы Javascript 2 10.08.2008 14:34
Поле загрузки файла kotofeich Элементы интерфейса 3 30.07.2008 11:24