当前位置: 首页 > 知识库问答 >
问题:

javascript - 如何让以下自定义指令支持正负浮点数?

胡翔
2023-08-16

vue2项目封装了指令,输入框只能输入正浮点数,现在需要在此代码基础上修改下,支持输入正浮点数和负浮点数。

源码如下:

export default {  bind(el, binding, vnode) {    const input =      el.querySelector(".el-input__inner") ||      el.querySelector(".el-textarea__inner") ||      el;    input.addEventListener("compositionstart", () => {      vnode.locking = true; // 解决中文输入双向绑定失效    });    input.addEventListener("compositionend", () => {      vnode.locking = false; // 解决中文输入双向绑定失效      input.dispatchEvent(new Event("input"));    });    // 输入监听处理    input.onkeyup = () => {      if (vnode.locking) {        return;      }      // v-input.float      if (binding.modifiers.float) {        // 只能输入浮点型(只能一个小数点)        onlyFloat(input, binding.value);      }      input.dispatchEvent(new Event("input"));    };   //  浮点数   function onlyFloat(input, n) {      let value = input.value;      value = value.replace(/[^\d.]/g, "");      value = value.replace(/^\./g, "");      value = value.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");      if (n && Number(n) > 0) {        // 限制n位        var d = new Array(Number(n)).fill("\\d").join("");        var reg = new RegExp(`^(\\-)*(\\d+)\\.(${d}).*$`, "ig");        value = value.replace(reg, "$1$2.$3");      }      if (value && !value.includes(".")) {        value = Number(value).toString(); // 去掉开头多个0      }      input.value = value;    }  }}

共有1个答案

顾涵衍
2023-08-16
function onlyFloat(input, decimalPlaces) {  let val = input.value;    if (val.startsWith('-')) {    val = '-' + val.slice(1).replace(/-/g, '');  }  // 只允许一个小数点  val = val.replace(/^\./g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');  // 限制小数点后的位数  if (decimalPlaces !== undefined && !isNaN(decimalPlaces)) {    const parts = val.split('.');    if (parts[1] && parts[1].length > decimalPlaces) {      parts[1] = parts[1].substring(0, decimalPlaces);      val = parts.join('.');    }  }   val = val.replace(/[^\d.-]/g, '');  input.value = val;}
 类似资料:
  • 每次点击都要获取最新的goodsId,当前这个写法只能获取初始的goodsId: 100,自定义指令无法获取到goodsId的最新值。 尝试过的方法: 1、在updated内再一次获取最新值,但是每次点击,事件会触发多次。 2、在vnode上获取最新值,同样无法获取到最新值。 在此想请教一下各位

  • 创建自定义指令 第一步,创建一个自定义命令类文件,新建application/common/command/Hello.php <?php namespace app\common\command; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\con

  • 自定义指令可以使用 macro 指令来定义, 这是模板设计者所关心的内容。 Java程序员若不想在模板中实现定义指令,而是在Java语言中实现指令的定义, 这时可以使用 freemarker.template.TemplateDirectiveModel 类来扩展 (请参考 后续章节)。 基本内容 宏是有一个变量名的模板片段。可以在模板中使用宏作为自定义指令, 这样就能进行重复性的工作。例如,创建

  • 主要内容:实例,实例,钩子,实例,实例除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例 <div id="app"> <p>页面载入时,input 元素自动获取焦点:</p> <input v-focus> </div> <script> // 注册一个全局自定义指令 v-focus Vue.d

  • 主要内容:实例,实例,钩子,实例,实例,实例除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例 <div id="app"> <p>页面载入时,input 元素自动获取焦点:</p> <input v-focus> </div> <script> const app = Vue.createApp({}

  • 简介 除了默认设置的核心指令( v-model 和 v-show ),Vue 也允许注册自定义指令。注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而,有的情况下,你仍然需要对纯 DOM 元素进行底层操作,这时候就会用到自定义指令。下面这个例子将聚焦一个 input 元素,像这样: Vue.directive('focus', { inserted: function (el)