前端怎么监听手机键盘是否弹起

在这里插入图片描述

摘要:

开发移动端中,经常会遇到一些交互需要通过判断手机键盘是否被唤起来做的,说到判断手机键盘弹起和收起,应该都知道,安卓和ios判断手机键盘是否弹起的写法是有所不同的,下面讨论总结一下两端的区别以及上线方式~

HTML:

IOS端可以通过 focusin focusout实现

window.addEventListener('focusin', () => {
  // 键盘弹出事件处理
  alert("ios键盘弹出事件处理")
});
window.addEventListener('focusout', () => {
  // 键盘收起事件处理
  alert("ios键盘收起事件处理")
})

安卓只能通过 resize 来判断屏幕大小是否发生变化来判断
由于某些 Android 手机收起键盘,输入框不会失去焦点,所以不能通过聚焦和失焦事件来判断。但由于窗口会变化,所以可以通过监听窗口高度的变化来间接监听键盘的弹起与收回。

const innerHeight = window.innerHeight
window.addEventListener('resize', () => {
  const newInnerHeight = window.innerHeight;
  if (innerHeight > newInnerHeight) {
    // 键盘弹出事件处理
    alert("android 键盘弹出事件");     
  } else {
    // 键盘收起事件处理
    alert("android 键盘收起事件处理")
  }
})

VUE:

键盘事件总结:
@keydown:监听键盘按下事件。
@keyup:监听键盘抬起事件。
@keypress:监听键盘按键事件,包括按下和抬起。
@keydown.enter:监听回车键按下事件。
@keydown.tab:监听Tab键按下事件。
@keydown.esc:监听Esc键按下事件。
@keydown.space:监听空格键按下事件。
@keydown.left:监听左箭头键按下事件。
@keydown.right:监听右箭头键按下事件。
@keydown.up:监听上箭头键按下事件。
@keydown.down:监听下箭头键按下事件。
@keydown.delete:监听删除键按下事件。
@keydown.backspace:监听退格键按下事件。
@keydown.[key]:监听其他特定键按下事件,例如@keydown.a监听字母A键按下事件。


@keydown@keyup指令来绑定键盘按键事件

<template>
  <div>
    <input type="text" @keydown.enter="handleEnterKey" />
  </div>
</template>

<script>
export default {
  methods: {
    handleEnterKey() {
      // 处理回车键按下事件
    },
  },
};
</script>

v-on指令来绑定键盘按键事件

<template>
  <div>
    <input type="text" v-on:keydown.enter="handleEnterKey" />
  </div>
</template>

<script>
export default {
  methods: {
    handleEnterKey() {
      // 处理回车键按下事件
    },
  },
};
</script>

window.addEventListener来全局监听键盘按键事件

<template>
  <div></div>
</template>

<script>
export default {
  mounted() {
    window.addEventListener('keydown', this.handleKeyDown);
  },
  beforeUnmount() {
    window.removeEventListener('keydown', this.handleKeyDown);
  },
  methods: {
    handleKeyDown(event) {
      if (event.key === 'Enter') {
        // 处理回车键按下事件
      }
    },
  },
};
</script>

vue-shortkey插件来监听键盘按键

<template>
  <div>
    <input type="text" v-shortkey.enter="handleEnterKey" />
  </div>
</template>

<script>
import VueShortkey from 'vue-shortkey';

export default {
  directives: {
    shortkey: VueShortkey,
  },
  methods: {
    handleEnterKey() {
      // 处理回车键按下事件
    },
  },
};
</script>

keydown事件监听器

<template>
  <div>
    <input type="text" ref="input" />
  </div>
</template>

<script>
export default {
  mounted() {
    this.$refs.input.addEventListener('keydown', this.handleKeyDown);
  },
  beforeUnmount() {
    this.$refs.input.removeEventListener('keydown', this.handleKeyDown);
  },
  methods: {
    handleKeyDown(event) {
      if (event.key === 'Enter') {
        // 处理回车键按下事件
      }
    },
  },
};
</script>

监听事件组件封装:

<template>
  <div></div>
</template>

<script>
export default {
  name: 'KeyboardEventListener',
  props: {
    event: {
      type: String,
      required: true,
    },
  },
  mounted() {
    window.addEventListener(this.event, this.handleEvent);
  },
  beforeUnmount() {
    window.removeEventListener(this.event, this.handleEvent);
  },
  methods: {
    handleEvent(event) {
      this.$emit('keydown', event);
    },
  },
};
</script>

可以在需要监听键盘事件的地方引入并使用KeyboardEventListener组件,并通过event属性传递需要监听的事件名称,同时监听keydown事件来处理具体的按键逻辑。

<template>
  <div>
    <KeyboardEventListener event="keydown.enter" @keydown="handleEnterKey" />
  </div>
</template>

<script>
import KeyboardEventListener from '@/components/KeyboardEventListener.vue';

export default {
  components: {
    KeyboardEventListener,
  },
  methods: {
    handleEnterKey(event) {
      // 处理回车键按下事件
    },
  },
};
</script>

通过封装组件,可以在需要监听键盘事件的地方直接引入并使用,避免重复的监听和处理逻辑,提高代码的可维护性和复用性

REACT:

在需要进行监听的Dom上添加 onKeyDown 方法:

<Button
     className='btn-add'
     type="primary"
     icon="search"
     onKeyDown={(e)=>this.handleKeyDown(e)}
     onClick={()=>this.handleSearch()}>
     {LangMapping.Search}
 </Button>

定义 handleKeyDown 方法及事件处理:

//keyCode 38=up arrow  40=down arrow   13=Enter
handleKeyDown = (e) => {
    if (e.keyCode === 13) {
        console.log("按下了Enter键")
        this.handleSearch();
    }
}

componentDidMount 钩子中定义键盘监听事件:

componentDidMount() {
    document.addEventListener('keydown',this.handleKeyDown);
}

componentWillUnmount 钩子中移除键盘监听事件:

componentWillUnmount() {
    document.removeEventListener('keydown',this.handleKeyDown);
}

ANGULAR:

检测键盘按下事件:
可以使用ng-keydown指令。该指令可以监听指定元素上的键盘按下事件,并在按下事件发生时调用指定的表达式

<input type="text" ng-keydown="handleKeyDown($event)">

我们在一个文本输入框上使用了ng-keydown指令,并将handleKeyDown函数绑定到该事件上。当用户按下键盘上的任意键时,handleKeyDown函数将被调用。

$scope.handleKeyDown = function(event) {
  console.log('Key down event:', event);
};

handleKeyDown函数接收一个事件对象作为参数。我们可以通过该事件对象来获取按下的键的信息,例如键码(keyCode)、键的字符表示(key)等

检测按键事件:
可以使用ng-keypress指令。该指令可以监听指定元素上的按键事件,并在按键事件发生时调用指定的表达式

<input type="text" ng-keypress="handleKeyPress($event)">

在一个文本输入框上使用了ng-keypress指令,并将handleKeyPress函数绑定到该事件上。当用户按下并且释放某个键时,handleKeyPress函数将被调用

$scope.handleKeyPress = function(event) {
  console.log('Key press event:', event);
};

ng-keydown指令类似,handleKeyPress函数也接收一个事件对象作为参数,我们可以通过该事件对象来获取按下的键的信息

区分按键类型:

有时候,我们可能需要区分按下的是哪种类型的按键,例如字母键、数字键、功能键等。在AngularJS中,我们可以使用事件对象的属性来区分按键类型

event.key:按下的键的字符表示,例如’a’、’0’、’Enter’等。
event.keyCode:按下的键的键码表示,对应于键盘上每个键的唯一标识。
event.shiftKey:按下了Shift键。
event.ctrlKey:按下了Ctrl键。
event.altKey:按下了Alt键。

通过检查事件对象的这些属性,我们可以根据需要来区分按键类型

$scope.handleKeyDown = function(event) {
  if (event.key === 'Enter') {
    console.log('Enter key pressed');
  } else if (event.keyCode >= 48 && event.keyCode <= 57) {
    console.log('Number key pressed');
  } else {
    console.log('Other key pressed');
  }
};

们根据按下的键的字符表示和键码表示来区分按键类型。如果按下的是Enter键,则输出”Enter key pressed”;如果按下的是数字键,则输出”Number key pressed”;如果按下的是其他键,则输出”Other key pressed”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/349010.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端学习生产环境、开发环境、测试环境

1、路径 定义是什么环境 NODE_ENVdevelopment 开发环境 2、.env 端口号 3、.env.development 开发环境 4、.env.production 生产环境 5、.env.test 测试环境 6、如何访问&#xff0c;通过process.env进行访问 学习中.......

SqlAlchemy使用教程(六) -- ORM 表间关系的定义与CRUD操作

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用SqlAlchemy使用教程(五) ORM API 编程入门 本章内容&#xff0c;稍微有…

SpringMVC-对静态资源的访问

1.工程中加入静态资源 在webapp下创建static文件夹&#xff0c;此文件夹专门放入静态资源 2.使项目可以处理静态资源的请求 在SpringMVC配置文件中添加以下语句 1.引入命名空间 xmlns:mvc"http://www.springframework.org/schema/mvc" xsi:schemaLocation“http…

Laravel 10.x 里如何使用ffmpeg

原理上很简单&#xff0c;就是使用命令行去调用ffmpeg&#xff0c;然后分析一下输出是不是有错误。 安装 首先安装 symfony/process&#xff0c;主要用于包装一下&#xff0c;用来代替 exec, passthru, shell_exec and system 。 composer require symfony/process composer…

75 C++对象模型探索。C++关于 虚函数表指针位置分析

如果一个类中&#xff0c;有虚函数&#xff0c;针对这个类会产生一个虚函数表。 生成这个类对象的时候&#xff0c;会有一个虚函数表指针&#xff0c;这个指针会指向这个虚函数表的开始地址。 我们本节就研究这个vptr指针。注意&#xff0c;vptr指针在 类对象中的位置。 证明…

【算法】糖果(差分约束)

题目 幼儿园里有 N 个小朋友&#xff0c;老师现在想要给这些小朋友们分配糖果&#xff0c;要求每个小朋友都要分到糖果。 但是小朋友们也有嫉妒心&#xff0c;总是会提出一些要求&#xff0c;比如小明不希望小红分到的糖果比他的多&#xff0c;于是在分配糖果的时候&#xff…

echarts 绘制垂直滚动热力图

问题1&#xff1a;提示功能无效 问题2&#xff1a;值筛选无效 效果 在线浏览 下载echarts官网例子(heatmap Examples - Apache ECharts) 稍作改动&#xff1a; generateData 入参改为长度和宽度noise.perlin2(i / 40, j / 20) Math.random() * 5y轴倒置指定zlevel为2 通过定…

链表--226. 翻转二叉树/medium 理解度A

226. 翻转二叉树 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&…

python:socket基础操作(3)-《udp接收消息》

收跟发基本核心思想差不多&#xff0c;只不过收信息需要去绑定一下端口&#xff0c;如果我们发信息没有绑定端口&#xff0c;那系统会随机分配一个&#xff0c;如果是收信息&#xff0c;那我们必须要求自己绑定端口才行 基础的接收数据 import socketudp_socket socket.socke…

华清远见作业第三十三天——C++(第二天)

思维导图&#xff1a; 题目&#xff1a; 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数&#xff1a; 初始化函数&#xff1a;void init(int w, int h) 更改宽度的函数&#xff1a;set_w(int w) 更改高度的函数…

如何使用 WebRTC 与 Kurento 建立视频会议 App

本文作者 WebRTC Ventures 工程师。在 RTC 2018 实时互联网大会上&#xff0c;WebRTC Ventures 的资深软件工程师&#xff0c;将围绕 WebRTC 开发带来经验分享。欢迎访问RTC 开发者社区&#xff0c;与更多WebRTC开发者交流经验。 了解 WebRTC 如何工作的一种简单方式是通过学习…

安全防御综合组网实验

题目 要求 生产区在工作时间可以访问服务器区&#xff0c;仅可以访问http服务器。办公区全天可以访问服务器区&#xff0c;其中10.0.2.20 可以访问FTP服务器和http服务器。10.0.2.10仅可以ping通10.0.3.10。办公区在访问服务器区时采用匿名认证的方式进行上网行为管理。办公区…

20.云原生之GitLab集成Runner

云原生专栏大纲 文章目录 GitLab RunnerGitLab Runner 介绍GitLab Runner分类GitLab Runner工作流程 Gitlab集成Gitlab RunnerGitLab Runner 版本选择Runner在CitLab中位置专用Runner在gitlab中位置群组Runner在gitlab中位置共享Runner在gitlab中位置 GitLab部署Gitlab Runner…

QT 官方例程阅读: XML Patterns 相关

标签用于在qt creator 中查询相关工程 一、标签 Schema Validator 模式验证器 就是根据 已知的XML 模式&#xff0c;验证输入的XML 文件格式是否匹配&#xff0c;不匹配可以输出不匹配位置 如下&#xff0c;&#xff0c;首先定义了contact 元素 的子元素列表&#xff0c;&…

【Redis】list以及他的应用场景

介绍 &#xff1a;list 即是 链表。链表是一种非常常见的数据结构&#xff0c;特点是易于数据元素的插入和删除并且且可以灵活调整链表长度&#xff0c;但是链表的随机访问困难。许多高级编程语言都内置了链表的实现比如 Java 中的 LinkedList&#xff0c;但是 C 语言并没有实现…

64、ubuntu使用c++/python调用alliedvisio工业相机

基本思想&#xff1a;需要使用linux系统调用alliedvisio工业相机完成业务&#xff0c;这里只做驱动相机调用&#xff0c;具体不涉及业务开发 Alvium 相机选型 - Allied Vision 一、先用软件调用一下用于机器视觉和嵌入式视觉的Vimba X 软件开发包 - Allied Vision VimbaX_Set…

解决在pycharm中无法进入conda环境的问题

问题原因&#xff1a; pycharm中使用的是Windows PowerShell 解决方法&#xff1a; setting -> Terminal中将shell path修改为win的即可--注意需要重启

Java技术栈 —— 手写Java数据库连接池

Java技术栈 —— 手写Java数据库连接池 一、连接池的作用二、讲解1.1 类图结构1.2 ConnectionPoolManager1.3 DataSourceConfig1.4 ConnectionPool与IConnectionPool1.5 ConnEntry 三、收获3.1 CopyOnWriteArrayList累的使用(对本文代码的一点建议和指正)3.2 AtomicInteger类的…

【嵌入式学习】C++QT-Day2-C++基础

笔记 见我的博客&#xff1a;https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度…

css display 左右对齐 技巧

.list_number{ display: flex; } .list_name_number{ width:100px; } //左边固定width .list_name_type{ //右边给flex:2 自动撑开 flex:2; }