いつもご回答ありがとうございます。
タイトル通りなのですが、フォームの中に設置したクレジット用のinputを、4桁入力されるたびに区切られるような方法を探しています。
inputは4つに分割せずに、1つのinputにしたく、4桁入力されるたびにスペースが入るようなものを想定しています。
html
1<input name="number" type="tel" placeholder="1234 5678 9012 3456" maxlength="16"> 2
ネットで調べてみても、海外のgiithubのjs関連ばかりが出てくるのですが、外部のjsを導入することなく、実現できるようなものをさがしております。
ご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/27 07:31
2019/12/27 07:41
2019/12/27 07:43
2019/12/27 07:50
回答6件
0
フォームの中に設置したクレジット用のinputを、4桁入力されるたびに区切られるような方法を探しています。
そもそも論として、自分でクレジットカードを入力させるフォームを作ること自体、できれば避けたほうがいいです。自社のWebサイトに改ざんが入ると、そこからカード情報が漏洩する危険があります。
決済事業者のサイトに飛ばしてそちらで入力させる、という方式のほうがより安全です(参考)。
投稿2019/12/27 07:24
総合スコア145975
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/27 07:32
2019/12/27 07:54 編集
0
ベストアンサー
こんにちは
以下でどうでしょう?
html
1<input id='card-number-input' maxlength="19" />
javascript
1const regexp = /^(\d{1,4})?(\d{1,4})?(\d{1,4})?(\d{1,4})?$/; 2 3document 4 .getElementById('card-number-input') 5 .addEventListener('input', function(e) { 6 const digits = e.target.value.replace(/[^0-9]/g, ''); 7 e.target.value = [...regexp.exec(digits)].slice(1).filter(e => e).join(' '); 8 });
- 動作確認用CodePen: https://codepen.io/jun68ykt/pen/MWYvWJL?editors=1010
上記では、
- 半角数字以外の文字(スペース含む。)が入力されても無視されます。
- 途中まで入力した値をバックスペースで消していくときに、自動で追加された区切りのスペースは、自動的に消去されます。(※スペースを消すためのバックスペースを打つ必要がない、という意味です。)
参考になれば幸いです。
追記
上記の回答では、4桁ずつ区切るために正規表現を使いましたが、別の方法で区切るコードを挙げます。
「質問への追記・修正」のやりとりを拝読して、外部のモジュールも、場合によっては利用出来るということなのかなと思われました。以下は、 4桁ずつ区切るために、lodash の _.chunk を使ったコードです。
javascript
1document 2 .getElementById('card-number-input') 3 .addEventListener('input', function(e) { 4 const digits = e.target.value.replace(/[^0-9]/g, ''); 5 e.target.value = _.chunk(digits, 4).map(a => a.join('')).join(' '); 6 });
- 動作確認用CodePen: https://codepen.io/jun68ykt/pen/wvBqaQd?editors=1010
- cdnjs: lodash.js
追記2
私の上記回答のコードだと、以下の手順で再現されるような不便さがありまして、実用に耐えうるものになっていないです。
- input が空欄の状態から、1,2,3,4,5,6,7,8 と順に打つ。
4
の後ろにスペースが追加された1234 5678
と表示される。3
を別の数字に修正するために、3
の後ろをクリックするか、矢印キーで、3
の後ろにカーソルを移動させる。- バックスペースを押す
- 表示が
1245 678
となり、かつ、カーソルが末尾(8
の後ろ)に移動してしまう。
上記の手順で、バックスペースを押した後の望ましい状態は、2
と4
の間にカーソルがあることですが、そのようになりません。これをきちんと制御するには、input のカーソル位置取得、設定をきめ細かくやる必要がありそうです。
投稿2019/12/27 09:12
編集2019/12/27 12:54総合スコア9058
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/27 14:03
2019/12/27 14:16
2019/12/27 16:04
0
inputは4つに分割せずに、1つのinputにしたく、4桁入力されるたびにスペースが入るようなものを想定
change イベント内でフォーマット通りになるように矯正するしかなさそうですね。
StackOverflowにもご質問と同じ機能をjQueryで実装したい内容があり、回答としてJSFiddle がリンクされていました。
※入力様式を正規表現で矯正することで、期待する入力内容に整えることは可能です。
ちなみにですが、autocomplete で補完される様式を確認したことがあります。
区切りのない12桁の数字(テキストデータ)として補完されます。
ローカル環境でテストしたコード例(cc-number)
HTML
1<input type="text" id="num12" autocomplete="cc-number">
javascript
1let entryPoint = () =>{ 2 let field = document.querySelector("#num12"); 3 4 field.addEventListener("change", ()=>{ 5 console.log( field.value ); // 補完結果は「連続した12桁の数字」 6 }) 7} 8window.addEventListener("load", entryPoint);
- [CodePen Home
Credit card autocomplete example](https://codepen.io/yuriyromadin/pen/KXGPyO) のようなテストを公開されている方もいます。
1つのINPUT要素で対応するには、「様式矯正」の手段しかなさそうです。
参考 MDN
ご参考になれば。
投稿2019/12/27 09:27
総合スコア5434
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
html
1<input id="back"> 2<input id="fore">
css
1#back{ 2 position:absolute; 3} 4#fore{ 5 opacity:0; 6}
js
1var back = document.getElementById('back'); 2var fore = document.getElementById('fore'); 3fore.addEventListener('keyup',()=>{ 4 back.value = fore.value.split(/(.{4})/).filter(e=>e).join(' '); 5});
投稿2019/12/27 09:02
総合スコア36932
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/27 09:08
2019/12/27 09:34
2019/12/27 09:56
2019/12/27 10:04
2019/12/27 10:19
0
クレジットカードかどうかはセキュリティレベルが変わってくるので
一旦おいておきましょう
投稿2019/12/27 07:46
編集2019/12/27 07:47総合スコア116690
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/27 07:46
2019/12/27 07:51
2019/12/27 07:57
2019/12/27 08:08
2019/12/27 08:48 編集
2019/12/27 14:06
0
こんな感じでしょうか?挙動はもう少し調整する必要がありますが。
JavaScript
1 const ele = document.getElementsByName("number")[0]; 2 ele.addEventListener("keypress", (event) => { 3 var str = event.target.value; 4 ele.value = str.replace( /(\d{4})(\d{1})/, '$1 $2' ); 5 });
投稿2019/12/27 07:56
編集2019/12/27 07:57総合スコア192
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。