Ajax-вызов не отвечает на повторный запрос - PullRequest
0 голосов
/ 16 марта 2009

У меня есть страница с раскрывающимся списком. Событие onchange вызывает функцию Javascript (ниже), которая включает в себя блок Ajax, который извлекает данные и заполняет TEXTAREA. На поверхности все работает.

Я могу выбрать любой элемент в списке без проблем. Однако, если я выбираю элемент, который был ранее выбран, вызов Ajax кажется зависшим. Похоже, какая-то странная проблема с кэшированием или что-то в этом роде. Если я закрою браузер и перезагрузлю страницу, все элементы будут работать снова, пока я не выберу снова.

Я проверял свойства readyState и status, когда он зависает, но ничего не получаю. Я что-то упустил?

Страница является клиентским проектом за аутентификацией, поэтому я не могу опубликовать URL, но вот код Ajax. Это на странице PHP, но с этим не связан ни один скрипт PHP.

function getText( id ) {
var txt = document.getElementById( "MyText" );

txt.disabled = "disabled";
txt.innerText = "";
txt.className = "busy";

var oRequest = zXmlHttp.createRequest();
oRequest.open( "get", "get_text.php?id=" + id, true );
oRequest.send( null );

oRequest.onreadystatechange = function() {
    if( oRequest.readyState == 4 ) {
        if( oRequest.status == 200 ) {
            txt.innerText = oRequest.responseText;
        } else {
            txt.innerText = oRequest.status + ": " + oRequest.statusText;   
        }

        txt.disabled = "";
        txt.className = "";

        oRequest = null;
    }
}}

Редактировать: Кодовый блок кажется немного странным; он не позволит мне включить окончательный }, если он не совпадает с предыдущим.

Ответы [ 3 ]

1 голос
/ 16 марта 2009

Вы устанавливаете функцию onreadystatechange после , когда отправляете запрос. Если это займет много времени (т. Е. Если он попадет на сервер), это, вероятно, сработает, поскольку перед попыткой обратного вызова будет задержка.

Однако, если страница кэшируется, браузер, вероятно, пытается немедленно вызвать onreadystatechange в методе send. Переместите свое назначение на onreadystatechange до кода open/send.

1 голос
/ 18 марта 2009

HI, Кэширование происходит из-за того же URL, который вызывается повторно. Если вы изменяете URl динамически, тогда эта проблема может быть решена. Примерно так: добавив строку запроса с текущим временем с запросом (или любым случайным переопределенным числом), вы можете изменить URL, не влияя на результат

0 голосов
/ 16 марта 2009

Я предполагаю, что вы столкнулись с проблемой кеширования. Я заметил, что Internet Explorer более агрессивен в кэшировании ajax-вызовов, чем Firefox. Один из способов быть уверенным в том, что происходит, - использовать Fiddler2. Это приложение отслеживает ваш веб-трафик, и вы сможете увидеть, отправляет ли браузер запрос или нет, и какие заголовки кэша возвращаются на ответы, которые вы получаете.

Вы можете скачать fiddler2 с http://www.fiddlertool.com/fiddler/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...