vue自定義指令導致輸入框限制輸入的問題
本文分析一個Vue自定義指令導致輸入框意外限制輸入的問題。該指令旨在限制輸入框只能輸入數字,但意外地影響了未應用該指令的輸入框。
問題描述
一個全局Vue指令validatenumber用于驗證輸入框只能輸入數字:
Vue.directive('validateNumber', { bind(el, binding, vnode) { let lastData = null; el.onkeyup = (e) => { if (String.fromCharCode(e.keyCode) === 'E' || String.fromCharCode(e.keyCode) === 'KeyE') { e.target.value = lastData; return false; } else { lastData = e.target.value; } e.target.value = e.target.value.replace(/[^d]/ig, ''); let _this = vnode.context; _this.AccessNestedObject(_this, vnode.data.model.expression, e.target.value); if (binding.expression && e.target.value) { let obj = (new Function("return " + binding.expression))(); let keys = Object.keys(obj); let values = Object.values(obj); if (keys[0] === 'min') { if (parseInt(e.target.value) < parseInt(values[1])) { e.target.value = values[1]; } } } el.dispatchEvent(new Event('input')); }; } });
模板中,第一個輸入框使用了該指令,第二個輸入框沒有:
<el-form-item label="等待時間" prop="timeInterval"> <el-input id="alarm-rule-time-interval" style="width:100%" type="number" v-model="alertRulesForm.timeInterval" v-validateNumber> <template slot="append">秒</template> </el-input> </el-form-item> <el-form-item label="空間間隔" prop="distanceInterval"> <el-input id="alarm-rule-distance-interval" type="number" v-model="alertRulesForm.distanceInterval"> <template slot="append">米</template> </el-input> </el-form-item>
然而,第二個輸入框也只允許輸入數字。
問題分析
問題并非自定義指令錯誤地應用于第二個輸入框,而是因為el-input的type=”number”屬性。該屬性本身就限制了輸入只能為數字。自定義指令的onkeyup事件監聽器雖然附加在第一個輸入框上,但并沒有影響第二個輸入框的輸入限制。
第二個輸入框的數字限制完全由type=”number”屬性決定。
解決方法
如果需要第二個輸入框允許輸入非數字字符,則應將type屬性改為”text”,并根據需要添加其他驗證邏輯。 如果需要對第二個輸入框進行數字驗證,則可以顯式地為其添加v-validateNumber指令。
通過修正代碼中的parseInt以及檢查values[1]是否為數字,可以避免潛在的錯誤。 此外,建議使用更健壯的數值比較方法,例如Number()來確??煽啃?。
總而言之,問題的根源在于type=”number”屬性,而非自定義指令的錯誤應用。 理解這一點對于解決類似問題至關重要。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END