Как очистить значение переменной javascript? - PullRequest
2 голосов
/ 25 июня 2009

Я использую javascript var для управления выполнением вызова ajax. Вызов запускается из события щелчка (на «# week _tag» div) и должен выполняться только один раз для загрузки страницы. Это же событие щелчка также переключает отображение скользящей панели ("#week_summary"), где отображаются данные из вызова ajax.

В приведенном ниже примере я пытаюсь использовать переменную и оператор if, чтобы запретить вызов ajax при вызове, когда пользователь нажимает «# week _tag» во второй раз, чтобы закрыть скользящую панель. Состояние var устанавливается на «before» при загрузке страницы и на «after» после вызова ajax. Если состояние var равно "before", вызов выполняется, иначе просто # переключается "#week_summary". Это не работает, потому что я не знаю, как дать var "status" второе значение "after". Есть идеи?

$(document).ready(function(){
    var status = "before";
    alert("before:"+status);

    $('#week_tag').click(function(){
        if(status =="before"){
            alert("afterclick:"+status);
            var form_date_set = $("input[name='date_set']").val();

            $.post("/tortus/index.php/daylog/build_summary",
                {date_set:form_date_set}, 
                function(html){
            $("#week_summary").html(html);

            var status = "after";
            });
        }

        $('#week_summary').toggle('blind');

        alert("after:"+status);

        });

     });

Ответы [ 2 ]

4 голосов
/ 25 июня 2009

Это потому, что вы объявляете новую переменную внутри функции обратного вызова, присваивая ей локальную область видимости. Если вы удалите var из функции обратного вызова, она должна работать как положено.

 $.post("/tortus/index.php/daylog/build_summary",
            {date_set:form_date_set}, 
            function(html){
               $("#week_summary").html(html);

               status = "after";
               alert("status: " + status);
        });

РЕДАКТИРОВАТЬ: И, конечно, как указано в комментарии ниже, так как вызов асинхронный, вам также нужно будет предупредить о состоянии обратного вызова. Или создайте новое событие onclick для некоторого случайного элемента, который будет просто отображать статус:

$(document).ready({
   var status = "before"
   ...
   //your previous onclick event here
   ...
   $("#newElm").click(function() {
      alert("status: " + status);
   });
});
2 голосов
/ 25 июня 2009

Если вы хотите, чтобы ваш обработчик кликов запускался только один раз, используйте метод .one для привязки вашего обработчика. Это гарантирует, что он будет вызван только один раз, поскольку ваш обработчик автоматически отключается по мере того, как происходит событие, непосредственно перед запуском вашего кода. См. .one документацию на docs.jquery.com.

Пример использования:

$('#week_tag').one('click', function() {
    // This code will only be run once, after #week_tag got clicked on.  
});

Используя этот метод, вам вообще не нужно отслеживать состояние, jQuery позаботится об этом за вас.

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