команда ajax onclick вытягивает устаревшие данные - PullRequest
2 голосов
/ 28 февраля 2011

Я пишу веб-страницу, которая использует [то, что я считаю] AJAX так, чтобы можно было вводить данные в текстовое поле, нажимать поле «ОК», сохранять данные в базе данных и повторно загружать областьсодержит текстовое поле и кнопку «ОК», а также некоторые другие данные на основе введенных данных.Поскольку он работает сейчас, процесс отлично работает с первой записью, но если вы попытаетесь ввести информацию снова, он будет вести себя так, как если бы исходное значение было введено снова:
Пример:

Ввод пользователя: 5
Страница ведет себя так, как если бы ввод был: 5
Пользовательский ввод: 4
Страница ведет себя так, как если бы ввод был: 5
Пользовательский ввод: 3
Страница ведет себя так, как если бы ввод был: 5

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

echo "<table>";  
    // ...Other stuff which I don't think is involved in the problem, though I've been wrong before...   
echo "<tr>";  
echo "<td>";  
echo "<div id=\"measurements\">";  
    // Filled by javascript functions below  
echo "</div>";  
echo "</td>";  
echo "</tr>";  
echo "</table>";  

СледующееФункция javascript доступна и вызывается при загрузке страницы:

function measurementEntered(pid, vid, oid, varn, dat) {  
    // Create XMLHttpRequest object  
    var xmlhttp;  
    if(window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }  
    else {  
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");  
    }  

    xmlhttp.open("GET", "ajax_measurements_update.php?varn="+varn+"&pid="+pid+"&vid="+vid+"&oid="+oid+"&dat"+dat+"&user="+user, false);
    xmlhttp.send();
    document.getElementById("measurements").innerHTML=xmlhttp.responseText;
}

А страница ajax_measurements_update.php содержит следующий код для ввода данных и обновления области (есть также некоторый код для добавления дополнительной информации кобласть, но я не думаю, что это вызывает проблему. Если вы подозреваете, что это может, я могу опубликовать больше):

echo "<input type=\"text\" id=\"Select4\" name=\"dat\" size=\"20\" />";

и

echo "<button type=\"button\" onclick=\"measurementEntered($pid, $vid, $oid, $varn, Select4.value);\" />OK</button>";  

Так должно быть, после нажатиякнопку "ОК", потянитеПолучите данные из текстового поля «Select4» и вызовите функцию measureEntered.Затем функция measureEntered должна обновить область с помощью новой кнопки «ОК», готовой для извлечения данных из нового текстового поля «Select4».Однако при повторном щелчке по нему, MeasureEntered вызывается с исходным значением из Select4.Есть идеи?

Спасибо.

Ответы [ 5 ]

5 голосов
/ 28 февраля 2011

Ваш веб-браузер кэширует последовательные запросы. Вот почему вы получаете ожидаемые результаты в первом запросе и одинаковые результаты во всех последовательных запросах.

Решение 1 -

Чтобы отключить кеш, добавьте следующую информацию заголовка в ajax_measurements_update.php

header("cache-control: no-cache");

Решение 2 -

Измените URL-адрес вашего запроса на следующий (добавьте параметр времени в конце, чтобы ваш браузер считал, что это новый URL-адрес, поэтому не будет загружаться из кэша)

xmlhttp.open("GET", "ajax_measurements_update.php?varn="+varn+"&pid="+pid+"&vid="+vid+"&oid="+oid+"&dat"+dat+"&user="+user+"&temp="+(new Date()).getTime(), false);

Решение 3 -

Достойная альтернатива - перейти на jQuery. Добавьте следующий код в функцию готовности документа, чтобы отключить кэш во всех запросах.

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});

Связано с - Остановить кеширование ответа jQuery .load

3 голосов
/ 28 февраля 2011

если вы добавите дату и время в ваш URL, он никогда не будет кешироваться.

function measurementEntered(pid, vid, oid, varn, dat) {  
    // Create XMLHttpRequest object  
    var xmlhttp;  
    if(window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }  
    else {  
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");  
    }  

    var currentTime = new Date();
    xmlhttp.open("GET", "ajax_measurements_update.php?varn="+varn+"&pid="+pid+"&vid="+vid+"&oid="+oid+"&dat"+dat+"&user="+user+"&dt="+currentTime.getTime(), false);
    xmlhttp.send();
    document.getElementById("measurements").innerHTML=xmlhttp.responseText;
}
2 голосов
/ 28 февраля 2011

Вы также можете добавить заголовки к любому файлу PHP, который вы не хотите, чтобы браузер кэшировал:

header('Cache-Control: no-cache, must-revalidate'); инструктирует браузер не кэшировать header('Expires: Tue, 1 Jan 2010 12:00:00 GMT'); также добавляет дату истечения в прошлом

2 голосов
/ 28 февраля 2011

Результаты, вероятно, кэшируются.Попробуйте отключить кэш для своего запроса AJAX или добавить уникальное значение GET (например, метку времени) в запрос AJAX.

0 голосов
/ 28 февраля 2011

Звучит как неправильный SQL для меня.Какой код вы используете для запроса данных из базы данных?

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