0

これを説明するのは難しいので、私は最善を尽くします。

.remove()を使用してjavascript関数が繰り返されないようにすることは可能ですか?

働き

function readytouseCard() {
    console.log(this);
    $('.cardCVV input[name=cvv1]').keyup(function () {
        console.log("s");
        var checkCVV = $('.cardCVV input[name=cvv1]').filter(function () {
            return $.trim(this.value).length < 3;
        }).length === 0;
        if (checkCVV) {
            $("li.checkCode").addClass("checked");
        } else {
            $("li.checkCode").removeClass("checked");
        }
        checklistCheck();
    });

    function checklistCheck() {
        var counting = $("li.checked:not(.title)").length;
        if (counting == 6) {
            console.log(counting);
            $("input[name=purchase]").attr("disabled", false);
            $("input[name=purchase]").removeClass("purchase-btn-disabled");
            $("input[name=purchase]").addClass("purchase-btn");

        } else {
            $("input[name=purchase]").attr("disabled", true);
            $("input[name=purchase]").removeClass("purchase-btn");
            $("input[name=purchase]").addClass("purchase-btn-disabled");
        }
    }
}

メイン

$("li#usercurrentcc").click(function (e) {
    e.preventDefault();
    var selectedID = $(this).attr("data-id");
    var qString = 'selectedID=' + selectedID;
    $.post('/assets/inc/get-logged-info-card.php', qString, function (results) {
        if ($("#usercurrentccbox, #addnewccbox").length != 0) {
            $("#usercurrentccbox, #addnewccbox").fadeOut("fast", function () {
                $(this).remove();
                $("<div class='creditCardDetails' id='usercurrentccbox'><div class='creditCard'><div class='cardChoice'><span>Choose Card Type</span><input name='cctype1' type='radio' value='V' class='lft-field' id='visa' /><label for='visa'></label><input name='cctype1' type='radio' value='M' class='lft-field' id='mastercard' /><label for='mastercard'></label><input name='cctype1' type='radio' value='A' class='lft-field' id='amex' /><label for='amex'></label></div><!--cardChoice--><div class='cardNumber'><input name='ccn1' id='ccn' type='text' class='long-field' value='" + results[0].maskccn + "' maxlength='19' readonly /></div><div class='cardCVV'><input name='cvv1' id='cvv' type='text' maxlength='5' class='small-field' /></div><div class='creditCardName'><input name='ccname1' id='ccname' type='text' class='long-field' value='" + results[0].ccname + "' readonly/></div><div class='cardDate'><input name='exp11' id='exp1' type='text' maxlength='2' class='small-field' value='" + results[0].ccm + "' readonly /><input name='exp21' id='exp2' type='text' maxlength='4' class='small-field' value='" + results[0].ccy + "' readonly /></div></div><!--creditCard-->").insertAfter("#paymentCardChoice");
                $('#usercurrentccbox .cardChoice input#' + results[0].cct + '').attr("checked", true);
                $('#usercurrentccbox .cardChoice label').removeClass("active");
                $('#usercurrentccbox .cardChoice label[for="' + results[0].cct + '"]').addClass("active");
                $("li:not(.title,.checkCode)").addClass("checked");
            });
            readytouseCard();
        } else {
            $(".submit-btn").fadeIn();
            $("<div class='creditCardDetails' id='usercurrentccbox'><div class='creditCard'><div class='cardChoice'><span>Choose Card Type</span><input name='cctype1' type='radio' value='V' class='lft-field' id='visa' /><label for='visa'></label><input name='cctype1' type='radio' value='M' class='lft-field' id='mastercard' /><label for='mastercard'></label><input name='cctype1' type='radio' value='A' class='lft-field' id='amex' /><label for='amex'></label></div><!--cardChoice--><div class='cardNumber'><input name='ccn1' id='ccn' type='text' class='long-field' value='" + results[0].maskccn + "' maxlength='19' readonly /></div><div class='cardCVV'><input name='cvv1' id='cvv' type='text' maxlength='5' class='small-field' /></div><div class='creditCardName'><input name='ccname1' id='ccname' type='text' class='long-field' value='" + results[0].ccname + "' readonly/></div><div class='cardDate'><input name='exp11' id='exp1' type='text' maxlength='2' class='small-field' value='" + results[0].ccm + "' readonly /><input name='exp21' id='exp2' type='text' maxlength='4' class='small-field' value='" + results[0].ccy + "' readonly /></div></div><!--creditCard-->").insertAfter("#paymentCardChoice");
            $('#usercurrentccbox .cardChoice input#' + results[0].cct + '').attr("checked", true);
            $('#usercurrentccbox .cardChoice label').removeClass("active");
            $('#usercurrentccbox .cardChoice label[for="' + results[0].cct + '"]').addClass("active");
            $("li:not(.title,.checkCode)").addClass("checked");
        }
        readytouseCard();
    }, "json");
});
readytouseCard();

この機能は最初のクリックで開始して機能しますが、その後は機能しなくなります。コンソールログにはウィンドウ#が表示され、もう一度クリックするとウィンドウ#ウィンドウ#が表示されます。

だから私は.remove()を使用して関数readytouseCard()を強制終了する方法があることを望んでいました。

前もって感謝します

4

3 に答える 3

0

これはグローバルです。つまり、ウィンドウからアクセスできます。

window.readytouseCard() = function(){
  return false;
}

return false;これで、を模倣する関数の内容が置き換えられましたnothing happening

于 2012-06-26T14:21:28.973 に答える
0

関数を「削除」することはできません。たとえば、関数をオーバーライドするだけですreadytouseCards = function(){}

しかし、私にはわかりません、なぜあなたはそれをしたいのですか。また、関数の最初の行にあるため、コンソールのログWindowは正しいです。グローバルコンテキストからconsole.log(this);呼び出すため、はにバインドされます。readytouseCardsthiswindow

実際の問題は、内にイベントハンドラーをアタッチすることです readytouseCards()したがって、関数を2回呼び出すと、イベントハンドラーが2回アタッチされます。これにより、checklistCheck()キーアップごとに2回呼び出されます。これは、コンソールのログ記録によってwindow2回示されます。

コード全体をリファクタリングする必要があります。

.on()jQuery on() )を使用して最初にイベントハンドラーを1回アタッチし、後でdomに追加された要素にもイベントハンドラーがアタッチされるようにします。

$(document).on('keyup', '.cardCVV input[name=cvv1]', function () { ... }

readytouseCard()そして、それから移動することによって関数を殺しchecklistCheck()ます。最後に、readytouseCard();呼び出しを省略します。

于 2012-06-26T14:22:21.600 に答える
0

コードを再インデントしました。ご覧のとおり#usercurrentccbox, #addnewccbox、Ajaxリクエストの後に見つかった場合、関数は2回呼び出されます。最初のものを削除するだけです。

一度実行された後にイベントリスナーを自動的に削除したい場合は、jQueryが提供します.one()

関数を削除することはできません。関数が呼び出されるたびに識別子によって決定される場合は、その変数を別の関数で上書きできる可能性があります。ただし、関数への参照がアクセスできない変数に格納されている場合、たとえばイベントリスナーとして追加されている場合は、機能しません。次に、コーディングする必要があります。

var called = false;
function executeOnlyOnce(...) {
    if (called) return;
    called = true;
    ...
}
于 2012-06-26T14:22:28.290 に答える