开发问题小Tips集锦

1,678 阅读2分钟

一、vue 限制输入num之-:

前言: vant 的组件type=number 在ios输入掉起数字键盘,没有小数点,满足不了移动端输入小数的情况,所以唯有使用type="text"这种方式,然后限制输入数字,同时可以输入负数、小数(最长输入length限制、保留两位小数限制)

  • 解决方式如下:
  // input type=text 唤起全键盘
// 规则设定:支持输入小数、负数、正整数 其他值不予选定
function trimExtraChar (value, char, regExp) {
  const index = value.indexOf(char)
  if (index === -1) {
    return value
  }

  if (char === '-' && index !== 0) {
    return value.slice(0, index)
  }
  return value.slice(0, index + 1) + value.slice(index).replace(regExp, '')
}

export function formatNumber (
  value,
  allowDot = true,
  allowMinus = true
) {
  if (allowDot) {
    value = trimExtraChar(value, '.', /\./g)
  } else {
    value = value.split('.')[0]
  }

  if (allowMinus) {
    value = trimExtraChar(value, '-', /-/g)
  } else {
    value = value.replace(/-/, '')
  }
  const regExp = allowDot ? /[^-0-9.]/g : /[^-0-9]/g
  return value.replace(regExp, '')
}
  
  • 调用示例:
<van-field v-model="changeValue" type="text"
                 @input="changNumber"
                 ref="inputBtn"
                 :autofocus="true"
                 placeholder="Enter your answer" />

changNumber (value) {
      if (value === '') {
        return
      }
      if (value.length > 10) { //最长10位,如不需要,可注释
        value = value.slice(0, 10)
      }
      if(!/\./.test(value) { // 如果输入是0001 or 000, 转换成1 or 0 ,如不需要,可注释
         value= +value // 
       }else{ // 限制输入保留两位小数 ,如不需要,可注释
        value = value.replace(^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3');
       }

      const inputValue = formatNumber(value, true, true)
      this.changeValue = inputValue
    }

二、vue 限制输入num之二:(同时可以解决火狐浏览器type=number可以输入英文的情况)

  • type=num是无法限制 e + - 的输入的
  • 原因:在数学中,e是极为常用的超越数之一 它通常用作自然对数的底数,即:In(x)=以e为底x的对数。e=2.71828
  • 如果想要屏蔽,可是如下使用:
 <el-input
        v-model="value"
        type="number"
        placeholder="Please enter a number"
        onkeyup="value=value.replace(/[^\d^\.]+/g,'').replace('.','$#$').replace(/\./g,'').replace('$#$','.')"
        @input="chnageValue">
</el-input>

三、vue 限制输入只能输入正整数

 <input type="text" oninput="this.value = this.value.replace(/[^0-9]/g, '');">

四、vue element-ui 表单页面,有多个表单输入时,enter触发表单关闭提交事件:

原因:触发了表单默认提交事件

  • 解决办法:(阻止表单默认提交事件)
 <el-form @submit.native.prevent></el-form>          

五、移动端(fixed、absolute)定位导致 input输入框被Android浏览器软键盘遮挡的问题处理

  • 解决办法-:
 监听window的resize事件,进行相应的高度或位置调整:
 
 var winHeight = $(window).height();
$(window).resize(function() {
    var thisHeight = $(this).height();
    if (winHeight - thisHeight > 50) {
        //软键盘弹出
        $('body').css('height', winHeight + 'px');
    } else {
        $('body').css('height', '100%');
    }
});
  • 解决办法二:
监听input输入框获得焦点和失去焦点的事件,进行相应地处理

function fixIMEOf(nodeId, topOrg, topNew) {
    var node = document.getElementById(nodeId);
    if(node!=null) {
        node.addEventListener('focusin', function() {
            if(!Q.isIOS()) {//iOS上一般不会有这个问题
            	//将input的父容器往上移动,移出遮挡区
                node.parentNode.style.top = topNew + 'px';
            }
        });
        node.addEventListener('focusout', function() {
            window.scrollTo(0,0);//解决iOS上,关闭软键盘后,页面可能不下移,造成页面底部留白的问题
            if(!Q.isIOS()) {
                node.parentNode.style.top = topOrg + 'px';
            }
        });
    }
}

五、邮箱验证正则

regConfig = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

六、 解决关于inline-block元素换行问题