2009-06-25 5 views
2

私はjavascript varを使ってajax呼び出しの実行を制御しています。コールはクリックイベント(「#week _tag」div)からトリガーされ、1ページのロードごとに1回だけ実行する必要があります。同じクリックイベントは、ajax呼び出しからのデータが表示されるスライディングペイン( "#week_summary")の表示を切り替えます。javascript変数の値をクリアするには?

次の例では、ユーザーが「#week _tag」divを2回クリックしてスライドペインを閉じると、ajax呼び出しが呼び出されないように変数とifステートメントを使用しようとしています。 varステータスは、ページが読み込まれるときに「before」に設定され、ajax呼び出しが行われると「after」に設定されます。 varのステータスが "before"に等しい場合、呼び出しが実行されます。そうでなければ、 "#week_summary"はちょうどトグルされます。私はvar "status"に "after"の第2の値を与える方法がわからないので動作しません。何か案は?

$(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:そしてもちろんの呼び出しは非同期であるため、以下のコメントで述べたように、あなたにも、コールバックのステータスを警告する必要があります。

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

それで解決できないと思います。問題は、クロージャの外側で変更された場合でも、クロージャが作成されたときにバインドされた値を「ステータス」が保持することです。 – KaptajnKold

+0

また、ajax呼び出しはasynchなので、警告は常に前になります。 – redsquare

+0

@KaptajnKold:変数はajax関数クロージャの外側で作成されるため、document.ready関数内のすべての関数で使用できるようになります。 – peirix

2

あなたのクリックハンドラは一度だけ実行したい場合は、あなたのハンドラをバインドする.oneメソッドを使用します。あるいは単にステータスが表示されますいくつかのランダムな要素、上の新しいonclickのイベントを作成します。これは、コードが実行される直前に、イベントが発生したときにハンドラが自動的に解除されるため、一度しか呼び出されないことを保証します。 docs.jquery.comの.one documentationをご覧ください。

使用例:

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

あなたがすべてで状態を追跡する必要はありません。この方法を使用するには、jQueryのはあなたのために、このの世話をします。