<input type="text" id="maxnum" name="maxnum" maxlength="2"
oninput="handleInput(this)" onpaste="return false" />
<script>
function handleInput(el) {
// 1. 過濾非數字
let val = el.value.replace(/\D/g, '');
// 2. 空值不處理
if (val === '') { el.value = ''; return; }
// 3. 轉數字並限制範圍
let num = parseInt(val, 10);
if (num < 1) num = 1;
if (num > 15) num = 15;
// 4. 回填
el.value = num;
}
</script>
<input type="text" id="maxnum" name="maxnum" maxlength="2" />
<script>
$('#maxnum').on('input', function() {
let val = this.value.replace(/\D/g, '');
if (val === '') return;
let num = parseInt(val, 10);
if (num < 1) num = 1;
if (num > 15) num = 15;
this.value = num;
}).on('paste', function(e) {
e.preventDefault(); // 禁止粘貼
});
</script>
| 需求 | 實現方式 | 注意點 |
|---|---|---|
| 只能輸入數字 | replace(/\D/g, '') | oninput 事件可捕獲輸入法組合字符、刪除等所有值變化,優於 onkeyup |
| 範圍 1-15 自動修正 | parseInt + Math.min/max 或 if | 先判斷空字串,避免 parseInt('') 產生 NaN |
| 禁止粘貼 | onpaste="return false" 或 e.preventDefault() | 現代瀏覽器支援 onpaste,舊版 IE 需 onbeforepaste |
| 最大長度 2 | maxlength="2" | HTML5 原生屬性,瀏覽器自動攔截超長輸入 |
// Vue 2 指令範例
Vue.directive('range', {
inserted(el, binding) {
const [min, max] = binding.value;
el.addEventListener('input', () => {
let val = el.value.replace(/\D/g, '');
if (val === '') return;
let num = parseInt(val, 10);
el.value = Math.max(min, Math.min(max, num));
});
el.addEventListener('paste', e => e.preventDefault());
}
});
// 使用: <input v-range="[1, 15]" maxlength="2" />
使用 oninput 統一處理值過濾與範圍修正,onpaste 禁止粘貼,maxlength 限制長度。原生 JS 版本零依賴、兼容性最好,推薦直接集成。