Проблема IE Caching разбивает мое поле поиска - PullRequest
1 голос
/ 16 января 2010

Я делаю проект, который использует javascript для получения информации из представления (написанного на Python и с использованием интерфейса Django) на основе текста, который пользователь вводит в поле (запрашивая каждый keyup), а затем отображает эту информацию назад. По сути, это либо отображает «работа не найдена», либо отображает имя, имя пользователя и баланс для этой работы. В Firefox все это прекрасно работает. Я могу ввести JobID, он говорит, что новый идентификатор, и я могу создать работу. Затем я могу сразу же вернуться на страницу и ввести этот идентификатор, и мой поиск возвращает правильную информацию о работе.

Дело в том, что Internet Explorer 8 ленится. Если я набираю идентификатор работы в IE8, мои функции вызывают страницу поиска (/ depos / orglookup /? Q = 123) и получают значение. Так что, если, например, он получит False, я смогу создать новую работу с этим ID. Если я затем вернусь назад и введу тот же номер в это же поле поиска, Internet Explorer не обновит страницу поиска, поэтому он снова вернет false. Если я перехожу на эту страницу поиска, я вижу это ложное значение, но если я обновляю его, я снова получаю правильную информацию. Любая идея о том, как я могу заставить этот запрос каждый раз, когда я набираю в поле поиска, а не как IE ссылаются на кэшированную страницу?

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

Вот код для функции поиска, если это помогает. Это немного грязно, но я не написал, поэтому постараюсь включить все, что уместно:

$("#id_JobID").keyup( 

    function(event){

        //only fire gets on 0-9, kp 0-9, backspace, and delete
        if (event.keyCode in { 96:1, 97:1, 98:1, 99:1, 100:1, 101:1, 102:1, 103:1, 104:1, 105:1,
                                46:1,48:1, 49:1, 50:1, 51:1, 52:1, 53:1, 54:1, 55:1, 56:1, 57:1, 8:1}) 
        {

            if ($("#loadimg").attr("src") != "/static/icons/loading.gif") {
                $("#loadimg").attr("src", "/static/icons/loading.gif");
            }

            if ($("#loadimg").length < 1) {
                $("#id_JobID").parent().append("<img id=loadimg src=/static/icons/loading.gif>");
            }

            clearTimeouts(null); //clear all existing timeouts to stop any running lookups
            GetCounter++; 
            currLoc = window.location.href.slice(window.location.href.indexOf('?') + 1).split('/').slice(-2,-1);

            if (currLoc == 'restorebatch') {
                var TimeoutId = setTimeout(function() {dynamicSearch('restorelookup');}, 400);
            } else {
                var TimeoutId = setTimeout(function() {dynamicSearch('orglookup');}, 400);
            }

            //alert(TimeoutID);
            TimeoutBag[GetCounter] = {
                'RequestNumber': GetCounter,
                'TimeoutId': TimeoutId
            }
        }
    }
);

function clearTimeouts(TimeoutBagKeys) //TimeoutBagKeys is an array that contains keys into the TimeoutBag of Timeout's you want to clear
{
    if(TimeoutBagKeys == null) //if TimeoutBagKeys is null, clear all timeouts.
    {
        for (var i = 0; i < TimeoutBag.length; i++)
        {
           if (TimeoutBag[i] != null) {
            clearTimeout(TimeoutBag[i].TimeoutId);
           }
        }
    }
    else //otherwise, an array of keys for the timeout bag has been passed in. clear those timeouts.
    {
        var ClearedIdsString = "";
        for (var i = 0; i < TimeoutBagKeys.length; i++)
        {
            if (TimeoutBag[TimeoutBagKeys[i]] != null)
            {
                clearTimeout(TimeoutBag[TimeoutBagKeys[i]].TimeoutId);
                ClearedIdsString += TimeoutBag[TimeoutBagKeys[i]].TimeoutId;
            }
        }        
    }
}
function dynamicSearch(viewname) {

        $(".lookup_info").slideUp();


        if ($("#id_JobID").val().length >= 3) {
            var orgLookupUrl = "/deposits/" + viewname + "/?q=" + $("#id_JobID").val();
                getBatchInfo(orgLookupUrl);

        }
        else if ($("#id_JobID").val().length  == 0) {
            $("#loadimg").attr("src", "/static/icons/blank.gif");
            $(".lookup_info").slideUp();
        }
        else {
            $("#loadimg").attr("src", "/static/icons/loading.gif");
            $(".lookup_info").slideUp();
        }
}
function getBatchInfo(orgLookupUrl) {
                $.get(orgLookupUrl, function(data){ 
                    if (data == "False") {
                        $("#loadimg").attr("src", "/static/icons/red_x.png");
                        $(".lookup_info").html("No batch found - creating new batch.");
                        $("#lookup_submit").val("Create");
                        $(".lookup_info").slideDown();
                        toggleDepInputs("on");
                    }
                    else {  
                        $("#loadimg").attr("src", "/static/icons/green_check.png");
                        $("#lookup_submit").val("Submit");
                        $(".lookup_info").html(data);
                        $(".lookup_info").slideDown()
                        toggleDepInputs("off");
                    };
                 });
}

Ответы [ 3 ]

1 голос
/ 16 января 2010

Для этого есть три решения:

Или

  • Используйте $ .post вместо $ .get
  • Добавьте случайный параметр GET к вашему URL, например, «? update = 10202203930489» (конечно, он должен отличаться при каждом запросе)
  • или запретите кэширование на стороне сервера, отправив нужные заголовки (if-modified-since)
0 голосов
/ 16 января 2010

Одна хитрость, которая часто работает, - это добавление временной метки к URL-адресу поиска в качестве параметра строки запроса, таким образом, генерируя уникальный URL-адрес каждый раз, когда выполняется запрос.

var orgLookupUrl = "/ deposit /" + viewname + "/? q =" + $ ("# id_JobID"). val () + "& time =" + new Date (). getTime () ;;

0 голосов
/ 16 января 2010

Вам необходимо сделать URL уникальным для каждого запроса. Отказоустойчивый способ состоит в том, чтобы ввести новый параметр GET, который имеет временную метку в качестве значения - таким образом, URL уникален для каждого запроса, так как временная метка всегда изменяется, поэтому IE не может его кэшировать.

url = "/deposits/orglookup/?q=123&t=" + new Date().getTime()

Таким образом, вместо одного параметра (q) теперь у вас есть два (q и t), но поскольку серверам обычно не нужны дополнительные параметры, все в порядке

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