[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Цикличекая отравка данных АЯКС
kent666
Всем привет.
Мне нужно заставить АЯКС работать в цикле. Т.Е. есть парсер который лежит на сервере.
Браузер посылает запрос при помощи АЯКС
1) отправка
2) прием полученного ответа от сервера (может занимать 4 с)
3) проверка значения, если все ок заново отправка!

Есть JS скрипт
<html>
<head>
<title>
Парсер</title>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8" />

<script
type="text/javascript" language="javascript">

var
parsing = {
from:0,
to:0,
number:0,
req: function(){
if(navigator.appName == "Microsoft Internet Explorer")
{
return new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
return new XMLHttpRequest();
}
}
,
}

parsing.Request = function(query){

this.req.open('post', 'parsing.php' , true );
this.req.onreadystatechange = this.Refresh;
this.req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
this.req.send(query);
}

parsing.Refresh = function(){

var a = this.req.readyState;
if( a == 4 )
{
var b = this.req.responseText;
var c = document.getElementById('ajax').value;
document.getElementById('ajax').innerHTML = b + <br/> + c;
this.number++;
if(this.number < this.to){
this.Pusk(this.number);
}
}
}


parsing.Pusk = function(number){
var query;
query ='value='+encodeURIComponent(number);
this.Request(query);
this.Refresh();
}

parsing.start = function(){
this.from = document.getElementById('from').value - 0;
this.to = document.getElementById('to').value - 0;
this.number = this.from;
this.Pusk(this.number);
}
</script>


</head>
<body>

От <input type='text' id="from"/> до <input type='text' id="to"/>
<input
type="button" onClick="parsing.start()" value="старт"/><br />
<div
id="ajax"></div>

</body>
</html>


но при запуске скрипта выдает ошибку

this.req.open is not a function
this.req.open('post', 'parsing.php' , true );




Спустя 2 минуты, 52 секунды (19.02.2012 - 13:22) redreem написал(а):
ну а что он должен написать если req - это функция, а вовсе не объект с полями, которые ты перечисляешь

Спустя 3 минуты (19.02.2012 - 13:25) kent666 написал(а):
redreem
а как тогда сделать что бы он воспринимал req как объект причем кроссбраузерно!?

Спустя 7 минут, 54 секунды (19.02.2012 - 13:33) redreem написал(а):
я вообще с трудом улавливаю что ты хотел "навертеть" своим кодом - "смешались в кучу кони, люди"...

вот седня жевали - http://phpforum.ru/index.php?showtopic=0&v...dpost&p=1728576

возьми jQuery лучше попробуй прикрутить. с чистым httpXMLRequest запаришься отлаживать.

Спустя 11 часов, 52 минуты, 11 секунд (20.02.2012 - 01:25) bodja написал(а):
Ох вы вы и мучаете этот аякс ,каждую вторую тему мусолим. :D

Раздаю мою заготовку по нему.

Яваскрипт

var ax;
try {
ax = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
ax = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
ax = false;
}
}

if (!ax && typeof XMLHttpRequest!='undefined') {
ax = new XMLHttpRequest();
}

function _(get,post,code) {
ax.open('post', get , true);
ax.onreadystatechange = function () {
if(ax.readyState == 4 ) {var data=ax.responseText;eval(code);}
}

ax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
ax.send(post);
}


HTML

 <html>
<head>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>
AJAX</title>
<script
type="text/javascript" src="./script.js"></script>
</head>
<body>
<button
onClick="_('./ajax.php?get1=111&get2=222','post1=111&post2=222','document.getElementById(\'text\').innerHTML=data;')">get</button>

<div
id="text">text</div>
</body>
</html>


PHP
<?php
echo "ajax.php";
print_r($_GET);
print_r($_POST);
?>


Результат
Цитата
ajax.phpArray ( [get1] => 111 [get2] => 222 ) Array ( [post1] => 111 [post2] => 222 )


Все ставим на сервер ,запускаем ,все должно работать.
Теперь по js
функции вызова аякса,
называется _(да ,так и называется :),нижний знак подчеркивания,ненравится переименовываем на свою).
Обьект аякса создается один раз,а не при каждом запросе,поэтому и вынесен за функцию.
Функция принимает три аргумента ,все в строковом выражении
первый - относительный путь+GET запросы ,например './ajax.php?get1=111&get2=222'
второй - POST запросы ,например 'post1=111&post2=222',если нет POST -пишем null
третий-код который выполнится после получения даных ,например 'document.getElementById(\'text\').innerHTML=data;'
в функции зарезервирована переменная с названием data в ней хранятся полученные данные,поэтому в третем аргументе можно сразу вызвать функцию при приеме данных и передать через нее полученные данные.Незабываем писать третий аргумент в качестве строки ,так как этот код будет выполнен только после того ,как получем данные.
Еще пример вызова

_('./text.txt',null,'alert(data)');
здесь обращаемся к файлу text.txt GET и POST не передаем ,при получени алерт нам выводит полученные данные.

_('./chat.php','name=Вася&msg=Прювет!','document.getElementById(\'content\').innerHTML=data;');
Здесь обращаемся к файлу chat.php передаем POST name и msg ,при получении ответа передаем данные в элемент "content"

Еще ,из за безопасности ,желательно указывать относительные пути .
Кодировка всех файлов UTF-8 ,иначе могут быть проблемы с кириллицей.
Локально без запуска сервера работает только IE6 ,с остальными только на сервере.

ЗЫ Я думаю вопросов по яваскриптовому аяксу больше не будет. :D

Спустя 2 минуты, 49 секунд (20.02.2012 - 01:28) m4a1fox написал(а):
bodja
Мини мануал получился...

Спустя 20 часов, 46 минут, 31 секунда (20.02.2012 - 22:15) kent666 написал(а):
Ребята поделюсь с вами решением своего вопроса (вообщем кому будет интересно)
В мое поставленной задаче циклического запуска я использовал не АСИНХРОННЫЙ метода а наоборот СИНХРОННЫЙ. Вот уж не думал где это может пригодиться :D

<html>
<head>
<title>
Парсер</title>
<meta
http-equiv="Content-Type" content="text/html; charset=utf-8" />

<script
type="text/javascript" language="javascript">

var
parsing = {
from:0,
to:0,
number:0,
text: '',
}

parsing.Pusk = function(){
if(navigator.appName == "Microsoft Internet Explorer"){
req = new ActiveXObject("Microsoft.XMLHTTP");
}else{
req = new XMLHttpRequest();
}

req.open('post', 'parsing.php' , false );
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
req.send('value='+encodeURIComponent(this.number));

var a = req.readyState;
if( a == 4 )
{
var b = req.responseText;
this.text = b + '<br/>' + this.text;
document.getElementById('ajax').innerHTML = this.text;

this.number++;
if(this.number < (this.to + 1)){
this.Pusk(this.number);
}
}
}


parsing.start = function(){
this.from = document.getElementById('from').value - 0;
this.to = document.getElementById('to').value - 0;
this.number = this.from;
this.Pusk(this.number);
}
</script>


</head>
<body>

От <input type='text' id="from"/> до <input type='text' id="to"/>
<input
type="button" onClick="parsing.start()" value="старт"/><br />
<div
id="ajax"></div>

</body>
</html>


А вот именно использование синхронного АЯКСА

req.open('post', 'parsing.php' , [b]false[/b] );

Спустя 16 минут, 32 секунды (20.02.2012 - 22:31) bodja написал(а):
фича аякса ,что он Asynchronous Javascript and XML, а то что скрипт уйдет в ступор пока не примет данные при синхронном запросе - это уже зависит от ситуации. biggrin.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.