2012-07-24 49 views
31

我想在輸入中的每第四個字符後插入一個破折號。我有一個信用卡輸入框。當用戶輸入並達到每個第4個字符時,jQuery將插入一個連字符(-)。在輸入中的每第四個字符後插入破折號

例如:1234-5678-1234-1231

更新:我嘗試了一些代碼,我想我是如此接近正確的代碼,但我有一些問題。這是我的代碼示例;

$('.creditCardText').keyup(function() { 

var cardValue = $('.creditCardText').val(), 
    cardLength = cardValue.length; 

if (cardLength < 5) { 
    if (cardLength % 4 == 0) { 
     console.log('4 lük geldi'); 
     cardValue += "-"; 
     $('.creditCardText').val(cardValue); 
    } 
} else { 
    if (cardLength % 5 == 0) { 
     console.log('5 lük geldi'); 
     cardValue += "-"; 
     $('.creditCardText').val(cardValue); 

    } 
} 

}); 
+3

使用四種不同的輸入字段,並結合他們的服務器端。做它的客戶端不值得麻煩,並可以混淆用戶,當他們不期望它。 – Blazemonger 2012-07-24 14:01:08

+0

你有試過什麼嗎?你有代碼嗎? – 2012-07-24 14:02:58

+1

@Blazemonger,我不是一個用戶體驗的人,但是那些使用佔位符的網站肯定不會打擾我。我認爲,可以避免刺激用戶。 – Brad 2012-07-24 14:03:11

回答

26

我絕對喜歡這個插件自動格式化: here

只要你已經使用JQuery,就是。

你可以輕鬆地與一個單一的代碼行強制破折號,就像如下:

$("#credit").mask("9999-9999-9999-9999"); 

當在該領域的用戶類型,破折號會自動出現在正確的位置,並且他們不會能夠刪除它們。

此外,您可以容納不同長度或格式的信用卡,其中?字符在面具上。例如,接受14個輸入和16個數字,你會做以下幾點:

$("#credit").mask("9999-9999-9999-99?99"); 

請記住,這僅僅是一個客戶端驗證


編輯:掩碼插件假定該字段有一個或有限許多正確的格式。例如,信用卡號碼只有幾種格式。該插件用於確保您的輸入只有是其中一種格式。

所以從技術上講,如果你想在每四位數後破折號,但對於任何位數,那麼這個插件是不適合你的。

我建議你限制可能的投入是合理的,因爲肯定沒有1000位長的信用卡這樣的東西。但是如果你真的想要這個功能,你必須自己編寫腳本或找到另一個插件。到目前爲止,我還沒有意識到這一點。

+2

有人提到並非所有的信用卡都是相同的格式。你也可以指定可選字符,所以爲了適應4-4-4-2,你可以寫 '$(「#credit」)。mask(「9999-9999-9999-99?99」);' – 2012-07-24 14:05:52

+0

我是嘗試過,但對我來說還不夠。因爲不是所有的信用卡都是相同的格式。輸入區域有24個字符,有人只是放了18個字符,這對他們來說已經足夠了。但有人要24個字。這是這個插件的問題嗎? – mrchad 2012-07-24 14:31:43

+0

@mrchad我不確定我是否理解,但是您可以指定輸入必須具有不同的長度,是的。你能給個例子嗎?也許用你想要的不同規則更新你的問題?如果你告訴我你想讓它允許而不允許,我可以幫你寫下面具 – 2012-07-24 14:43:48

15

我搞掂你的代碼,但使用四個文本框仍然強烈建議服務器驗證,以及它們之間的切換巧妙:

$('.creditCardText').keyup(function() { 
    var foo = $(this).val().split("-").join(""); // remove hyphens 
    if (foo.length > 0) { 
    foo = foo.match(new RegExp('.{1,4}', 'g')).join("-"); 
    } 
    $(this).val(foo); 
}); 

JSFiddle Link

+1

我upvoted,因爲這是一個快速的解決方案,但你需要一個'如果'的聲明在第三行調用.join(「 - 」)之前。如果你不這樣做,當你在輸入字段中只剩下一個字符並刪除它時,代碼會調用.match,它返回null,然後立即調用該空值的.join,這會導致javascript錯誤。請更新您的答案。除此之外,這是一個工作解決方案。 – mkralla11 2013-11-11 00:32:08

+0

@ Mike.MKrallaProductions謝謝。編輯我剛纔是什麼意思? – think123 2013-11-11 02:14:58

+0

@ think123,我試過你的代碼在信用卡的每4位數後加破折號,但如果用戶想刪除特定的數字,比如3rd或2nd,它就會失敗。而且數字不會輸入到特定的位置,比如我想在第7個位置添加數字,它總是從最後添加。 – Megha 2013-12-18 11:50:41

3

通過修改的建議@ think123@TheStoryCoder, 我爲遊標添加了selectionStart和SelectionEnd。之後,在適當的地方增加光標位置並修改光標位置。它應該解決光標位置不在預期的位置。

$('.creditCardText').keyup(function() { 

    var ss, se, obj; 
    obj = $(this); 
    ss = obj[0].selectionStart; 
    se = obj[0].selectionEnd; 

    var curr = obj.val(); 

    var foo = $(this).val().split("-").join(""); // remove hyphens 
    if (foo.length > 0) { 
    foo = foo.match(new RegExp('.{1,4}', 'g')).join("-"); 
    } 

    if(((curr.length % 5 == 0) && ss == se && ss == curr.length) || (ss == se && (ss % 5 == 0))){ 
     ss += 1; 
     se += 1; 
    } 

    if (curr != foo){ 
    $(this).val(foo); 
    obj[0].selectionStart = ss; 
    obj[0].selectionEnd = se; 
    } 

}); 
+0

我覺得這個更準確一些,它會支持兩者之間的編輯值。 – Jaison 2016-11-16 09:43:50

0

誰我上面已經回答了所有的人是正確的,他們的代碼絕對是短而整齊,但有一點進步,在這個意義上,它們要麼使用正則表達式或插件。類似這樣的事情也可以用基本的js/jquery實現,從你試圖實現的示例代碼來判斷。由於這個問題是在3歲,你一定是得到了你現在想要什麼,但是,是的,你很接近。這是你應該嘗試:

//Html 
    /* <input type="text" class="creditCardText" maxlength="19" /> */ 
    $('.creditCardText').keyup(function() { 
     var cctlength = $(this).val().length; // get character length 

     switch (cctlength) { 
     case 4: 
     var cctVal = $(this).val(); 
     var cctNewVal = cctVal + '-'; 
     $(this).val(cctNewVal); 
     break; 
     case 9: 
     var cctVal = $(this).val(); 
     var cctNewVal = cctVal + '-'; 
     $(this).val(cctNewVal); 
     break; 
     case 14: 
     var cctVal = $(this).val(); 
     var cctNewVal = cctVal + '-'; 
     $(this).val(cctNewVal); 
     break; 
     default: 
     break; 
    } 
    }); 

JSFiddle Link

+0

不錯的嘗試,但結果是有點馬車,如果你刪除或更改號碼,即使如此,漂亮的試用 – 2015-08-20 10:45:06

6

基礎的在@ think123答案,香草JS,無JQuery的:

document.querySelector('.creditCardText').addEventListener('input', function (e) { 
    var foo = this.value.split("-").join(""); 
    if (foo.length > 0) { 
     foo = foo.match(new RegExp('.{1,4}', 'g')).join("-"); 
    } 
    this.value = foo; 
}); 

我知道這個問題是關於jQuery的,但我認爲這個答案可以幫助太大。

+0

這幫助我一個陣營項目中,我試圖遠離jQuery的路程。我使用這個,因爲我試圖在npm中遠離掩碼的輸入組件。對於我的情況,我不需要這些,因爲我在一個輸入上動態跟蹤兩種類型的字符串。 – 2017-07-16 00:50:50

3

如果您正在尋找一個純粹的Javascript解決方案,請看下面我的功能。它支持美國運通格式(15位數字)以及Visa,MasterCard和其他(16位數字)。

注意簡單的解決方案,它將取代整個值,並始終把焦點放在輸入的末尾:如果用戶編輯他以前輸入的內容,可能會很煩人。

DEMOhttps://jsfiddle.net/pmrotule/217u7fru/

input_credit_card = function(input) 
{ 
    var format_and_pos = function(char, backspace) 
    { 
     var start = 0; 
     var end = 0; 
     var pos = 0; 
     var separator = "-"; 
     var value = input.value; 

     if (char !== false) 
     { 
      start = input.selectionStart; 
      end = input.selectionEnd; 

      if (backspace && start > 0) // handle backspace onkeydown 
      { 
       start--; 

       if (value[start] == separator) 
       { start--; } 
      } 
      // To be able to replace the selection if there is one 
      value = value.substring(0, start) + char + value.substring(end); 

      pos = start + char.length; // caret position 
     } 

     var d = 0; // digit count 
     var dd = 0; // total 
     var gi = 0; // group index 
     var newV = ""; 
     var groups = /^\D*3[47]/.test(value) ? // check for American Express 
     [4, 6, 5] : [4, 4, 4, 4]; 

     for (var i = 0; i < value.length; i++) 
     { 
      if (/\D/.test(value[i])) 
      { 
       if (start > i) 
       { pos--; } 
      } 
      else 
      { 
       if (d === groups[gi]) 
       { 
        newV += separator; 
        d = 0; 
        gi++; 

        if (start >= i) 
        { pos++; } 
       } 
       newV += value[i]; 
       d++; 
       dd++; 
      } 
      if (d === groups[gi] && groups.length === gi + 1) // max length 
      { break; } 
     } 
     input.value = newV; 

     if (char !== false) 
     { input.setSelectionRange(pos, pos); } 
    }; 

    input.addEventListener('keypress', function(e) 
    { 
     var code = e.charCode || e.keyCode || e.which; 

     // Check for tab and arrow keys (needed in Firefox) 
     if (code !== 9 && (code < 37 || code > 40) && 
     // and CTRL+C/CTRL+V 
     !(e.ctrlKey && (code === 99 || code === 118))) 
     { 
      e.preventDefault(); 

      var char = String.fromCharCode(code); 

      // if the character is non-digit 
      // OR 
      // if the value already contains 15/16 digits and there is no selection 
      // -> return false (the character is not inserted) 

      if (/\D/.test(char) || (this.selectionStart === this.selectionEnd && 
      this.value.replace(/\D/g, '').length >= 
      (/^\D*3[47]/.test(this.value) ? 15 : 16))) // 15 digits if Amex 
      { 
       return false; 
      } 
      format_and_pos(char); 
     } 
    }); 

    // backspace doesn't fire the keypress event 
    input.addEventListener('keydown', function(e) 
    { 
     if (e.keyCode === 8 || e.keyCode === 46) // backspace or delete 
     { 
      e.preventDefault(); 
      format_and_pos('', this.selectionStart === this.selectionEnd); 
     } 
    }); 

    input.addEventListener('paste', function() 
    { 
     // A timeout is needed to get the new value pasted 
     setTimeout(function(){ format_and_pos(''); }, 50); 
    }); 

    input.addEventListener('blur', function() 
    { 
     // reformat onblur just in case (optional) 
     format_and_pos(this, false); 
    }); 
}; 

input_credit_card(document.getElementById('credit-card')); 
+0

這對我有很大的幫助。謝謝 – hyperexpert 2017-05-27 04:47:47

相關問題