[Closed] [JS] Странное поведение

Bird_V

Пытаюсь побороть странное поведение скрипта. Имеем следующий код:
test.html

<html>
<script type="text/javascript" src="rep.js"></script>
<body>
<span id="rep1">0</span><span id="fr_votes_1">#<span id="fr_votes_1_r">***</span></span><img src="error.gif" onclick="javascript:rep(1)"><br/>
<span id="rep2">1</span><span id="fr_votes_2">#<span id="fr_votes_2_r">***</span></span><img src="error.gif" onclick="javascript:rep(2)"><br/>
</body>
</html>

test2.php

<?php
if ($_GET['action'] == 'rep')
echo '#'.$_GET['pid'];
if ($_GET['action'] == 'showrep')
echo '@'.$_GET['pid'];
?>

rep.js ->
Что наблюдается: после нажатия на (скажем) верхний воскл. знак всё происходит как положено - меняется содержимое первой строки. Однако если после этого (не перезагружая страницу) нажать на нижний воскл. знак - то поменяется вторая строка, а в первой навеки повиснет индикатор загрузки.
Вопрос: почему так происходит и как этого избежать?
Примечание: в общем случае таких строк может быть и не две, а много

Big_Den

Однако если после этого

Уверен,что после,а не во время?
Если нажать на вторую картинку до того,как придёт ответ для первой,то отправится второй запрос,а первый больше работать не будет,т.к. нельзя вызывать одновременно больше одного. Поведение как раз похожее

dedwowan

осле,а не во время?
Если нажать на вторую картинку до того,как придёт ответ для первой,то отправится второй запрос,а первый больше работать не будет,т.к. нельзя вызывать одновременно больше одного. Поведение как раз похожее
Работать он будет, но у него для всех потоков используется переменная ajaisplay, которая при каждом клике переопределяется. Соответственно при клике на верхнюю - пошел запрос для первой строки, тут же кликаешь на вторую - переменная переопределилась и все изменения пишутся во вторую строку.
Собственно - передавай полностью ссылку на объект при вызове функции, либо создавай новый тип объекта и под каждый вызов делай его экземпляр, тогда переменные пересекаться не будут.

Bird_V

Не-а, не сразу же. Я дожидаюсь, пока в первой строке значение поменяется, и только потом вторую трогаю. Что характерно - в коде стоят отладочные выдачи (для firebug-овской консоли) при входе в обработчик onClick и statechanged - и вот что я вижу:

dedwowan

Замени код на
 
function rep(pid)
{
var ajaisplay = "rep"+(pid.toString;

if(xmlhttp)
{
var queryString = "&pid="+(pid.toString;
document.getElementById(ajaisplay).innerHTML = '<img src="spinner.gif" />';
xmlhttp.open("GET", "test2.php?action=rep"+queryString, true);
xmlhttp.onreadystatechange= function
{
if(xmlhttp.readyState==4)
{
console.log("Rep - div %s: Done", ajaisplay);
document.getElementById(ajaisplay).innerHTML = xmlhttp.responseText;
showrep(pid);
xmlhttp.abort;
//ajaisplay = '';
}
else
{
console.log("Rep - div %s: Wait"+xmlhttp.readyState, ajaisplay);
}
}
xmlhttp.send(null)
}

}


И покажи лог.

Bibi

в двух словах:
если перенести .open после определения коллбека и поставить прямо перед .send, то аномалий не будет.
аномалии так и останутся аномалиями, если автор кода не прочтет, что такое onreadystatechange.
что делать:
1) не писать код, смысл которого не понятен до конца
2) не писать код, как будто это 2005й год
3) читать

Bird_V

, спасибо, теперь работает.

Bird_V

Не бейте меня, дяденька, я ещё не волшебник - я только учусь. За советы спасибо, конечно, но что Вы имели в виду под
не писать код, как будто это 2005й год
?

Bibi

почитай свои логи внимательно после этого исправления (предложенного философом).
или вместо console.log("Rep - div %s: Wait", ajaisplay);
воткни alert( 'я сейчас работаю с ' + ajaisplay )

Bird_V

Вот:

Немного поправил test*.php (поменял выдаваемый текст, иначе браузер не мог дождаться конца ответа - # в HTML есть служебный символ).
Тема закрыта
Оставить комментарий
Имя или ник:
Комментарий: