vue 手机分段输入(334分隔)

因为项目需求,需要实现分段输入,即“344”显示,搜索网上,找到一些代码,与产品经理要求的“某品会”的效果还有一段距离,经过分析发现,需要实现以下需求:

1.总长可输入13位字符,数字和空格;

2.当删除空格的时候,拦截事件,如果光标是在字符中间的话,那就将光标往前移一位,即将光标移动到空格前面;而如果光标是在最后面时,那么不进行拦截(主要对参考代码进行这个需求的改造)

3.粘贴时,需要将非数字和非空格的字符删除(ios里复制联系人时会带着空格)

 

完整代码如下:

<div id="app">
    <input v-model="mobile" type="tel" ref="mobile" maxlength="13" @keyup="inputMobile" @paste="inputMobile" @keydown="onKeydown" placeholder="请填写充值手机号"/>
</div>
new Vue({
	el: '#app',
	data: {
		mobile: "",
		telephone: ""
	},
	mounted: function() {},
	watch: {
		telephone(newValue, oldValue) {
			if (newValue > oldValue) {
				if (newValue.length === 4 || newValue.length === 9) {
					var pre = newValue.substring(0, newValue.length - 1)
					var last = newValue.substr(newValue.length - 1, 1)
					this.telephone = pre + ' ' + last
				} else {
					this.telephone = newValue
				}
			} else {
				if (newValue.length === 9 || newValue.length === 4) {
					this.telephone = this.telephone
				} else {
					this.telephone = newValue
				}
			}
		}
	},
	methods: {
		onKeydown(e) {
			var input = e.target;
			var selectionLeft = input.value.substring(input.selectionStart - 1, input.selectionEnd);
			var selectionRight = input.value.substring(input.selectionStart, input.selectionEnd + 1);

            //碰到空格,往前移动一位光标
			var selectionStart = input.selectionStart;
			if (e.keyCode === 8 && selectionLeft === " " && selectionRight) {
				input.selectionStart = selectionStart - 1;
				input.selectionEnd = input.selectionStart;
				e.preventDefault();
			}
		},
		inputMobile(e) {
			this.formatMobile(e)
			this.mobile = this.$refs.mobile.value
		},
		formatMobile(e) {
			let val = this.$refs.mobile.value // 不可直接用this.mobile,第一方便提取该方法降低代码耦合度,第二直接用this.mobile,在输入汉字时按下shift按键会导致无法再输入和删除内容
			let selStart = this.$refs.mobile.selectionStart // 选中区域左边界位置
			let mobileLen = val.length
			let value = this.getValue(e, val).substr(0, 11) // 获取输入/粘贴内容,并截取前11位
			let len = value.length
			if (len > 3 && len < 8) {
				value = value.replace(/^(\d{3})/g, '$1 ')
			} else if (len >= 8) {
				value = value.replace(/^(\d{3})(\d{4})/g, '$1 $2 ')
			}
			this.$refs.mobile.value = value
			if (selStart !== mobileLen) {
				// 设置光标位置
				this.$refs.mobile.selectionStart = this.$refs.mobile.selectionEnd = selStart
			}
		},
		getValue(e, val) {
			let value = ''
			if (e.type === 'keyup') {
				value = val.replace(/\D/g, '');
			} else if (e.type === 'paste') {
				// window.clipboardData:IE浏览器获取剪贴板数据对象
				// event.clipboardData:Chrome, Firefox, Safari获取剪贴板数据对象
				let clipboardData = event.clipboardData || window.clipboardData;
				value = clipboardData.getData('Text'); // 获取剪贴板text格式的数据
				value = value.replace(/\D/g, '')
			}
			return value
		},
	}
})

 

 

 

参考代码:https://www.cnblogs.com/qdwyy/p/10854014.html

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue axios分段上传可以通过将文件分割成多个块,并使用axios的post方法逐个上传这些块来实现。可以使用FormData对象来创建一个包含文件块的表单数据,并在每个请求中设置适当的请求头。 首先,需要将文件分割成块。可以使用File API的slice方法来实现这一点。根据文件的大小和每个块的大小,可以计算出需要分割的块数。 然后,可以创建一个循环来逐个上传这些块。在每次循环迭代中,创建一个新的FormData对象,并向其中添加当前块。还需要设置适当的请求头,以便服务器能够正确地识别和重组这些块。 最后,可以使用axios的post方法将每个块上传到服务器。在每个请求的回调函数中,可以检查上传的进度,并根据需要更新UI。 如下是一个示例代码: ```javascript import axios from 'axios'; const CHUNK_SIZE = 1024 * 1024; // 每个块的大小,这里设置为1MB function uploadFile(file) { const fileSize = file.size; const totalChunks = Math.ceil(fileSize / CHUNK_SIZE); for (let i = 0; i < totalChunks; i++) { const start = i * CHUNK_SIZE; const end = start + CHUNK_SIZE; const chunk = file.slice(start, end); const formData = new FormData(); formData.append('file', chunk, file.name); formData.append('chunkIndex', i); formData.append('totalChunks', totalChunks); axios.post('/upload', formData, { headers: { 'Content-Type': 'multipart/form-data', }, onUploadProgress: (progressEvent) => { const progress = Math.round((progressEvent.loaded / progressEvent.total) * 100); console.log(`Chunk ${i + 1}/${totalChunks} uploaded: ${progress}%`); }, }); } } // 使用示例 const fileInput = document.getElementById('fileInput'); fileInput.addEventListener('change', (event) => { const file = event.target.files[0]; uploadFile(file); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值