Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   вывод значения функции через равный интервал (https://javascript.ru/forum/misc/34339-vyvod-znacheniya-funkcii-cherez-ravnyjj-interval.html)

cOAPerator 30.12.2012 00:51

вывод значения функции через равный интервал
 
Всем привет! Начал изучать JS вот.. но чего то успехов мало пока :(

есть блок в который php функция выводит число, которое постоянно меняется:
<?php
echo "<b>".sizeof(file($base))."</b>";
?>

при обновлении страницы число меняется.
надо сделать чтобы число менялось с заданныем интервалом в 1 секунду, без перезагрузки страницы.
понимаю что надо использовать setInterval
но не меняется((

пробовал вот так:
var number = "<?=sizeof(file($base))?>";
var msgelement = document.getElementById('userOnline').innerHTML=setInterval('number', 1000);

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

Deff 30.12.2012 01:11

<div id="userOnline"></div>

<script type="text/javascript">
var number = 200;
var msgelement = document.getElementById('userOnline')
setInterval(function() {number+=100;msgelement.innerHTML=number}, 1000);
</script>

cOAPerator 30.12.2012 01:24

Deff, спасибо огромное за помошь, работает, только не так как я ожидал.
пример:
sizeof(file($base)) - подсчитвает юзеров онлайн, заносит их в файл и потом выводит.
открываем страницу в браузере - покажет 1
открваем ту же страницу в ДРУГОМ браузере покажет 2
НО при этом в первом браузере 1 на 2 не изменяется...

как быть?

UPD:
вот функция подсчета юзеров
//выделяем уникальный идентификатор сессии
$id = session_id();
if ($id!=""){
//текущее время
$CurrentTime = time();
//через какое время сессии удаляются
$LastTime = time() - 180;
//файл, в котором храним идентификаторы и время
$base = DOC_ROOT.MODULES."/user_session.txt";

$file = file($base);
$k = 0;
for ($i = 0; $i < sizeof($file); $i++) {
$line = explode("|", $file[$i]);
if ($line[1] > $LastTime) {
$ResFile[$k] = $file[$i];
$k++;
}
}

 for ($i = 0; $i<sizeof($ResFile); $i++) {
  $line = explode("|", $ResFile[$i]);
  if ($line[0]==$id) {
      $line[1] = trim($CurrentTime)."\n";
      $is_sid_in_file = 1;
  }
  $line = implode("|", $line); $ResFile[$i] = $line;
 }

 $fp = fopen($base, "w");
 for ($i = 0; $i<sizeof($ResFile); $i++) { fputs($fp, $ResFile[$i]); }
 fclose($fp);

 if (!$is_sid_in_file) {
  $fp = fopen($base, "a-");
  $line = $id."|".$CurrentTime."\n";
  fputs($fp, $line);
  fclose($fp);
 }
}

Deff 30.12.2012 01:43

Цитата:

Сообщение от cOAPerator
НО при этом в первом браузере 1 на 2 не изменяется...

Для этого по таймеру нужно делать Aякс-запрос к файлу статистики сервера(а сейчас просто добавляется 100)

cOAPerator 30.12.2012 01:46

Цитата:

Сообщение от Deff (Сообщение 224275)
Для этого по таймеру нужно делать Aякс-запрос к файлу статистики сервера(а сейчас просто добавляется 100)

так эта функция и делает запрос к файлу статистики же... не?
я вот выше привел полный код скрипта подсчета статистики

Deff 30.12.2012 01:56

Цитата:

Сообщение от cOAPerator
так эта функция и делает запрос к файлу статистики же... не?

Я не наю чо делается у Вас на сервере - от пользователя в браузере никак не узнать что творицо на сервере с иными пользователями не послав из брауза новый Аякс запрос с помощью ява-скрипт к серву

cOAPerator 30.12.2012 02:00

Цитата:

Сообщение от Deff (Сообщение 224278)
Я не наю чо делается у Вас на сервере - от пользователя в браузере никак не узнать что творицо на сервере с иными пользователями не послав из брауза новый Аякс запрос с помощью ява-скрипт к серву

setInterval(function() {msgelement.innerHTML=<?=sizeof(file($base))?>}, 1000);
а это разве не запрос с интервалом? функция объявлена, и вызывается с интервалом в 1 секунду.

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

все, я понял теперь.

логичное продолжение:
как сделать запрос к файлу?
сам ajax запрос я написать могу. не смогу распарсить файл js-ом.. подскажете?

структура файла такая хэшID | время
oecrgl7etos39s1ntercbh2s24|1356818703
2uc6oc0g2g2alv6cotbb8k1c85|1356818711
...

Deff 30.12.2012 02:02

Цитата:

Сообщение от cOAPerator
setInterval(function() {msgelement.innerHTML=<?=sizeof(file($base))?>}, 1000);
а это разве не запрос с интервалом? функция объявлена, и вызывается с интервалом в 1 секунду.

я лох в PHP, но имхо <?=sizeof(file($base))?> - вряд ли развертывается в браузере в ява-скрипт Аякс запроса
вы посмотрите выдачу HTML кода страницы - там чисто конкретная цифра - а не ява-скрипт функция

cOAPerator 30.12.2012 02:08

Цитата:

Сообщение от Deff (Сообщение 224282)
я лох в PHP, но имхо <?=sizeof(file($base))?> - вряд ли развертывается в браузере в ява-скрипт Аякс запроса
вы посмотрите выдачу HTML кода страницы - там чисто конкретная цифра - а не ява-скрипт функция

да верно, я выше пока вам писал ответ тоже допер до этого, вы тож самое написали)

собственно вопрос новый в моем посте выше :)

продублирую:

как сделать запрос к файлу?
сам ajax запрос я написать могу. не смогу распарсить файл jscript-ом.. подскажете?

структура файла такая хэшID | время
oecrgl7etos39s1ntercbh2s24|1356818703
2uc6oc0g2g2alv6cotbb8k1c85|1356818711

Deff 30.12.2012 02:10

Цитата:

Сообщение от cOAPerator
структура файла такая хэшID | время
oecrgl7etos39s1ntercbh2s24|1356818703
2uc6oc0g2g2alv6cotbb8k1c85|1356818711
...

Создайте аякс запрос - выведите данные через alert и выложите полученное в топик, посколь возможно будет отличаться от предполагаемого
Распарсить зная точно - не проблема

cOAPerator 30.12.2012 02:16

Цитата:

Сообщение от Deff (Сообщение 224284)
Создайте аякс запрос - выведите данные через alert и выложите полученное в топик, посколь возможно будет отличаться от предполагаемого
Распарсить зная точно - не проблема

так я точно знаю что такая структура. тока данные меняются постоянно.
мож просто считать количество строк? 1 строка -1 юзер там идет
или количество хешей... для верности подсчета...

Deff 30.12.2012 02:20

cOAPerator,
Выдайте конкретный пример, пометьте цветом выделяемые данные
2-е - если файл длинный - более 100кб - лучше парсить на серве и выпарсенное данное вкладывать в файл с иным именем - его и читать Aяксом

cOAPerator 30.12.2012 02:26

Код:

2uc6oc0g2g2alv6cotbb8k1c85|1356819742
fp6onv96hjv3fsu1jvernm4544|1356819747
t9fee2k4m43qr1e8c3tl71la30|1356819750
tj6m9qijcjp9emq3n5f4vfu7o7|1356819756

ну вот думаю что считать количество того что выделил жирным шрифтом достаточно будет
то бишь 4 должно получиться..

файл маленький размер его в байтах..

cOAPerator 30.12.2012 02:30

Цитата:

Сообщение от Deff (Сообщение 224287)
cOAPerator,
Выдайте конкретный пример, пометьте цветом выделяемые данные
2-е - если файл длинный - более 100кб - лучше парсить на серве и выпарсенное данное вкладывать в файл с иным именем - его и читать Aяксом

так не получится, потому что надо в реальном времени считать. а на серве постоянно парсинг этого файла с заданным интервалом - лишняя нагрузка на сервер.. хз мож я и не прав;)

Deff 30.12.2012 02:32

cOAPerator,
Разделение меж строками перевод строки ? или ?
Нужно считать кол- во строк ?

cOAPerator 30.12.2012 02:36

Код:

2uc6oc0g2g2alv6cotbb8k1c85|1356819742
fp6onv96hjv3fsu1jvernm4544|1356819747
t9fee2k4m43qr1e8c3tl71la30|1356819750
tj6m9qijcjp9emq3n5f4vfu7o7|1356819756

считать количество выделенных жирным блоков "буквоцифр":)
в данном случает должно получиться 4
строки считать не надо
Разделение меж строками нету. там просто каждая новая строка это новый юзер.

Deff 30.12.2012 03:02

Цитата:

Сообщение от cOAPerator
Разделение меж строками нету

Т.е строка тaкая ?
2uc6oc0g2g2alv6cotbb8k1c85|1356819742fp6onv96hjv3fsu1jvernm4544|1356819747t9fee2k4m43qr1e8c3tl71la30|1356819750tj6m9qijcjp9emq3n5f4vfu7o7|1356819756

число знаков в 2uc6oc0g2g2alv6cotbb8k1c85|1356819742 - везде идентично ?

cOAPerator 30.12.2012 03:09

Вложений: 1
Цитата:

Сообщение от Deff (Сообщение 224292)
Т.е строка тaкая ?
2uc6oc0g2g2alv6cotbb8k1c85|1356819742fp6onv96hjv3fsu1jvernm4544|1356819747t9fee2k4m43qr1e8c3tl71la30|1356819750tj6m9qijcjp9emq3n5f4vfu7o7|1356819756

число знаков в 2uc6oc0g2g2alv6cotbb8k1c85|1356819742 - везде идентично ?

нет, тут 4 строки
файл приложил в аттаче, который парсить надо
число знаков везде 32 - это обыкновенный хэш в 32 байта

Deff 30.12.2012 03:31

<div id="userOnline"></div>

<script type="text/javascript">
var number = 200;
var msgelement = document.getElementById('userOnline');
msgelement.innerHTML=number;

setInterval(function() {
  function() { //Тут Аякс запрос 
     //.....................
     //Пусть data - Данные из файла

     number=data.split("|").length-1;
     msgelement.innerHTML=number

  } //Конец  Аякс запроса 

}, 1000);
</script>

cOAPerator 30.12.2012 03:53

Цитата:

Сообщение от Deff (Сообщение 224294)
<div id="userOnline"></div>

<script type="text/javascript">
var number = 200;
var msgelement = document.getElementById('userOnline');
msgelement.innerHTML=number;

setInterval(function() {
  function() { //Тут Аякс запрос 
     //.....................
     //Пусть data - Данные из файла

     number=data.split("|").length-1;
     msgelement.innerHTML=number

  } //Конец  Аякс запроса 

}, 1000);
</script>

спасибо! все работает!

UPD: НЕ РАБОТАЕТ!

Deff 30.12.2012 04:12

Cтандартно для чатов - скрипт делает Аякс запросы не чаще 10-12 сек, дабы избежать лишней нагрузки

Поскольку сама обработка файла браузером может занимать больше секунды
К примеру страница грузицо в среднем секунд 20-30, смысла делать смену цифр существенно быстрее вроде нет

cOAPerator 30.12.2012 06:42

снова не РАБОТАЕТ!
number=data.split("|").length-1; - делает новый массив и считает количество элементов массива, НО
так как у меня файл такого вида:

2uc6oc0g2g2alv6cotbb8k1c85|1356819742
fp6onv96hjv3fsu1jvernm4544|1356819747
t9fee2k4m43qr1e8c3tl71la30|1356819750
tj6m9qijcjp9emq3n5f4vfu7o7|1356819756

и считать надо только то что выделено жирным, то получатся не верный ответ.
и 2 проблема - все время выводит 0.

сейчас код такой:
setInterval(function() {
//Тут Аякс запрос
request = new XMLHttpRequest();
request.open("GET", "user_session.txt", true);
request.send(null);
	//Пусть response - Данные из файла
var response = request.responseText;
	number=response.split("|").length;
var msgelement = document.getElementById("userOnline");
	msgelement.innerHTML=number;
//Конец  Аякс запроса
}, 1000);

Deff 30.12.2012 12:19

<div id="userOnline"></div>

<script type="text/javascript">
//Ссылка на подгружаемый файл
var  Link='http://cOAPerator.ru/user_session.txt';

var number = 6;
var msgelement = document.getElementById('userOnline');
msgelement.innerHTML=number;

setInterval(function() {

function getXmlHttp(){var xmlhttp;try{xmlhttp=new ActiveXObject("Msxml2.XMLHTTP")}catch(e){try{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")}catch(E){xmlhttp=false}}if(!xmlhttp&&typeof XMLHttpRequest!='undefined'){xmlhttp=new XMLHttpRequest()}return xmlhttp}
var xmlhttp=getXmlHttp();xmlhttp.open('GET',Link+'?'+Math.random(),true);xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState==4){if(xmlhttp.status==200){

     number=xmlhttp.responseText.split("|").length-1;
     msgelement.innerHTML=number
     
}}};xmlhttp.send(null);

}, 1000);
</script>

cOAPerator 30.12.2012 19:50

Deff,
number=xmlhttp.responseText.split("|").length-1; -эта строка не правильно считает
и все время висит число 6 и не меняется.

Deff 31.12.2012 00:17

Цитата:

Сообщение от cOAPerator
number=xmlhttp.responseText.split("|").length-1; -эта строка не правильно считает

может неверный линк ?
var Link='http://cOAPerator.ru/user_session.txt'
====================
поставьте вместо
number=xmlhttp.responseText.split("|").length-1;
msgelement.innerHTML=number

Это
alert(xmlhttp.responseText)
и посмотрите - меняется ли файл

dmitriymar 31.12.2012 00:32

Цитата:

Сообщение от Deff
alert(xmlhttp.responseText)
и посмотрите - меняется ли файл

и не будет. гет запросы кешируются. либо пусть заголовки правильные отдаёт -с запретом кеширования . либо в запрос соль пусть добавляет

Deff 31.12.2012 00:34

Цитата:

Сообщение от dmitriymar
либо в запрос соль пусть добавляет

ну вродь есть
Цитата:

Сообщение от Deff
xmlhttp.open('GET',Link+'?'+Math.random()


dmitriymar 31.12.2012 00:41

действительно. не заметил.

cOAPerator 31.12.2012 02:04

ребят объясните мне о чем вы ща разговариваете? ))) ппц я нуб))
Deff, так как посчитать то? чего то я никак не пойму..
из за того что в конце каждой строки нет этого долбаного разделителя |
не считается правильно..
dmitriymar, содержание файла принимается нормально.

cOAPerator 31.12.2012 02:19

Deff, пардон, походу я скосячил немного. попробовал алерт поставить так он ниче не выдает. пустое окно алерта.
то бишь данные не приходят.
а ссылка обязательно должна быть полная - http://cOAPerator.ru/user_session.txt
или можно относительную поставить - /user_session.txt
???

с относительной ниче так же не выдает..

но вот что интересно, когда стоит
number=xmlhttp.responseText.split("|").length-1;
msgelement.innerHTML=number

то показывает 1 юзер..

Deff 31.12.2012 02:20

Цитата:

Сообщение от cOAPerator
а ссылка обязательно должна быть полная - http://cOAPerator.ru/user_session.txt
или можно относительную поставить - /user_session.txt
???

Учтите что текущий полный адрес - от балды - ставьте реальный
Проверьте файл вставкой ссылки в окно браузера

Ps: файл должен быть с того же домена, что и страница со скриптом (Иначе Аякс не работает!

cOAPerator 31.12.2012 02:21

Цитата:

Сообщение от Deff (Сообщение 224519)
Наверно можно,
Учтите что текущий полный адрес - от балды

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

че делать?

Deff 31.12.2012 02:25

cOAPerator,
вставьте ссылку на файл в браузер - должен быть текст в окне

cOAPerator 31.12.2012 02:27

Deff,
ура! прогресс! значит я поставил относительный полный путь /user_session.txt
НО, в запросе поставил false вот так:
request.open('GET','modules/user_session.txt', false);

и о чудо, вышла первая строка из файла

тока я не понял почему при асинхронном запросе контент с файла не грузится а при синхронном нормально его загружает... странно...

cOAPerator 31.12.2012 02:34

но считает по прежнему не правильно... зашел с 2 браузеров, а показывает 3 онлайн

Deff 31.12.2012 02:37

Цитата:

Сообщение от cOAPerator
но считает по прежнему не правильно... зашел с 2 браузеров, а показывает 3 онлайн

Считайте через алерт и выложите текст

cOAPerator 31.12.2012 02:43

Цитата:

Сообщение от Deff (Сообщение 224526)
Считайте через алерт и выложите текст

пожалуйста:
когла 1 онлайн:
gr9b06sos303ba7ihn209aqsh7|1356906773


когда 2 онлайн
gr9b06sos303ba7ihn209aqsh7|1356907339
4b8c8r6looq5rtnq62n4m6e7q2|1356907329


когда 3 человека онлайн
gr9b06sos303ba7ihn209aqsh7|1356907339
4b8c8r6looq5rtnq62n4m6e7q2|1356907329
loht91nuuj4i5v0is2nn3nrnf7|1356907396


надо чтобы считало количество в 1 колонке:
-----колонка 1------------|--колонка 2---
gr9b06sos303ba7ihn209aqsh7|1356907339
4b8c8r6looq5rtnq62n4m6e7q2|1356907329
loht91nuuj4i5v0is2nn3nrnf7|1356907396

Deff 31.12.2012 03:05

xmlhttp.responseText.split("|").length-1;
должно работать
Пример
var a="gr9b06sos303ba7ihn209aqsh7|1356907339\
4b8c8r6looq5rtnq62n4m6e7q2|1356907329\
loht91nuuj4i5v0is2nn3nrnf7|1356907396";

alert(a.split("|").length-1)

Deff 31.12.2012 03:07

xmlhttp.responseText.split("|").length-1;
должно работать
Пример
var a="gr9b06sos303ba7ihn209aqsh7|1356907339\
4b8c8r6looq5rtnq62n4m6e7q2|1356907329";

alert(a.split("|").length-1)


var a="gr9b06sos303ba7ihn209aqsh7|1356907339\
4b8c8r6looq5rtnq62n4m6e7q2|1356907329\
loht91nuuj4i5v0is2nn3nrnf7|1356907396";

alert(a.split("|").length-1)

cOAPerator 31.12.2012 03:09

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


Часовой пояс GMT +3, время: 14:48.