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();

该功能在第一次单击时启动并工作,但之后它不再工作。控制台日志只显示Window #,当我再次单击时它显示Window # Window #

所以我希望有一种方法可以使用 .remove(); 杀死函数 readytouseCard();

提前致谢

4

3 回答 3

0

它是全局的,这意味着我们可以通过窗口访问它。

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

现在我们已经完成了,函数内容已被替换为return false;which will mimic nothing happening

于 2012-06-26T14:21:28.973 回答
0

您不能“删除”函数,只能覆盖它们,例如readytouseCards = function(){}.

但是我不明白,你为什么要那样做。控制台日志记录Window是正确的,因为您console.log(this);在函数的第一行。由于您readytouseCards从全局上下文中调用,this因此绑定到window.

您的实际问题是您在 readytouseCards(). 因此第二次调用该函数会附加事件处理程序两次。这导致在checklistCheck()每个 keyup 上被调用两次。这由您的控制台记录window两次来指示。

您需要重构整个代码:

在开始时通过.on()jQuery on())附加事件处理程序一次,以便稍后添加到 dom 的元素也附加事件处理程序。

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

readytouseCard()并通过将其移checklistCheck()出来终止该功能。最后,省略readytouseCard();调用。

于 2012-06-26T14:22:21.600 回答
0

我已经重新缩进了你的代码。正如你现在看到的,当#usercurrentccbox, #addnewccboxAjax请求后发现有,该函数会被调用两次。只需删除第一个。

如果您想在事件侦听器执行一次后自动删除它,jQuery 提供.one().

您不能删除函数。如果函数在每次调用时都由标识符确定,则您可以使用不同的函数覆盖该变量。但是,当对函数的引用存储在不可访问的变量中时,例如添加为事件侦听器时,这将不起作用。然后你需要编码:

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