команда ajax onclick извлекает устаревшие данные


Я пишу веб-страницу, которая использует [то, что я считаю] 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" и вызвать функцию measurementEntered. Затем функция measurementEntered должна обновить область с помощью новой кнопки "ОК", готовой извлекать данные из нового текстового поля "Select4". Однако при повторном нажатии на нее вызывается measurementEntered с исходным значением из Select4. Есть какие-нибудь идеи?

Спасибо.

Author: BCarpe, 2011-02-28

5 answers

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

Решение 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.ответ на загрузку из кэша

 5
Author: emaillenin, 2017-05-23 12:16:21

Если вы добавите дату и время к своему 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;
}
 3
Author: jnoreiga, 2011-02-28 19:38:09

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

 2
Author: Malfist, 2011-02-28 19:15:17

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

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

 2
Author: steveo225, 2011-02-28 19:22:36

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

 0
Author: logic-unit, 2011-02-28 20:10:11