kpp
Новичок
Как попасть внутрь процедуры. Выполнение двух AJAX параллельно
Начну по порядку.
Проблема в том, что я не могу конкретно передать имя нужного мне объекта, а точнее сам объект в процедуру.
Я взял более-менее готовый код для реализации AJAX-приложения.
Вот код самой html-странички:
В ней две кнопки и два текстарея в которые пишется время по-разному.
Вот код JavaScript-овый:
Ну и, конечно, создание объекта RequestObject, хотя на него можно и не смотреть, тут всё в порядке:
Головной вопрос в том, как разграничить эти два запроса. Когда выполняется один, он ещё не выполнилс до конца, я нажимаю кнопку для запуска второго - тут первый обрывается и начинается второй.
Причина понятна, переменная называется одним именем. Но как сделать так, чтобы функция (или процедура, не знаю как это назвать, параметров ей передавать почему-то нельзя - ошибка) processReqChange() принимала объект нужный и там уже всё что надо с ним вытворяла.
Как передать в эту процедуру параметр? Ей даже скобки нельзя поставить в конце - ошибка.
Вот эта таинственная строка "req.onreadystatechange = processReqChange;"
Не создавать же две функции processReqChange для двух параллельных запросов. Как видно по коду внутри сейчас у неё глобальная переменная req, иначе к ней внутрь не пробраться.
Надеюсь всё чётко объяснил. Целый день пропыхтел с этим делом. В статьях по ажаксу об этом не упоминают, считая это недостойным внимания желом.
Начну по порядку.
Проблема в том, что я не могу конкретно передать имя нужного мне объекта, а точнее сам объект в процедуру.
Я взял более-менее готовый код для реализации AJAX-приложения.
Вот код самой html-странички:
PHP:
<html>
<head>
<title>show</title>
</head>
<body>
<script language="JavaScript" src="./createRequestObject.js"></script>
<script language="JavaScript" src="./processReqChange.js"></script>
<script>
function go(){
req = createRequestObject();
nameTarget="textNow";
req.onreadystatechange = processReqChange;
req.open("GET", "./proc.php?hash=" + Math.random(), true);
req.send(null);
}
function goO(){
req = createRequestObject();
nameTarget="textNowO";
req.onreadystatechange = processReqChange;
req.open("GET", "./procO.php?hash=" + Math.random(), true);
req.send(null);
}
</script>
<textarea style="height:150px; width:180px" id="textNow">
</textarea>
<textarea style="height:150px; width:180px" id="textNowO">
</textarea>
<br>
<input type="button" value="go" onclick="go()" style="width:180px">
<input type="button" value="go" onclick="goO()" style="width:180px">
</body>
</html>
В ней две кнопки и два текстарея в которые пишется время по-разному.
Вот код JavaScript-овый:
PHP:
function processReqChange()
{
document.getElementById(nameTarget).innerHTML=stat(req.readyState)+"\n";
try { // Важно!
// только при состоянии "complete"
if (req.readyState == 4) {
// для статуса "OK"
if (req.status == 200) {
// здесь идут всякие штуки с полученным ответом
document.getElementById(nameTarget).innerHTML+=(req.responseText);
} else {
alert("Не удалось получить данные:\n" + req.statusText);
}
}
}
catch( e ) {
alert('Caught Exception: ' + e.description);
}
}
function stat(n)
{
switch (n) {
case 0:
return "не инициализирован"; break;
case 1:
return "загрузка..."; break;
case 2:
return "загружено"; break;
case 3:
return "в процессе..."; break;
case 4:
return "готово"; break;
default:
return "неизвестное состояние";
}
}
Ну и, конечно, создание объекта RequestObject, хотя на него можно и не смотреть, тут всё в порядке:
PHP:
function createRequestObject()
{
if (window.XMLHttpRequest) {
try {
return new XMLHttpRequest();
} catch (e){}
} else if (window.ActiveXObject) {
try {
return new ActiveXObject('Msxml2.XMLHTTP');
} catch (e){}
try {
return new ActiveXObject('Microsoft.XMLHTTP');
} catch (e){}
}
return null;
}
Головной вопрос в том, как разграничить эти два запроса. Когда выполняется один, он ещё не выполнилс до конца, я нажимаю кнопку для запуска второго - тут первый обрывается и начинается второй.
Причина понятна, переменная называется одним именем. Но как сделать так, чтобы функция (или процедура, не знаю как это назвать, параметров ей передавать почему-то нельзя - ошибка) processReqChange() принимала объект нужный и там уже всё что надо с ним вытворяла.
Как передать в эту процедуру параметр? Ей даже скобки нельзя поставить в конце - ошибка.
Вот эта таинственная строка "req.onreadystatechange = processReqChange;"
Не создавать же две функции processReqChange для двух параллельных запросов. Как видно по коду внутри сейчас у неё глобальная переменная req, иначе к ней внутрь не пробраться.
Надеюсь всё чётко объяснил. Целый день пропыхтел с этим делом. В статьях по ажаксу об этом не упоминают, считая это недостойным внимания желом.