Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Постоянно обновление страницы (PHP и JavaScript)
 
 автор: komex   (06.09.2006 в 11:32)   письмо автору
 
 

Всем привет! У меня такая проблема: хочу сделать частичное обновление страницы. Т.е. есть, например, такая строка:

<span id='str'></span>

Я хочу, что бы туда добавлялся какой нибудь текст (все равно какой). Но добавлялся все время разный. Получается, что-то вроде обновления, но не всей страницы, а только этого текста. Я пытался сделать так:

<script id='js_1'></script>
<script>
function update_str() {
document.getElementById("js_1").src = 'update.php';
}
setInterval('update_str', 1000);
</script>

Т.е. должно происходить обновление каждую секунду. В файле update.php генерируется этот код:

<?
//тут получаем текст ($text), который надо вставить (например, из БД)
//...
echo "document.getElementById('str').innerHTML = '.$text.';";
?>

В результате при загрузке страницы в Opera этот текст вставляется один раз и больше не меняется, а в IE все вроде работает нормально (т.е. текст обновляется).
Вопрос: чем может быть вызвана неправильная работа скрипта в Opera? И как это можно исправить?
Заранее спасибо!

   
 
 автор: komex   (08.09.2006 в 22:10)   письмо автору
 
   для: komex   (06.09.2006 в 11:32)
 

Народ, кто нибудь может мне помочь?

   
 
 автор: Yuri   (09.09.2006 в 07:54)   письмо автору
 
   для: komex   (06.09.2006 в 11:32)
 

Просто Opera как и любой нормальный браузер кэширует файл. Поэтому браузер повторно не запрашивает файл с сервера.

   
 
 автор: komex   (09.09.2006 в 10:14)   письмо автору
 
   для: Yuri   (09.09.2006 в 07:54)
 

А как сделать, что бы браузер не кешировал файл? Я пытался этого добиться при помощи header'ов на php, но это все равно не помогло. Что можно сделать?

   
 
 автор: kasmanaft   (09.09.2006 в 11:34)   письмо автору
 
   для: komex   (09.09.2006 в 10:14)
 

можно так попробовать
<META HTTP-EQUIV="Cache-Control" content="no-cache">

   
 
 автор: komex   (09.09.2006 в 22:32)   письмо автору
 
   для: kasmanaft   (09.09.2006 в 11:34)
 

Это тоже не срабатывает. Я ставил эти тэги на странице, с которой происходит обращение. Не помогает! А в скрипт, генерирующий код на JavaScript это вставить нельзя.

   
 
 автор: cheops   (09.09.2006 в 12:21)   письмо автору
 
   для: komex   (09.09.2006 в 10:14)
 

Можно подавить кэширование так, как это описывается в темах по ссылкам
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=260
http://www.softtime.ru/forum/read.php?id_forum=4&id_theme=5460
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1830
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=4960
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=1830
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=9938

   
 
 автор: Yuri   (09.09.2006 в 15:19)   письмо автору
 
   для: komex   (09.09.2006 в 10:14)
 

Проблема в том, что для вашего варианта запрет на кэш не поможет, независимо от того каким способом вы будете это делать. Единственный вариант если не отказаться от данного механизма... Это использовать прибавление некого идентификатора после update.php, тем самым заставляя браузер относиться к файлу как к новому. Например: update.php?q=1 и далее каждый раз менять значения q.

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

В этой области есть способ более или менее близкий к вашему... Subsys_JsHttpRequest от Дмитрия Котерова. Его принцип заключается в динамическом создании объекта <SCRIPT>. Этот способ существовал и до него, но благодаря ему о данном подходе в Рунете заговорили чаще. Несмотря на то что, Subsys_JsHttpRequest имеет не один релиз, проблем с ней все равно хватает и память она будет поджирать как и ваш метод.

Есть способы более стабильно работующие..... хотя это оффтопик.

   
 
 автор: komex   (09.09.2006 в 22:31)   письмо автору
 
   для: Yuri   (09.09.2006 в 15:19)
 

Дело в том, что я уже пытался добавлять разные идентификаторы. Эффект тот же. Мне интересно узнать это, т.к. не могу понять как работает обновление в smzchat. Скачал, установил, там работает обновление нормально. А там точно используется JavaScript. Есть еще один вариант - это iframe, в котором генерируется с помощью php код JavaScript. Но вроде это не очень хорошо, т.к. вроде происходит обращение к 2 страницам сразу. Я так пробовал и в Opera, и в IE все работало нормально. Как лучше поступить: искать решения проблемы с кэшированием или лучше использовать iframe?

   
 
 автор: Yuri   (10.09.2006 в 08:24)   письмо автору
 
   для: komex   (09.09.2006 в 22:31)
 

Если речь идет о SmZchat vioo, который я видел здесь на форуме, то кажется он реализован на AJAX (XMLHttpRequest). Если я не прав, то меня поправят. Информации о AJAX в сети полно если хотите понять принцип.

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

Что косается iframe... (и это лично мое мнение)... Его использование наиболее истественно. К двум страницам сразу обращения не происходит. Для браузера выглядит все пристойно - как будто вы работаете с двумя окнами отдельно (особенно для Temporary Internet Files).
Этот метод используют по-разному, в зависимости от конкретной задачи. Можно использовать вообще его динамическую генерацию.

Вот пример:

Родительский файл, который делает запрос на сервер:


<html>
<title>Обновление без перезагрузки</title>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>
<meta http-equiv='Pragma' content='no-cache'>
<meta http-equiv='Cache-Control' content='no-cache, must-revalidate'>
<style><!--
#ifr, #frm{visibility: hidden;
   height: 1px;}
//--></style>
<script > <!--
function myload (url) {
url=url+'?str=' //str - Имя передаваемой переменной
+document.getElementById('txt').value;

document.getElementById('frm').innerHTML =
'<iframe id="ifr" src="'+url+'"></iframe>';
}
function clean(){
document.getElementById('frm').
removeChild(document.getElementById('frm').
childNodes[0]);
} //-->
</script>

<body>
<span id='res'><span style="background-color:#C6C6FF;">.....Result type.....</span></span>
<br><input type='text' id='txt' onChange='myload("loader.php")'>
<span onMouseOver="this.style.cursor='hand'" onClick='myload("loader.php")'>Обновить</span>
<br><span>Объектов на странице:</span><span id='counter'></span>
<br><span>Объектов в фрейме:</span><span id='frcounter'></span>
</body>
</html>
<div id='frm'></div><!-- Место для динамического фрейма //-->
<?
//========================================================================
/*
------------------------------
Работает в Opera 7.23, IE 6, FF 1.5, MyIE2 0.9, Mozilla 1.7, 1.8
------------------------------
*/
//========================================================================


И loader.php, который формирует и доставляет ответ:


<?
$file
='test.txt';
//=====================================================================
$tmp=@fopen ($file'a+');
$time=date('H:i:s');
$ip=@$_SERVER['REMOTE_ADDR'];
$br=@$_SERVER['HTTP_USER_AGENT'];
$rqu=@$_SERVER['REQUEST_URI'];
$stw=$ip." - ".$time." - ".$br."-".$rqu."\n";
fwrite($tmp$stw);
fclose($tmp);
//=====================================================================
$str="<b>Строк в файле:".count(file($file))." -
Русский текст - спец.символы(.,'{}!;:?<>./\) -
Переданная GET-ом строка:"
.@$_GET["str"]."</b>";
//=====================================================================
?>
<html>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>
<meta http-equiv='Pragma' content='no-cache'>
<meta http-equiv='Cache-Control' content='no-cache, must-revalidate'>
<script ><!--
function res(){
parent.document.getElementById('res').
innerHTML=document.body.innerHTML;
parent.document.getElementById('counter').innerHTML = parent.document.all.length;
parent.document.getElementById('frcounter').innerHTML = document.all.length;
setTimeout("parent.clean()",1)
} //-->
</script>
<body style="visibility:hidden;" onLoad='res()'>

<?=@$str?>

</body></html><?
//=====================================================================
?>


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

Вообще выбирать вам.

   
 
 автор: komex   (10.09.2006 в 11:53)   письмо автору
 
   для: Yuri   (10.09.2006 в 08:24)
 

Спасибо большое! Вообще я сначала примерно так и делал, но потом где-то услышал, что с iframe могут возникнуть проблемы, и поэтому я стал пытаться сделать без iframe.

И тогда еще вопрос: лучше использовать iframe или AJAX?

   
 
 автор: Yuri   (10.09.2006 в 17:39)   письмо автору
 
   для: komex   (10.09.2006 в 11:53)
 

Мне больше нравитья динамическое создание iframe за простоту и надежность. У iframe однозначно кроссбраузерность выше чем у Ajax.

Многие проблемы iframe (порча истории, щелчек, большой расход памяти и медлительность) просто надуманы если его правильно использовать для динамической подгрузки.

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

А вообще решать вам... попробуите то и другое и определитесь.

   
 
 автор: komex   (10.09.2006 в 18:16)   письмо автору
 
   для: Yuri   (10.09.2006 в 17:39)
 

Еще раз спасибо! Я тогда остановлюсь на iframe.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования