|
|
|
| Всем привет! У меня такая проблема: хочу сделать частичное обновление страницы. Т.е. есть, например, такая строка:
Я хочу, что бы туда добавлялся какой нибудь текст (все равно какой). Но добавлялся все время разный. Получается, что-то вроде обновления, но не всей страницы, а только этого текста. Я пытался сделать так:
<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
(06.09.2006 в 11:32)
| | Народ, кто нибудь может мне помочь? | |
|
|
|
|
|
|
|
для: komex
(06.09.2006 в 11:32)
| | Просто Opera как и любой нормальный браузер кэширует файл. Поэтому браузер повторно не запрашивает файл с сервера. | |
|
|
|
|
|
|
|
для: Yuri
(09.09.2006 в 07:54)
| | А как сделать, что бы браузер не кешировал файл? Я пытался этого добиться при помощи header'ов на php, но это все равно не помогло. Что можно сделать? | |
|
|
|
|
|
|
|
для: komex
(09.09.2006 в 10:14)
| | можно так попробовать
<META HTTP-EQUIV="Cache-Control" content="no-cache">
|
| |
|
|
|
|
|
|
|
для: kasmanaft
(09.09.2006 в 11:34)
| | Это тоже не срабатывает. Я ставил эти тэги на странице, с которой происходит обращение. Не помогает! А в скрипт, генерирующий код на JavaScript это вставить нельзя. | |
|
|
|
|
|
|
|
|
для: komex
(09.09.2006 в 10:14)
| | Проблема в том, что для вашего варианта запрет на кэш не поможет, независимо от того каким способом вы будете это делать. Единственный вариант если не отказаться от данного механизма... Это использовать прибавление некого идентификатора после update.php, тем самым заставляя браузер относиться к файлу как к новому. Например: update.php?q=1 и далее каждый раз менять значения q.
Но настоятельно не рекомендую использовать данный вариант и механизм, так как фактически вы будете загружать не один и тот же файл, а разные с точки зрения браузера.
В этой области есть способ более или менее близкий к вашему... Subsys_JsHttpRequest от Дмитрия Котерова. Его принцип заключается в динамическом создании объекта <SCRIPT>. Этот способ существовал и до него, но благодаря ему о данном подходе в Рунете заговорили чаще. Несмотря на то что, Subsys_JsHttpRequest имеет не один релиз, проблем с ней все равно хватает и память она будет поджирать как и ваш метод.
Есть способы более стабильно работующие..... хотя это оффтопик. | |
|
|
|
|
|
|
|
для: Yuri
(09.09.2006 в 15:19)
| | Дело в том, что я уже пытался добавлять разные идентификаторы. Эффект тот же. Мне интересно узнать это, т.к. не могу понять как работает обновление в smzchat. Скачал, установил, там работает обновление нормально. А там точно используется JavaScript. Есть еще один вариант - это iframe, в котором генерируется с помощью php код JavaScript. Но вроде это не очень хорошо, т.к. вроде происходит обращение к 2 страницам сразу. Я так пробовал и в Opera, и в IE все работало нормально. Как лучше поступить: искать решения проблемы с кэшированием или лучше использовать iframe? | |
|
|
|
|
|
|
|
для: 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, динамически подгрузится на родительску страницу, а сам фрейм удалиться (словно вы закрыли окно). Ни порчи истории ни счелчка нет. В строке состаяния подгрузка видна, но думаю из этических соображений это правльнее.
Вообще выбирать вам. | |
|
|
|
|
|
|
|
для: Yuri
(10.09.2006 в 08:24)
| | Спасибо большое! Вообще я сначала примерно так и делал, но потом где-то услышал, что с iframe могут возникнуть проблемы, и поэтому я стал пытаться сделать без iframe.
И тогда еще вопрос: лучше использовать iframe или AJAX? | |
|
|
|
|
|
|
|
для: komex
(10.09.2006 в 11:53)
| | Мне больше нравитья динамическое создание iframe за простоту и надежность. У iframe однозначно кроссбраузерность выше чем у Ajax.
Многие проблемы iframe (порча истории, щелчек, большой расход памяти и медлительность) просто надуманы если его правильно использовать для динамической подгрузки.
Если вы попробовали мой пример, посмотрите сами, что история в браузере осталась неизменной и щелчка нет. Памяти расходуется не больще чем на обычное окно загружающее один и тот же файл (а вот AJAX памяти жрет будь здоров, если часто делать запрос к серверу). По скорости трудно сравнивать... но я делал динамическую подгрузку изображений все было нормально.
А вообще решать вам... попробуите то и другое и определитесь. | |
|
|
|
|
|
|
|
для: Yuri
(10.09.2006 в 17:39)
| | Еще раз спасибо! Я тогда остановлюсь на iframe. | |
|
|
|