2011-07-05 14 views
2

奇妙な質問、私は知っています。私に説明させてください。1回または何回でも実行できるメソッドを作成するにはどうすればよいですか?メソッドが呼び出されたときにロジックが1回だけ実行されるようにしますか?

私はチェックボックスの変更を処理するために使用されるjavascript/jquery関数を持っています。

$("input[type='checkbox'].option").change(function() { 
    if ($(this).is(":checked")) { 
     $("div.special").removeClass("red"); 
    } 
    else { 
     $("div.special").addClass("red"); 
    } 

    // I only want to call this after all the checkbox event have been handled 
    updateNumRedDivs(); 
}); 

function updateNumRedDivs() { 
    alert($("div.special.red").length+"red DIVs found"); 
} 

は、個々のチェックボックスのいずれかである今、チェックボックスハンドラを呼び出すことができます - (これは単なる擬似コードでFYI、私は実際に赤の行数を取得しようとしていないよ)ここではいくつかの擬似コードです(明らかに)クリックされたとき、または「すべて選択」チェックボックスが呼び出された別の:私は、これは理にかなって願っています

$(".myForm .selectAllCheckbox").change(function() { 
    var $checkboxes = $(this).closest("form").find("input[type='checkbox'].option"); 

    if ($(this).attr("checked")) { 
     $checkboxes.each(function() { 
      if (!$(this).attr("checked")) 
       $(this).attr("checked", "checked").change(); 
     }); 
    } 

    updateNumRedDivs(); 
}); 

。ありがとう。

+0

私はまだ混乱しているんです。何が問題なのですか? – sdleihssirhc

+0

は、私は彼が、彼は結局 'change'メソッドが呼び出される実行しようと、いくつかの関数' updateNumRedDivs'を持っている...私は彼が何を意味するのかを考え出したと思います。これは1つの 'checkbox'が変更された後、実行されるべきであることを意味するか、または束全体がプログラム的に変更されることを意味するかもしれませんが、すべてが変更された後にのみ関数を呼び出すことを望みます。 –

答えて

0

は、ここで私が思いついた解決策だ - きれいではありませんが、それは仕事を取得します:基本的に

$(".myForm input[type='checkbox']").change(function() { 
    if ($(this).hasClass("selectAllCheckbox") { 
     var $checkboxes = $(this).closest("form").find("input[type='checkbox'].option"); 

     if ($(this).attr("checked")) { 
      $checkboxes.each(function() { 
       if (!$(this).attr("checked")) 
        $(this).attr("checked", "checked").change(); 
      }); 
     } 
    } 
    else { 
     if ($(this).is(":checked")) { 
      $("div.special").removeClass("red"); 
     } 
     else { 
      $("div.special").addClass("red"); 
     } 
    } 

    updateNumRedDivs(); 
}); 

function updateNumRedDivs() { 
    alert($("div.special.red").length+"red DIVs found"); 
} 

、私は1つの変更ハンドラに統合され、それが再帰ました。

1

ただ一度実行したい場合は、関数の下部にある参照を破棄してください。

var updateNumRedDivs = function() { 
    // ... actual handling here 
    updateNumRedDivs = function(){}; 
} 

複数回は、私のような、クロージャを使用したいので、

// This will run five times, before destroying 
var updateNumRedDivs = function(amount) { 
    var calls = 0; 
    return function() { 
     // handle event 
     if (++calls === amount) updateNumRedDivs = function() {}; 
    }; 
}(5) 

編集:
が一度に実行機能や、任意の回数であなたの意図を誤解している可能性があります。すべてのソースから1回しか実行されない機能、または総コール数に制限されない機能を探していますか?n単一のソースからの呼び出し?

+0

+1私はそのタイトルに言葉で表現として、これは完全に質問に答えると思うが、詳細な質問テキストおよびサンプルコードに基づいて、私は要件が少し異なっている疑いがある(しかし、私は本当の要件を理解していない)ため。 – nnnnnn

3

個々のチェックボックス変更ハンドラのロジックを2つの機能に分けます。そして、全ての選択のために、ちょうどむしろchange()を呼び出すよりも、あなたがしたい関数を呼び出す:あなたが選択したときに

function changeHandler(chkBox) { 
    if (chkBox.is(":checked")) { 
     $("div.special").removeClass("red"); 
    } 
    else { 
     $("div.special").addClass("red"); 
    } 
} 
$("input[type='checkbox'].option").change(function() { 
    changeHandler($(this)); 
    updateNumRedDivs(); 
}); 

function updateNumRedDivs() { 
    alert($("div.special.red").length+"red DIVs found"); 
} 

$(".myForm .selectAllCheckbox").change(function() { 
    var $checkboxes = $(this).closest("form").find("input[type='checkbox'].option"); 

    if ($(this).attr("checked")) { 
     $checkboxes.each(function() { 
      if (!$(this).attr("checked")) 
       changeHandler($(this).attr("checked", "checked")); 
     }); 
    } 

    updateNumRedDivs(); 
}); 
0

を使用すると、1つのチェックボックスのChangeイベントを望んでいないコード よしのあまり解雇すべて選択チェックボックスSelectALLCheckBoxのハンドラで

var SelectALLFired=false; 

は真SelectALLFired =の値を確認します。完了時に値をSelectALLFired = falseに戻します。シングルのCheckBoxの変更機能に

何Ifステートメントを書く

if(!SelectALLFired) 
{ 
Your Code 
} 

$(".myForm .selectAllCheckbox").change(function() { 
SelectALLFired=true; 
var $checkboxes = $(this).closest("form").find("input[type='checkbox'].option"); 

if ($(this).attr("checked")) { 
    $checkboxes.each(function() { 
     if (!$(this).attr("checked")) 
      $(this).attr("checked", "checked").change(); 
    }); 
} 
    SelectALLFired = false; 

updateNumRedDivs(); 

})

$("input[type='checkbox'].option").change(function() { 
if(!SelectALLFired) 
{ 
    if ($(this).is(":checked")) { 
     $("div.special").removeClass("red"); 
    } 
    else { 
     $("div.special").addClass("red"); 
    } 
} 
// I only want to call this after all the checkbox event have been handled 
updateNumRedDivs(); 
}); 
0

を行う前に、私はtriggerを通じて変更イベントに余分のparamsを渡すことによってそれを行うだろう。

注:アイデアを説明するためにダウンしてください。基本的には

http://jsfiddle.net/bnWVd/

function doit(){ 
    alert("done"); 
} 

$("input").click(function(event,extraParams){ 
    // do stuff 
    if(extraParams && extraParams.noAlert){ 
     // do nothing or maybe something else 
    }else{ 
     doit(); 
    } 
}); 

$("button").click(function(){ 
    $("input").each(function(){ 
     $(this).trigger("click",{noAlert: true}); 
    }); 

    doit(); 
}); 

、私はそれが余分な機能を実行しないように知らせるイベントにパラメータを渡すループ内で呼び出されます。それでループが終わると、私はそれを直接呼びます。パラメータが渡されない場合、呼び出されます。

関連する問題