2012-06-26 136 views
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(); 

功能開始工作,並在第一次點擊後,但它不工作了。控制檯日誌只是表明窗口#,當我再次點擊顯示窗口#窗口#

,所以我希望有辦法使用卸下襬臂(殺功能readytouseCard());

在此先感謝

+0

jquery'remove'函數用於刪除DOM元素。 – Dev

+1

這是一種奇怪的編程方式。 checklistCheck爲什麼在readytouseCard裏面?而且,你爲什麼要多次撥打readytCard卡?我看到它只是爲keyup設置了一個處理程序。 – Angel

回答

0

您不能「刪除」功能,您可以覆蓋它們,例如, readytouseCards = function(){}

但是我不明白,爲什麼你想這樣做。和控制檯日誌記錄Window是正確的,因爲你的函數的第一行有console.log(this);。由於您從全球範圍內呼叫readytouseCards,因此this必須與window相關聯。

您的實際問題是您在readytouseCards()中附加了一個事件處理程序。因此第二次調用該函數會附加兩次事件處理程序。這導致checklistCheck()在每個鍵盤上被調用兩次。這由您的控制檯記錄window兩次指示。

您需要重構你的整個代碼:

通過.on()jQuery on())一次附加的事件處理程序的開頭,這樣添加到DOM元素以後有連接太事件處理程序。

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

和通過移動checklistCheck()出它殺死功能​​。最後,省略readytouseCard();調用。

+1

請問downvoter能解釋我做錯了嗎? – Christoph

0

它是全球性的,這意味着我們可以通過窗口訪問它。

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

現在,我們做到了這一點,職能內容都被替換爲return false;將模仿nothing happening

+0

-1。檢查你的代碼。 – Bergi

0

我重新縮進了你的代碼。正如您現在所看到的,當在Ajax請求之後找到#usercurrentccbox, #addnewccbox時,該函數將被調用兩次。只要刪除第一個。

如果您想在執行一次後自動移除事件偵聽器,jQuery將提供.one()

您無法刪除某個功能。如果函數每次調用時都由一個標識符確定,那麼您可以用不同的函數覆蓋該變量。但是,當對函數的引用存儲在不可訪問的變量中時,這將不起作用,例如,當作爲事件監聽器添加時。那麼你需要編碼:

var called = false; 
function executeOnlyOnce(...) { 
    if (called) return; 
    called = true; 
    ... 
}