草庐IT

vue触屏项目 使用 虚拟键盘组件,通过js给el-input value赋值,v-model绑定值不同步问题(已修改)

蓝胖子的多啦A梦 2024-05-08 原文

1.管理后台项目 每个页面都有模糊搜索,之前是使用外接键盘或者扫码枪进行输入,完全没有问题,但是最近客户使用的是触屏手动输入,就发现了问题,输入框上的值并不会被监听到,也不会触发el-input框自带的enter,以及change事件,这时候就想着接入一个 虚拟键盘,在触屏项目中使用,接入完成后本以为可以成功,但是发现,通过js给el-input value赋值,v-model绑定值不会同步

问题:.赋值后,界面显示字段已更改,获取v-model的参数,发现不会同步更改

解决办法:
v-model只是一种语法糖,底层的方法还是去监听input事件。所以可以使用dispatchEvent事件给元素分配一个input事件,这样可以手动触发 inputElement 的 input 事件,同时可以触发 v-model 机制。IE 好像不支持(但可以 polyfill)。

el.value(newval)

el.dispatchEvent(new Event(\'input\'));

el为input元素

解决!

PS:

如果v-model有lazy修饰符的时候,触发得是change事件
el.dispatchEvent(new Event(‘change’));

完整步骤:

1.先安装

    npm i simple-keyboard -S

2.我这里是单独写了一个keyboard.vue的组件

<template>
  <div :class="keyboardClass"></div>
</template>

<script>
import Keyboard from "simple-keyboard";
import "simple-keyboard/build/css/index.css";

export default {
  name: "SimpleKeyboard",
  props: {
    keyboardClass: {
      default: "simple-keyboard",
      type: String,
    },
    input: {
      type: String,
    },
    layout: {
      type: Object,
      default: function () {
        return {
          default: [
            "` 1 2 3 4 5 6 7 8 9 0 - = {bksp}",
            "{tab} q w e r t y u i o p [ ] \\",
            "{lock} a s d f g h j k l ; ' {enter}",
            "{shift} z x c v b n m , . / {shift}",
            "@ {space}",
          ],
          shift: [
            "~ ! @ # $ % ^ &amp; * ( ) _ + {bksp}",
            "{tab} Q W E R T Y U I O P { } |",
            '{lock} A S D F G H J K L : " {enter}',
            "{shift} Z X C V B N M &lt; &gt; ? {shift}",
            "@ {space}",
          ],
        };
      },
    },
  },
  data: () => ({
    keyboard: null,
  }),
  mounted() {
    this.keyboard = new Keyboard(this.keyboardClass, {
      onChange: this.onChange,
      onKeyPress: this.onKeyPress,
    });
    this.keyboard.setOptions({
      layoutName: "default",
      layout: this.layout,
      display: {
        "{enter}": "close",
        "{shift}": "shift",
        "{bksp}": "del",
        "{tab}": "tab",
        "{space}": "space",
        "{lock}": "caps",
      },
    });
  },
  methods: {
    onChange(input) {
      this.$emit("onChange", input);
    },
    onKeyPress(button) {
      this.$emit("onKeyPress", button);

      /**
       * If you want to handle the shift and caps lock buttons
       */
      if (button === "{shift}" || button === "{lock}") this.handleShift();
    },
    handleShift() {
      let currentLayout = this.keyboard.options.layoutName;
      let shiftToggle = currentLayout === "default" ? "shift" : "default";

      this.keyboard.setOptions({
        layoutName: shiftToggle,
      });
    },
  },
  watch: {
    input(input) {
      this.keyboard.setInput(input);
    },
  },
};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

tips: 因为我这边有几个键需要自定义,所以在mounted中进行了修改~

3. 在需要应用的页面 引入 注册 使用即可 我这里是在keyIndex.vue页面中引入啦~

<template>
  <div>
    <svg-icon icon-class="keyboard" @click="click" />
    <SimpleKeyboard
      v-if="isShow"
      @onChange="onChange"
      @onKeyPress="onKeyPress"
      :input="input"
    />
  </div>
</template>

<script>
import SimpleKeyboard from "@/components/keyboard/keyboard";
export default {
  name: "keyboard",
  components: { SimpleKeyboard },
  data() {
    return {
      input: "",
      currentInputDom: "",
      isShow: false,
    };
  },
  beforeUpdate() {
    this.$nextTick(() => {
      this.findInput();
    });
  },
  methods: {
    click() {
      this.isShow = !this.isShow;
    },
    onChange(input) {
      console.log(input, "input");
      let that = this;
      that.input = input;
      that.currentInputDom.value = input + "";
      that.currentInputDom.dispatchEvent(new Event("input"));
    },
    onKeyPress(button) {
      let that = this;
      if (button == "{enter}") {
        that.isShow = false;
      }
    },
    //给页面中input框添加点击事件
    findInput() {
      let that = this;
      let list = document.getElementsByTagName("input");
      for (let i = 0; i < list.length; i++) {
        let inputDom = list[i];
        if (inputDom.type == "text" || inputDom.type == "password") {
          console.log(inputDom.readOnly, i);
          if (!inputDom.readOnly) {
            inputDom.addEventListener("click", function (event) {
              that.input = event.target.value; //获取到输入框的值
              that.currentInputDom = event.target;
            });
            // console.log(inputDom.type, i);
          }
        }
      }
    },
  },
};
</script>

<style scoped>
.keyboard-svg {
  display: inline-block;
  cursor: pointer;
  fill: #5a5e66;
  width: 20px;
  height: 20px;
  vertical-align: 10px;
}

.hg-theme-default {
  position: fixed;
  z-index: 9999;
  width: 75%;
  left: 20%;
  bottom: 30px;
}
</style>

tips:因为每个页面都有input框,所以我这边写了一个方法 findInput(),找到页面中所有的input框并添加点击事件,获取到输入的值。
1.首先:给页面中input框添加点击事件,也要区分因为日期选择器,下拉框噢。本质上也属于输入框,但它们不是真的哦~
所以:inputDom.type == “text” || inputDom.type == "password"时,添加点击事件
2.

 inputDom.addEventListener("click", function (event) {
 //js赋值
              that.input = event.target.value; 
              that.currentInputDom = event.target; 
 });

3.onChange事件 是键盘按键 点击时触发

   onChange(input) {
   //input: 为点击的键盘值
      console.log(input, "input");
      let that = this;
      that.input = input;// 赋值给键盘上绑定的值
      that.currentInputDom.value = input + ""; //value  值格式为字符串,所以要+ ''
      that.currentInputDom.dispatchEvent(new Event("input")); //更新v-model的值
    },

实现效果 :点击旁边的搜索功能也是最新输入的值噢~ 更新成功

有关vue触屏项目 使用 虚拟键盘组件,通过js给el-input value赋值,v-model绑定值不同步问题(已修改)的更多相关文章

  1. ruby-on-rails - rails : keeping DRY with ActiveRecord models that share similar complex attributes - 2

    这似乎应该有一个直截了当的答案,但在Google上花了很多时间,所以我找不到它。这可能是缺少正确关键字的情况。在我的RoR应用程序中,我有几个模型共享一种特定类型的字符串属性,该属性具有特殊验证和其他功能。我能想到的最接近的类似示例是表示URL的字符串。这会导致模型中出现大量重复(甚至单元测试中会出现更多重复),但我不确定如何让它更DRY。我能想到几个可能的方向...按照“validates_url_format_of”插件,但这只会让验证干给这个特殊的字符串它自己的模型,但这看起来很像重溶液为这个特殊的字符串创建一个ruby​​类,但是我如何得到ActiveRecord关联这个类模型

  2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  6. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  7. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  8. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  9. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  10. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

随机推荐