2009-06-25 2 views
2

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

В приведенном ниже примере я пытаюсь использовать переменную и оператор if, чтобы запретить вызов ajax от вызова, когда пользователь нажимает кнопку «#week _tag» во второй раз, чтобы закрыть панель скольжения. Статус var устанавливается на «before», когда страница загружается, и после вызова 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); 

     }); 

    }); 

ответ

4

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

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

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

EDIT: И, конечно же, как указано в комментарии ниже, поскольку вызов асинхронный, вам нужно будет оповещать статус на обратный вызов, а также. Или создать новый OnClick событие на какой-то случайный элемент, который просто отображает статус:

$(document).ready({ 
    var status = "before" 
    ... 
    //your previous onclick event here 
    ... 
    $("#newElm").click(function() { 
     alert("status: " + status); 
    }); 
}); 
+0

Это не решит, я считаю. Проблема в том, что «статус» будет поддерживать любое значение, с которым оно связано, когда было создано закрытие, даже когда оно изменяется вне закрытия. – KaptajnKold

+0

также вызов ajax является асинхронным, поэтому предупреждение всегда будет до – redsquare

+0

@ KaptajnKold: поскольку переменная создается за пределами закрытия функции ajax, она будет доступна для всех функций внутри функции document.ready. – peirix

2

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

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

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

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

Смежные вопросы