이 글은 Python에서 함수를 동적으로 정의하는 방법을 소개합니다. 필요한 친구들이 참고할 수 있기를 바랍니다.
vue 프레임워크는 모바일 측의 IP 입력 상자 구성 요소를 사용하며 입력은 브라우저 및 WeChat과 호환됩니다.
요구 사항: 숫자만 입력할 수 있습니다. 숫자 이외의 문자(점, 콜론 및 기타 숫자 기호 포함)를 입력하면 자동으로 다음 IP 입력 상자로 이동합니다.
type=숫자 유형이면 점 입력이 되지 않습니다. 금지. 수동 필터링에서는 점 문자가 포함된 문자열을 가져올 수 없습니다. 게다가 점을 여러 개 입력하면 얻은 값이 비어 있습니다.
해결 방법: type=tel, 숫자만 입력할 수 있고 점 문자만 입력하면 얻을 수 있습니다.
문제: 키업 이벤트 콜백 이벤트에 반환된 event.keyCode가 모두 229입니다.
해결 방법: 이벤트 이벤트 개체의 키코드가 비어 있지만 event.data가 필터링할 수 있는 입력 문자를 반환합니다.
<template> <div> <ul :class="{isDisabled:isDisabled}" > <li :key='index' v-for="(item,index) in ipAdress"> <input :tabindex="'ipInput'+(index+1)" :class="'ipAdress'+(index+1)" @blur="blurFocus(index)" autocomplete="off" :readonly="isDisabled" maxlength="3" type="tel" pattern="[0-9]{1,3}" @input="checkIpVal(item,index,$event)" :disabled="isDisabled" @keyup="turnIpPOS(item,index,$event)" @keydown="delteIP(item,index,$event)" v-model="item.value" ref="ipInput" /> <span v-if="index<3">.</span> </li> </ul> </div> </template> <script> export default { data() { return { ipAdress: [{ value: '' }, { value: '' }, { value: '' }, { value: '' }], isWX:navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == "micromessenger" }; }, props: { ipStr: { trype: String, default: '' }, ipType: { type: String }, isDisabled: { type: Boolean, default: false }, width: { type: String, default:'100%' } }, watch: { ipStr:{ immediate:true, handler:function(vall) { let val = vall; let nArr = []; if(val && val.includes('.') && val.length > 0) { let valArr = val.split('.'); let m = valArr.length; for(let i = 0; i < 4; i++) { if(valArr[i] == 'null' || valArr[i] == 'undefined'){ valArr[i] = ''; } if(i < m) { nArr.push({ value: valArr[i] }); } else { nArr.push({ value: '' }); } } } else { nArr = [{ value: '' }, { value: '' }, { value: '' }, { value: '' }]; } this.ipAdress = nArr; } } }, methods: { //methods blurFocus(index) { if(index == 3) { this.$emit('blur'); } }, checkIpVal(item,index,event) { let self = this; //wx if(this.isWX){ let e = event || window.event; let keyCode = e.data; // //.向右跳转 if(keyCode === ".") { e.preventDefault(); e.returnValue = false; item.value = item.value.replace(/[^\d]/g, "").replace(/[\.]/g, ""); if(index < 3 ) { self.$refs.ipInput[index + 1].focus(); } return false; } } let isNo = /^[0-9]{1,3}$/g; if(/[^\d]/g.test(item.value)){ let cache = JSON.parse(JSON.stringify(self.ipAdress)); cache[index].value = item.value.replace(/[^\d]/g, "").replace(/[\.]/g, ""); self.ipAdress = cache; return false; } if(item.value.replace(/[^\d]/g, "").length >= 3) { let val = parseInt(item.value.replace(/[^\d]/g, ""), 10); if(isNaN(val)) { val = '' } else if(val > 255) { val = 255; } else { val = val < 0 ? 0 : val; } item.value = String(val); this.$set(this.ipAdress,index,item); if(index < 3 ) { self.$refs.ipInput[index + 1].focus(); } } let ns = ''; this.ipAdress.forEach(item => ns += '.' + item.value); if(ns.length <= 4){ this.$emit('getIP', "", this.ipType); }else{ this.$emit('getIP', ns.slice(1), this.ipType); } }, turnIpPOS(item, index, event) { let self = this; let e = event || window.event; if(e.keyCode == 37) { if(index != 0) { self.$refs.ipInput[index - 1].focus(); } } //右箭头、回车键、空格键、冒号均向右跳转,右一不做任何措施 if(e.keyCode == 39 || e.keyCode == 13 || e.keyCode == 32 || e.keyCode == 110 || e.keyCode == 46 || e.keyCode == 190 ) { e.preventDefault(); e.returnValue = false; if(index < 3 ) { self.$refs.ipInput[index + 1].focus(); } return false; } }, delteIP(item, index, event) { let self = this; let e = event || window.event; let val = parseInt(item.value.replace(/[^\d]/g, ""), 10); val = isNaN(val) ? '' : val; if(e.keyCode == 8 && index > 0 && val.length==0) { self.$refs.ipInput[index - 1].focus(); } } }, mounted(){ console.log(this.$props) console.log(this.$attrs.index) } }; </script> <style scoped> $--border-color:#ccc; $--outline-color:transparent; $--font-color:$--input-color; $base-font-size:12px; .ipInput { box-sizing: border-box; line-height: inherit; border: 1px solid $--border-color; overflow: hidden; border-radius: 5px; padding: 0; margin: 0; display: inline-block; vertical-align: middle; outline: $--outline-color; font-size:0; text-indent: 0; background: #fff; &.isDisabled { background: $--outline-color; li{ cursor:not-allowed; input{ cursor:not-allowed; } } } li { display: inline-block; width:25%; box-sizing: border-box; font-size:0; input { appearance: none; padding:10px 5px; width: calc(100% - 3px); text-align: center; outline: none; border: none; color: $--font-color; box-sizing: border-box; font-size: $base-font-size; &:disabled { background: $--outline-color; } } span { display: inline-block; font-size:$base-font-size; width: 3px; color: $--font-color; } } } </style>
이 기사는 여기까지입니다. 더 흥미로운 내용을 보려면 PHP 중국어 웹사이트의 JavaScript Tutorial Video 칼럼을 주목하세요!
위 내용은 Vue 모바일 단말기에 IP 입력란을 구현하는 문제에 대한 솔루션 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!