键盘事件相关

转自下面两个链接:http://www.cnblogs.com/starof/p/6558581.html   http://www.cnblogs.com/cathsfz/archive/2011/05/29/2062382.html

 

在 JavaScript 中监听 IME 键盘输入事件

 

在 JavaScript 中监听用户的键盘输入是很容易的事情,但用户一旦使用了输入法,问题就变得复杂了。输入法应当如何触发键盘事件呢?是每一下击键都触发一次事件,还是选词完毕才触发事件呢?整句输入又该如何触发事件呢?不同的操作系统和不同的浏览器对此有不同的看法。在最糟糕的情况下,用户使用输入法后浏览器就只触发一次 keydown ,之后就没有任何的键盘事件了。这对于 Suggestion 控件的实现来说是个大问题,因为 Suggestion 控件需要监听文本输入框的变化,而事件是最准确也最节省计算资源的做法,如果换成轮询的话性能就可能受到影响。

首先,要监听启用输入法后的击键事件应当使用 keydown 事件,这是信息最丰富的一个事件,因为在启用输入法后别的键盘事件可能不会被触发。其次,大多数操作系统和浏览器都实现了一个事实标准,就是在用户使用输入法输入时, keydown 事件传入的 keyCode 取值为 229 。然而触发 keydown 的频率是不确定的,有些情况下每一下击键都触发事件,有些情况下只有选词完毕才触发事件。这时候,如果我们还是要实时监控文本框的内容变化,就必须使用轮询了。

var timer; 
var imeKey = 229; 

function keydownHandler (e) { 
  clearInterval(timer) 
  if (e.keyCode == imeKey) { 
    timer = setInterval(checkTextValue, 50); 
  } else { 
    checkTextValue(); 
  } 


function checkTextValue() { 
  /* handle input text change */ 
}

Opera 是一款有趣的浏览器,别人做的事情它都不做,别人都不做的事情它都喜欢做。例如说,它偏偏不支持 keyCode == 229 这个事实标准,而要使用 keyCode == 197 来表示输入法的使用。因此,你需要在上述代码的基础上做一下改良,如果监测到是 Opera 浏览器,就换一个 keyCode 常量来做比较。

var imeKey = (UA.Opera == 0) ? 229 : 197;

最后,还有一个更不受重视的浏览器叫做 Firefox for Mac 。估计是因为 Mac 版本对于 Mozilla 来说实在是太不重要了,所以很多 Windows 版本都没问题的地方 Mac 版本就会出小问题,例如说对上述事件的支持。 Firefox for Mac 不会出现 keyCode == 229 的情况,而且在输入法启用后只有第一下击键会触发 keydown 事件,因此只能在击键后一直使用轮询。

if (e.keyCode == imeKey || UA.Firefox > 0 && UA.OS == 'Macintosh') {

在添加了这两项改进后,实时监控文本框的变化就没有问题了,即使用户启用了输入法。完整的代码如下:

var timer; 
var imeKey = (UA.Opera == 0) ? 229 : 197; 

function keydownHandler (e) { 
  clearInterval(timer) 
  if (e.keyCode == imeKey || UA.Firefox > 0 && UA.OS == 'Macintosh') { 
    timer = setInterval(checkTextValue, 50); 
  } else { 
    checkTextValue(); 
  } 


function checkTextValue() { 
  /* handle input text change */ 
}

javaScript事件(七)事件类型之键盘与文本事件

 

 

  • 任何可以获得焦点的元素都可以触发keypress事件,但只有可编辑区域才能触发textInput事件。
  • textInput事件只会在用户按下能够输入实际字符的键时才会触发,而keypress事件则在按下那些能够影响文本显示的键时也会触发(比如退格键)。

data属性

textInput事件主要考虑的是字符,因此它的event对象中还包含一个data属性,data值为用户输入的字符。

  • 用户按下S键,data值就是“s”
  • 用户按下上档键时按下S键,data值就是"S"
EventUtil.addHandler(textbox,"textInput",function(event){event=EventUtil.getEvent(event);console.log(event.data);
});   

inputMethod属性

另外,event对象上还有一个属性,叫inputMethod,表示文本输入到文本框中的方式。使用这个属性可以确定文本是如何输入到控件中,从而验证其有效性。

  • 0,表示浏览器不确定是怎么输入的
  • 1,表示是使用键盘输入的
  • 2,表示文本是粘贴进来的
  • 3,表示文本是拖放进来的
  • 4,表示文本是使用IME输入的
  • 5,表示文本是通过在表单中选择某一项输入的
  • 6,表示文本是通过手写输入的(比如使用手写笔)
  • 7,表示文本是通过语音输入的
  • 8,表示文本是通过集中方法组合输入的
  • 9,表示文本是通过脚本输入的

兼容性:支持textInput属性的浏览器有IE9+,Safari和Chrome,只有IE支持inputMethod属性。

扩展阅读: 

javaScript事件(一)事件流

javaScript事件(二)事件处理程序

javaScript事件(三)事件对象

javaScript事件(四)event的公共成员(属性和方法)

javaScript事件(五)事件类型之鼠标事件 

转载于:https://www.cnblogs.com/wangjixianyun/p/6582912.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【R】语言第二课----- 变量的使用方法

num1<-c(9.1,8.2,7.3) num2<-1:10 char<-c(a,b,c) #单引号or双引号都可以 logit<-c(TRUE,FALSE,T,F) c(1,a,TRUE) sex<-c(F,M,F,M) sex sexf<-factor(sex) sexf num1[1]<-100 #索引一定要加方括号 num1[c(1,3)]<-c(99.9,77.7) num1[c(T,F,T)] num1[-2]…

Petuum - Careers

Petuum - CareersCloudformation

【R】语言第三课----矩阵

#矩阵 ?matrix m<-matrix(1:6,nrow 2,ncol3,dimnames list(c(r1,r2),c(c1,c2,c3))) m#默认按列排列 m<-matrix(1:6,nrow 2,ncol3,byrow T,dimnames list(c(r1,r2),c(c1,c2,c3)))m class(m) m[1,1] m[1,]# 相当于 m[c(T,F),] m[,1] m[r1,]m[1,] <- c(100,99,98…

谁说菜鸟不会数据分析--读书笔记

如果看不清可以下载下来&#xff0c;打开&#xff0c;放大。仅供参考。 转载于:https://www.cnblogs.com/sunshinewang/p/6591772.html

[MySQL 5.6优化] --order by limit x,x 优化

简介&#xff1a;order by limit x ,x 在实际工作中有各种业务需求要有order by的排序&#xff0c;有时候处理不好则会造成系统宕机&#xff01;原理&#xff1a;a.通过索引来获取排序b.通过内部算法获取排序&#xff1a; 案例具体SQL&#xff1a; SELECT c.order_price orderP…

【R】语言第四课----读取文件

install.packages("readxl") getwd() setwd("E:/作业4") library(readxl) tianmao<-read_excel(tianmaoTV.xlsx,skip1)#把第一行跳过&#xff0c;直接从第二行开始读取 #创建新变量 tianmao[total_sales]<-tianmao$current_price*tianmao$month_sale…

Html.Partial和Html. RenderPartial用法

Html.Partial和Html. RenderPartial用法Html.partial和RenderPartial的用法与区别Html.partial和RenderPartial都是输出html片段&#xff0c;区别在于Partial是将视图内容直接生成一个字符串并返回&#xff08;相当于有个转义的过程&#xff09;&#xff0c;RenderPartial方法是…

算术编码简单研究

算术编码 是一种无损数据压缩方法&#xff0c;也是一种熵编码的方法。和其它熵编码方法不同的地方在于&#xff0c;其他的熵编码方法通常是把输入的消息分割为符号&#xff0c;然后对每个符号进行编码&#xff0c;而算术编码是直接把整个输入的消息编码为一个数&#xff0c;一个…

Thinkphp5 还有这种操作?

2019独角兽企业重金招聘Python工程师标准>>> 在 _initialize 中取出 控制器名和方法名 define(CONTROLLER_NAME,Request::instance()->controller()); define(MODULE_NAME,Request::instance()->module()); define(ACTION_NAME,Request::instance()->actio…

【R】语言第五课----画图

?plot#高级绘图函数 可以完整地绘制出一张图 ?mtcars plot(mtcars$wt) plot(mtcars[,1:2]) plot(mtcars) plot(mtcars$wt,mtcars$disp) plot(mtcars$wt,mtcars$disp,typep) plot(mtcars$wt,mtcars$disp,typel) plot(mtcars$wt,mtcars$disp,typeb) plot(mtcars$wt,mtcars$disp…

Solidworks如何将参考平面的图形投影到某曲面上

1 画好草图&#xff0c;点击曲线-分割线 2 选择要投影的草图和被投影的面&#xff08;那个球面&#xff09;&#xff0c;最后效果如下图所示 3 为了获取连续的轨迹&#xff0c;我们可以再次选择这个草图&#xff0c;然后在投影面中选择平面&#xff0c;最后得到的图形如下图所示…

向极限挑战:算术编码 (转)

向极限挑战&#xff1a;算术编码 (转) http://blog.csdn.net/hhf383530895/archive/2009/08/24/4478605.aspx 我们在上一章中已经明白&#xff0c;Huffman 编码使用整数个二进制位对符号进行编码&#xff0c;这种方法在许多情况下无法得到最优的压缩 效果。假设某个字符的出…

np.random.seed(0)作用

在用python时时常会看到如下代码&#xff1a; import numpy as np np.random.seed(0) 其中np.random.seed(0)的作用是使得随机数据可预测&#xff0c;当我们设置相同的seed&#xff0c;每次生成的随机数相同。 如果不设置seed&#xff0c;则每次会生成不同的随机数&#xf…

发送邮件被退回,提示: Helo command rejected: Invalid name 错误

我自己配置的 postfix dovecot server&#xff0c; 配置了outlook 后&#xff0c; 相同的账号。 在有的电脑上能收发成功&#xff0c; 在有的电脑上发送邮件就出现退信。提示 Helo command rejected: Invalid name 错误。经过分析&#xff0c; 原来是计算机名的问题。 计算机名…

Series和DataFrame、相关性及NaN处理

pandas核心数据结构 pandas是以numpy为基础的&#xff0c;还提供了一些额外的方法 Series series用来表示一维数据结构&#xff0c;与python内部的数组类似&#xff0c;但多了一些额外的功能。 series内部由两个相互关联的数组组成&#xff1a;主数组用来存放数组&#xff…

Hive谓词解析过程分析

where col1 100 and abs(col2) > 0在Hive中的处理过程 where过滤条件称为谓词predicate。 以上where过滤条件在经过Hive的语法解析后&#xff0c;生成如下的语法树&#xff1a; TOK_WHERE AND TOK_TABLE_OR_C…

算术编码(Arithmetic Coding)源代码

Ian H. Witten、Radford M. Neal和John G. Cleary在1987年发表了一篇启发性的论文。论文中描述了一种基于整数运算的通用算术编码器&#xff0c;而且还给出了由计算错误导致的效率低下的分析。以下源代码来自于这篇论文&#xff1a;《基于算术编码的数据压缩》&#xff08;Arit…

pandas读写各种类型数据

read_X()通常是pandas模块下的&#xff0c;to_X()是dataframe的方法 CSV 读取 使用pandas.read_csv()方法&#xff0c;返回的是一个dataframe csv默认是以"&#xff0c;"分割的 csv文件内容 1、read_csv()默认以第一行数据作为标题 2、调用dataframe的head()方法…

python 类装饰器

1 装饰器无参数 class tracer: def __init__(self,func): self.calls 0 self.func func def __call__(self,*args): self.calls 1 print(call %s to %s %(self.calls, self.func.__name__)) self.func(*args) tracer def spam(a, b, c): print(a b c) …

【数据分析】使用pandas和numpy分析美国大选献金项目

1. 数据载入与总览 1.1 数据加载 #绘图工具 import matplotlib.pyplot as plt %matplotlib inline #数据处理工具 import numpy as np import pandas as pd from pandas import Series,DataFrame#数据路径自己指定&#xff0c;本案例数据路径就在当前文件夹下面子文件夹usa_e…