0

2つの機能を切り替えようとしています。ユーザーが一時停止ボタンをクリックすると、入力フィールドが無効になり、ラベルのテキストが灰色に変わり、ボタンが別の画像に変わります。.toggle() を使用できると思っていましたが、2 つの関数をどちらも動作させることができませんpauseEmailChannel();。トグル クリックで両方ではなく、最初の 1 つの関数のみが実行されます ( )。ここ SOで偶数/奇数クリック検出スクリプトを見つけましたが、クリックイベントでこれら2つの機能を「切り替え」ているわけではありません。私のコードは醜いコードかもしれませんが、私はまだ学んでおり、正しいか間違っているかを示したいと思っています。とにかく、誰かがこれを行う方法の解決策を教えてもらえますか? そんなに難しいとは思いませんでしたが、行き詰まっています。ありがとう。

HTML

jQuery

      $(".btn_pause").click(function(){
    var count = 0;
        count++;
    //even odd click detect 
    var isEven = function(num) {
        return (num % 2 === 0) ? true : false;
    };
    // on odd clicks do this
    if (isEven(count) === false) {
        pauseEmailChannel(); 
    }
    // on even clicks do this
    else if (isEven(count) === true) {
        restoreEmailChannel(); 
    }
     });


    // when user clicks pause button - gray out/disable     
function pauseEmailChannel(){   
        $("#channel-email").css("color", "#b1b1b1");
        $("#notify-via-email").attr("disabled", true);
        $("#pause-email").removeClass("btn_pause").addClass("btn_disable-pause");
}



// when user clicks cancel button - restore default
function restoreEmailChannel(){
        $("#channel-email").css("color", "#000000");
        $("#notify-email").attr("disabled", false);
        $("#pause-email").removeClass("disable-pause").addClass("btn_pause");
        $("input[value='email']").removeClass("btn_disable-remove").addClass("btn_remove");
}
4

2 に答える 2

1

count変数は、クリックされるたびに初期化され、設定されます0.btn_pause変数をより高いスコープに移動する必要があります。

例えば、

$(".btn_pause").each(function(){
    var count = 0;
    $(this).click(function(){
        count++;
        ...
    });
});

この方法では、一度だけ初期化され、イベント ハンドラーcountでアクセスできます。click


別の方法として、次のものも使用できます。

$(".btn_pause").each(function(){
  var count = 0;
  $(this).click(function(){
    [restoreEmailChannel, pauseEmailChannel][count = 1 - count]();
  });
});

前の構成が抽象的すぎる場合、より冗長なものは次のようになります。

$(".btn_pause").each(function(){
  /* Current element in the array to be executed */
  var count = 0;
  /* An array with references to Functions */
  var fn = [pauseEmailChannel, restoreEmailChannel];
  $(this).click(function(){
    /* Get Function from the array and execute it */
    fn[count]();
    /* Calculate next array element to be executed.
     * Notice this expression will make "count" loop between the values 0 and 1.
     */
    count = 1 - count;
  });
});
于 2013-01-23T19:06:18.390 に答える
1

このコードを試してください。偶数の場合と奇数の場合に間違いを犯す可能性があることを除けば、問題なく動作するはずですが、修正は簡単です。

  $(".btn_pause").click(function(){
    var oddClick = $(this).data("oddClick");
    $(this).data("oddClick", !oddClick);
    if(oddClick) {
        pauseEmailChannel(); 
    }
    else {
        restoreEmailChannel(); 
    }
  });
于 2013-01-23T19:06:45.267 に答える