77百科网
当前位置: 首页 生活百科

keyboard三个参数(KeyboardEvent键盘事件和TextEvent文本事件-王唯)

时间:2023-07-05 作者: 小编 阅读量: 2 栏目名: 生活百科

下面希望有你要的答案,我们一起来看看吧!keyboard三个参数本内容是《Web前端开发之Javascript视频》的课件,请配合大师哥《Javascript》视频课程学习。

keyboard三个参数?本内容是《Web前端开发之Javascript视频》的课件,请配合大师哥《Javascript》视频课程学习,我来为大家科普一下关于keyboard三个参数?下面希望有你要的答案,我们一起来看看吧!

keyboard三个参数

本内容是《Web前端开发之Javascript视频》的课件,请配合大师哥《Javascript》视频课程学习。

DOM2级事件最初规定了键盘事件,但在最终定稿之前又删除了相应的内容;结果,对键盘事件的支持主要遵循的是DOM0级,DOM3级为键盘事件制定规范,但现代浏览器还没有完全实现;

txt.addEventListener("keydown", function(event){console.log(event);// KeyboardEvent});

KeyboardEvent类:

描述了用户与键盘的交互,提供了有关键的详细信息;其继承自UIEvent类;

其使用3个键盘事件用于识别不同的键盘活动类型:

  • keydown:按下键盘上的任意键时触发,且按住不放的话,会重复触发;
  • keypress:按下键盘上的字符键时触发,且按住不放的话,会重复触发;按下Esc也会触发这个事件;
  • keyup:释放键盘上的键时触发;

keydown和keyup是低级键盘事件,无论按下或释放任何键,都会触发;keypress是高级键盘事件,只有按下可打印的字符的键,才会触发它;

虽然所有元素都支持以上3个事件,但只有在通过文本框输入文本时才最常用;

在用户按了一下键盘上的字符键时,其触发事件顺序是:keydown –> keypress –> keyup;其中keydown、keypress在文本框发生变化之前被触发;而keyup则是在文本框已经发生变化之后触发;

如果用户按下一个字符键不放,就会重复触发keydown和keypress事件,直接用户松开该键为止;

如果按下的是一个非字符键,其触发事件顺序是:keydown –> keyup;如果按住这个非字符键不放,会一直重复触发keydown事件,直到用户松开为止,此时会触发keyup事件;

键盘事件也支持辅助键,其事件对象中也有shiftKey、ctrlKey、altKey和MetaKey属性,IE不支持metaKey;

<p><textarea ></textarea><textarea ></textarea></p><script>var txtInput = document.getElementById("txtInput");txtInput.addEventListener("keydown", handlerEvent, false);txtInput.addEventListener("keypress", handlerEvent, false);txtInput.addEventListener("keyup", handlerEvent, false);function handlerEvent(event){var txt = document.getElementById("txt");event = event || window.event;txt.value= "\n"event.type;}</script>

event对象属性:

键码keyCode属性:键盘上的键都会对应一个UniCode值,这个值就是keyCode键码;该属性已被DOM3废弃,但所有浏览器都支持它;

对于keydown及keyup事件来说,所有键被按下都可以被触发,所以它们关注的是键,其event对象的keyCode返回的就是键码,与键盘上一个特定的物理键对应;对于字符键来说,与它的大小写无关,如:字母A和a的值都是65;

txt.addEventListener("keydown", function(event){// 字母a和A均为65,回车为13,ctrl为17等console.log(event.keyCode);});

键 键码

  • 退格(Backspace)8
  • 制表(Tab)9
  • 回车(Enter)13
  • 上档(Shift)16
  • 控制(Ctrl)17
  • Alt18
  • 暂停/中断(Pause/Break)19
  • 大写锁定(Caps Lock)20
  • 退出(Esc)27
  • 空格(Space)32
  • 上翻页(Page Up)33
  • 下翻页(Page Down)34
  • 结尾(End)35
  • 开头(Home)36
  • 左箭头(Left Arrow)37
  • 上箭头(Up Arrow)38
  • 右箭头(Right Arrow)39
  • 下箭头(Down Arrow)40
  • 插入(Ins)45
  • 删除(Del)46
  • 字母键(A-Z)65-90
  • 左windows键91
  • 右Windows键92
  • 上下文菜单键93
  • 数字小键盘0-996-105
  • 数字小键盘 107
  • 数字小键盘-及大键盘的-109
  • 数字小键盘.110
  • 数字小键盘/111
  • F1-F12112-123
  • 数字锁(Num Lock)144
  • 滚动锁(Scroll Lock)145
  • 分号FF为59,其他为186
  • 等于(=)187
  • 小于(或逗号)188
  • 减号(-)189
  • 大于(或句号)190
  • 正斜杠191
  • 沉音符(`)192
  • 等于61
  • 左方括号219
  • 反斜杠220
  • 右方括号221
  • 单引号222
  • Fn255

注:在Firefox和低版本的Opear中,分号键的值为59,即ASCII中分号的编码;但其他浏览器返回186,即键码;

对于keypress事件,只能是可打印字符键被按下才会触发,此时,keyCode返回的是该字符对应的Unicode字符代码,其与键码是不一样的;

txt.addEventListener("keydown", function(event){console.log("键码:"event.keyCode); // A和a为65});txt.addEventListener("keypress", function(event){console.log("字符代码:"event.keyCode); // A为65,a为97});

键 代码

  • 0-948-57
  • A-Z65-90
  • a-z97-122
  • 空格32
  • 波浪符126
  • 感叹号33
  • @64
  • #35
  • $36
  • %37
  • &38
  • (40
  • )41
  • 43
  • * 42
  • ^94
  • _95
  • 左方括号91
  • 反斜杠92
  • 右方括号93
  • 左花括号123
  • 竖线124
  • 右花括号125
  • 单引号39
  • 双引号34
  • 冒号58
  • 分号59
  • 逗号44
  • 句号46
  • 斜框47
  • 小于号60
  • 大于号62
  • 问号63
  • 回车13

示例:

// 数字编辑限制// 8: 退格键// 46:Delete// 37-46:方向键// 48-57:小键盘区的数字// 96-105:主键盘区的数字// 110、190:小键盘区和主键盘区的小数点// 189、109:小键盘区和主键盘区的负号。// 13: 回车// 9:Tabvar txt = document.getElementById("txt");txt.addEventListener("keydown", numOnkeyDown, false);function numOnkeyDown(event){if(!isValidNum(event.keyCode)){event.preventDefault();return false;}}function isValidNum(keyCode){return (keyCode == 8 ||keyCode == 9 ||keyCode == 46 ||keyCode == 109 ||keyCode == 110 ||keyCode == 189 ||keyCode == 190 ||(keyCode >= 37 && keyCode <= 46) ||(keyCode >= 48 && keyCode <= 57) ||(keyCode >= 96 && keyCode <= 105));}

示例:屏蔽按键组合键,如:

document.addEventListener("keydown", keyDownHandler, false);function keyDownHandler(event){// 屏蔽Alt方向键if((event.altKey) &&((event.keyCode == 37) || (event.keyCode == 39))){console.log("不能使用Alt 方向键前进或后退网页");event.preventDefault();}// 屏蔽退格删除键和F5刷新键if((event.keyCode == 8) || (event.keyCode == 116)){event.preventDefault();}// 屏蔽Ctrlnif((event.ctrlKey) && (event.keyCode == 78)){event.preventDefault();}// 屏蔽F11,即全屏if(event.keyCode == 122){event.preventDefault();}// 以下为禁止查看网页源代码,即禁用// F12、Ctrl Shift I、Ctrl u及鼠标右击// 屏蔽Ctrlu,即查看源文件if((event.ctrlKey) && (event.keyCode == 85)){console.log("no no");event.preventDefault();}// 屏蔽ShiftF10,即网页菜单if((event.shiftKey) && (event.keyCode == 121)){event.preventDefault();}// 屏蔽F12if(event.keyCode == 123){event.preventDefault();}// 屏蔽CtrlShiftIif(event.ctrlKey && event.shiftKey && (event.keyCode == 73)){event.preventDefault();}}// 屏蔽鼠标右键document.addEventListener("contextmenu", function(event){event.preventDefault();},false);

字符编码charCode属性:该属性返回 keypress 事件触发时按下的字符键的字符Unicode值,在其他事件中返回0;该事件已被DOM3废弃,推荐使用key属性代替它,但至今,所有浏览器都还支持;

txt.addEventListener("keypress", function(event){console.log("keyCode:"event.keyCode);console.log("charCode:"event.charCode); // 两者值一样});

在keypress事件中,keyCode属性返回值(也是字符编码,因此它)与charCode一致;

IE8及以下和低版本的opear不支持charCode属性,它们是在发生keypress事件对象的keyCode中保存Unicode编码;

另外,某些低版本的浏览器在产生非打印字符时也会触发keypress事件,但此时其charCode值为0,为此可以检测其charCode属性值为0的情况;

特别要注意,通过中文输入法输入的字符,不会触发keypress事件,但会触发keydown及keyup事件,不过,事件对象的charCode为0,而keyCode总是返回229;

跨浏览器取得字符编码,添加到eventutil.js文件中:

getCharCode: function(event){if(typeof event.charCode == "number")return event.charCode;elsereturn event.keyCode;}

应用:

EventUtil.addHandler(txtInput, "keypress", function(event){event = EventUtil.getEvent(event);console.log(EventUtil.getCharCode(event));});

which属性:返回一个键按下时的字符码(charCode),可以发生在keydown、keyup和keypress事件中;如:

var txt = document.getElementById("txt");txt.addEventListener("keypress", function(event){console.log(event.which);console.log(event.charCode);},false);

在keypress事件中,其行为与值与charCode一致,在keydown及keyup事件中可以返回所有键的UniCode编码;

IE8 及其更早版本不支持 which 属性,不支持的浏览器可使用 keyCode 属性;另外,keyCode属性在Firefox的onkeypress事件中是无效的,所以,兼容这些浏览器可以:

var x = event.which || event.keyCode;

在DOM3事件标准中,已删除这个属性了,但所有的浏览器都支持该属性;

示例:

var username = document.getElementById("username");var userpwd = document.getElementById("userpwd");username.addEventListener("keydown", function(event){var keyCode = event.which ? event.which : event.keyCode;if(keyCode == 13)userpwd.focus();});userpwd.addEventListener("keydown", function(event){var keyCode = event.which ? event.which : event.keyCode;if(keyCode == 13)login();elsereturn false;});function login(){console.log("登录");}

key属性:DOM3级事件对键盘事件做出了一些改变,删除了keyCode、charCode和which属性,增加了新属性:key,用于获取键名;

console.log(event.key);

key属性是为了取代keyCode而新增的,它的值就是相应的文本字符(如“a”或“A”),就是键名,在按下非字符键时,key的值是相应键的名(如“Shift”或“Down”);

示例:验证一个电话号码,只接受数字、 、()、-、ArrowLeft、ArrowRight、Delete或Backspace,如:

txt.addEventListener("keydown", function(event){var key = event.key;var result = (event.key >= "0" && event.key <= "9") ||[" ","(",")","-","ArrowLeft","ArrowRight","Delete","Backspace"].includes(event.key);if(!result)event.preventDefault();});

示例:使用按键移动元素:

<style>#mouse {display: inline-block;cursor: pointer;margin: 0;}#mouse:focus {outline: 1px dashed black;}</style><p>单击选中图案,并使用方向键移动</p><pre >__(q\_/p)/. .\=\_t_/=__/\((()))/\) (/\/\Y/-'nn^nn</pre><script>mouse.tabIndex = 0;mouse.onclick = function() {this.style.left = this.getBoundingClientRect().left'px';this.style.top = this.getBoundingClientRect().top'px';this.style.position = 'fixed';};mouse.onkeydown = function(e) {switch (e.key) {case 'ArrowLeft':this.style.left = parseInt(this.style.left) - this.offsetWidth'px';return false;case 'ArrowUp':this.style.top = parseInt(this.style.top) - this.offsetHeight'px';return false;case 'ArrowRight':this.style.left = parseInt(this.style.left)this.offsetWidth'px';return false;case 'ArrowDown':this.style.top = parseInt(this.style.top)this.offsetHeight'px';return false;}};</script>

所有浏览器都支持key属性,IE还支持一个char属性,其作用与key类似,但只有字符键才返回值;

Safari和Chrome浏览器还为事件对象定义了类似key的keyIdentifier属性,对于功能键,返回“Shift”、“Enter”等,对于可打印字符,返回这个字符的Unicode编码,如A键,值就是“U 0041”;但目前所有浏览器都把这个属性删除了;

code属性:代表触发事件的物理按键;

txt.addEventListener("keydown", function(event){console.log("key:"event.key);console.log("code:"event.code);});

字母键返回:“Key<Letter>”,如:“KeyA”,“KeyB”等;数字键返回:“Digit<number>”,如:“Digit0”、“Digit1”等;特殊键按其名称编码:“Enter”、“Backspace”、“Tab”等;

在不同的系统上,其所对应的物理按钮键值有差异,以下以windows为例:

键 code值

  • ESCEscape
  • 数字0-9Digit0-Digit9
  • Minus"Minus"
  • Equal"Equal"
  • Backspace"Backspace"
  • Tab"Tab"
  • A-ZKeyA-KeyZ
  • Bracket"BracketLeft"/"BracketRight"
  • Enter"Enter"
  • Control"ControlLeft"/"ControlRight"
  • Semicolon"Semicolon"
  • Quote"Quote"
  • Backquote"Backquote"
  • Shift"ShiftLeft"/”ShiftRight”
  • Backslash"Backslash"
  • Comma"Comma"
  • Period"Period"
  • Slash"Slash"
  • Alt"AltLeft"/”AltRight”
  • Space"Space"
  • CapsLock"CapsLock"
  • F1-F12"F1"-“F12”
  • Pause"Pause"
  • ScrollLock"ScrollLock"
  • PrintScreen"PrintScreen"
  • Numpad0-9"Numpad0"-“Numpad9”
  • NumpadSubstract"NumpadSubtract" (减法)
  • NumpadAdd"NumpadAdd"(加法)
  • NumpadDecimal"NumpadDecimal"
  • NumpadMultiply"NumpadMultiply"
  • IntBackslash"IntlBackslash" (反斜杠,除法)
  • NumpadEqual"NumpadEqual" (等于)
  • NumLock"NumLock"
  • Home"Home"
  • End"End"
  • ArrowUp"ArrowUp"
  • ArrowLeft"ArrowLeft"
  • ArrowRight"ArrowRight"
  • ArrowDown"ArrowDown"
  • PageUp"PageUp"
  • PageDown"PageDown"
  • Insert"Insert"
  • Delete"Delete"
  • Meta"MetaLeft"/ “MetaRight
  • ContextMenu"ContextMenu"
  • Power"Power"
  • BrowserSearch"BrowserSearch"
  • BrowserFavorites "BrowserFavorites"
  • BrowserRefresh "BrowserRefresh"
  • BrowserStop "BrowserStop"
  • BrowserForward "BrowserForward"
  • BrowserBack "BrowserBack"
  • LaunchApp1LaunchApp1"
  • LaunchMail “LaunchMail"

另外,针对输入法输入,key属性是识别不了的,其会返回“Process“,而code属性返回还是其物理键码;

不同的语言,key值是不同的,但code是一样的;如:

document.addEventListener("keydown", function(event){if(event.code == "KeyZ" &&(event.ctrlKey || event.metaKey)){console.log("Undo");}},false)

示例:用键盘控制一个元素:结构与样式:

<style>.world{margin:0;padding:0;background-color:black;width:400px;height:400px;}#spaceship{fill:orange; stroke:red;stroke-width:2px;}</style><svg ><polygonpoints="15,0 0,30 30,30" /></svg><script>refresh();</script><script>var shipSize = {width:30, height:30};var position = {x:200, y:200};var moveRate = 9, turnRate = 5, angle = 0;var spaceship = document.getElementById("spaceship");function updatePosition(offset){var rad = angle * (Math.PI / 180);position.x= (Math.sin(rad) * offset);position.y -= (Math.cos(rad) * offset);if(position.x < 0)position.x = 399;else if(position.x > 399)position.x = 0;if(position.y < 0)position.y = 399;else if(position.y > 399)position.y = 0;}function refresh(){var x = position.x - (shipSize.width / 2);var y = position.y - (shipSize.height / 2);var transform = "translate("x" "y") rotate("angle" 15 15 "")";spaceship.setAttribute("transform", transform);}</script>

应用:

window.addEventListener("keydown", function(event){if(event.preventDefaulted)return;switch(event.code){case "KeyS":case "ArrowDown":updatePosition(-moveRate);break;case "KeyW":case "ArrowUp":updatePosition(moveRate);break;case "KeyA":case "ArrowLeft":angle -= turnRate;break;case "KeyD":case "ArrowRight":angle= turnRate;break;}refresh();event.preventDefault();// 这样它就不会被处理两次}, true);refresh();

repeat属性:是一个只读属性,返回一个布尔值,如果按键被一直按住,返回值为true

txt.addEventListener("keydown", function(event){console.log(event.repeat);},false);

辅助键:键盘事件对象也支持辅助键,有altKey、ctrlKey、shiftKey和metaKey属性(与鼠标事件的辅助键一样):

function handlerEvent(event){var txt = document.getElementById("txt");event = event || window.event;txt.value= "\n"event.type;txt.value= "\nkeyCode:"event.keyCode;txt.value= "\ncharCode:"event.charCode;var arrKeys = [];if(event.shiftKey) arrKeys.push("shift");if(event.altKey) arrKeys.push("alt");if(event.ctrlKey) arrKeys.push("ctrl");txt.value= "\n按钮:"arrKeys; }

getModifierState()方法:

DOM3级还为event对象添加了getModifierState()方法,该方法接收一个参数,即等于Shift、Control、AltGraph或Meta的字符串,表示要检测的辅助键,如果指定的辅助键是活动的,该方法返回true,否则返回false;

if(event.getModifierState){console.log(event.getModifierState("Shift"));}

通过event对象的shiftKey、altKey、ctrlKey和metaKey属性也可以取得类似的属性;IE8及以下不支持此方法;

location属性:DOM3级事件添加了一个名为location的属性,返回一个long型的常量值,表示按下了什么位置的键:DOM_KEY_LOCATION_STANDARD值为0表示默认键盘、DOM_KEY_LOCATION_LEFT值为1表示左侧位置(例如左位的Alt键)、DOM_KEY_LOCATION_RIGHT值为2表示右侧位置(例如右侧的Shift键)、DOM_KEY_LOCATION_NUMPAD值为3表示数字小键盘、DOM_KEY_LOCATION_MOBILE值为4表示移动设备键盘(也就是虚拟键盘)、DOM_KEY_LOCATION_JOYSTICK值为5表示手柄(如控制器);(其中4和5被废弃了)

console.log(event.location);

location属性可用于keydown和keyup事件,但不能用于keypress事件;IE8及以下和其他低版本的浏览器不支持location属性;低版本的Chrome还支持一个keyLocation等价属性,但该值除了按下数字键盘返回3,其他都返回0,该属性现已废弃;

示例:键盘快捷键的Keymap类:说明:把像PageUp、Alt_Z和ctrl alt shift F5这些按键的标识符映射到Javascript函数,这些函数会作为按键的响应而调用;以javascript对象的形式把按键的绑定传给Keymap()构造函数,在对象中属性名是按键标识符,而属性值是处理程序函数;使用bind()和unbing()方法添加和移除绑定,使用install()方法在HTML元素(通常是document对象)上配置Keymap;通过在元素上注册keydown事件处理程序配置Keymap;每次键被按下,处理程序检查是否有与按键相关的函数,如果有,则调用它;在keydown事件处理程序中如果能使用DOM3级事件的key属性就优先使用它,如果没有,会查找Webkit的keyIdentifier属性然后使用它,否则,使用keyCode属性;保存为Keymmap.js;如:

// 构造函数function Keymap(bindings){this.map = {}; // 定义按键标识符->处理程序映射if(bindings){// 给它复制初始绑定for(name in bindings)this.bind(name, bindings[name]);}}// 绑定指定的按键标识符和指定的处理程序Keymap.prototype.bind = function(key, func){this.map[Keymap.normalize(key)] = func;};// 删除指定按键标识符的绑定Keymap.prototype.unbind = function(key){delete this.map[Keymap.normalize(key)];};// 在指定HTML元素上配置KeymapKeymap.prototype.install = function(element){// 这是事件处理程序var keymap = this;function handler(event){// console.log(event);return keymap.dispatch(event, element);}// 安装if(element.addEventListener)element.addEventListener("keydown", handler, false);else if(element.attachEvent)element.attachEvent("onkeydown", handler);}// 基于Keymap绑定分派按键事件Keymap.prototype.dispatch = function(event, element){// 开始没有辅助键和键名var modifiers = "";var keyname = null;// 按照标准的小写字母顺序构建辅助键字符串if(event.altKey) modifiers= "alt_";if(event.ctrlKey) modifiers= "ctrl_";if(event.metaKey) modifiers= "meta_";if(event.shiftKey) modifiers= "shift_";// 如果实现DOM3级规范的key属性,获取keyname很容易if(event.key) keyname = event.key;// 在Safari和Chrome上用keyIdentifier获取功能键键名else if(event.keyIdentifier && event.keyIdentifier.substring(0,2) !== "U ")keyname = event.keyIdentifier;// 否则,使用keyCode属性和后面编码到键名的映射else keyname = Keymap.keyCodeToKeyName[event.keyCode];// 如果不能找出键名,只能返回并忽略这个事件if(!keyname) return;// 标准的按键id是辅助键加上小写的键名var keyid = modifierskeyname.toLowerCase();// 现在查看按键标识符是否绑定了任何东西var handler = this.map[keyid];if(handler){ // 如果这个键有处理程序,则调用// 调用处理程序var retval = handler.call(element, event, keyid);// 如果处理程序返回false,取消默认行为并阻止冒泡if(retval === false){if(event.stopPropagation)event.stopPropagation();elseevent.cancelBubble = true;if(event.preventDefault)event.preventDefault();elseevent.returnValue = false;}return retval;// 返回处理程序的返回值}};// 用于把的按键标识符转换成标准形式的工具函数// 在非Mac,把meta映射到ctrl// 在Mac,把"Meta C"变成"Command C",其他都是"Ctrl C"Keymap.normalize = function(keyid){keyid = keyid.toLowerCase();var words = keyid.split(/\s |[\- _]/);// 分割辅助键和键名var keyname = words.pop(); // 键名是最后一个keyname = Keymap.aliases[keyname] || keyname; // 它是别名吗?words.sort();// 排序剩下的辅助键words.push(keyname);// 添加到序列化名字后面return words.join("_");// 拼接并返回};// 把按键的常见别名映射到它们的正式名Keymap.aliases = {"escape": "esc", // 键名使用DOM3级事件的定义和后面的编码到键名的映射"delete": "del", // 所有的键和值都必须小写"return": "enter","ctrl": "control","space": "spacebar","ins": "insert"};Keymap.keyCodeToKeyName = {// 使用词或方向键的按键8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Control", 18: "Alt",19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Spacebar", 33: "PageUp",34: "PageDown", 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right",40: "Down", 45: "Insert", 46: "Del",// 主键盘(非数字小键盘)上的数字键48: "0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",// 字母按键,注意不区分大小写65:"A",66:"B",67:"C",68:"D",69:"E",70:"F",71:"G",72:"H",73:"I",74:"J",75:"K",76:"L",77:"M",78:"N",79:"O",80:"P",81:"Q",82:"R",83:"S",84:"T",85:"U",86:"V",87:"W",88:"X",89:"Y",90:"Z",// 数字小键盘的数字和标点符号按键96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"Multiply",107:"Add",109:"Subtract",110:"Decimal",111:"Divide",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",124:"F13",125:"F14",126:"F15",127:"F16",128:"F17",129:"F18",130:"F19",131:"F20",132:"F21",133:"F22",134:"F23",135:"F24",59:";",61:"=",186:";",187:"=",188:",",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"};

应用:

<textarea ></textarea><script>function fnPageUp(){console.log("pageup");return false; }function fnArrowUp(){console.log("arrowup");}function fnEnter(){console.log("enter");return false;}var obj = {"PageUp":fnPageUp, "ArrowUp":fnArrowUp, "Enter": fnEnter};var km = new Keymap(obj);var txt = document.getElementById("txt");km.install(txt);</script>

文本事件:

文本类事件,只有一个textinput,当在可编辑区域中输入字符时,会触发此事件;

var txt = document.getElementById("txt");txt.addEventListener("textinput", function(event){console.log(event);// TextEvent});

但只有IE支持,其他所有浏览器都不支持;但却存在一个不标准的textInput事件,注意Input的第一个字母是大写;

txt.addEventListener("textInput", function(event){console.log(event);// TextEvent});

但除了Webkit浏览器支持,IE和Firefox不支持textInput事件;

该事件是对keypress的补充,用意是在将文本显示给用户之前拦截文本,也就是在文本插入文本框之前会触发textinput事件;

但是两者有些不同:

任何可以获得焦点的元素都可以触发keypress事件,但只有可编辑元素才能触发textinput事件;

textinput事件只会在用户按下能够输入实际字符的键时才会被触发,而keypress事件则在按下那些能够影响文本显示的键时也会触发(如退格键);

textinput事件event对象还包含一个data属性,其值就是输入的字符;

EventUtil.addHandler(txtInput, "textinput", function(event){event = EventUtil.getEvent(event);console.log(event.data);});

另外,textinput是先于keyup、后于keypress触发,如果在keypress事件中阻止了默认行为,那么textinput事件就有可能不会被触发了,如:

txt.addEventListener("textInput", function(event){console.log(event.type);});txt.addEventListener("textinput", function(event){console.log(event.type);});txt.addEventListener("keypress", function(event){console.log(event.type);event.preventDefault();});

textinput事件不是键盘的特定事件,无论通过键盘、剪切和粘贴、拖放等方式,每当发生文本输入时就会触发它;

event对象的inputMethod属性是一组常量值,表示文本输入的方式(也就是所谓的输入源),如:0表示浏览器不确定是怎么输入的、1表示是使用键盘输入、2表示是粘贴进来的、3表示是拖放进来的、4表示是使用IME输入的、5表示是通过在表单中选择某一项输入的、6表示是通过手写输入的、7表示是通过语音输入的、8表示是通过几种方法组合输入的、9表示是通过脚本输入的;

通过这个属性可以确定文本是如何输入到控件中的,但只有IE支持inputMethod属性;

对于键盘输入,data属性通常只保存单个字符,但其他输入源通常可能包含多个字符;对于keypress事件来说,一个keypress事件表示输入的单个字符,其使用keyCode或charCoode属性来保存的,返回的是对应的Unicode编码,因此需要使用String.fromCharCode()方法进行转换,如:

var txt = document.getElementById("txt");txt.addEventListener("textInput", function(event){console.log("textInput:"event.data);});txt.addEventListener("keypress", function(event){console.log("keypress:"String.fromCharCode(event.charCode));});

可以通过取消textinput、textInput和keypress事件来阻止字符输入,这意味着可以使用这些事件来过滤输入,如:过滤用户输入,保存为InputFilter.js

// HTML代码示例// 邮政编码:<inputtype="text" data-allowed-chars="0123456789"//data-message />// <span>只支持数字</span>function inputfilter(){console.log("filter");// 查找所有<input>元素var inputelts = document.getElementsByTagName("input");for(var i=0, len = inputelts.length; i<len; i){var elt = inputelts[i];// 跳过不是文本域或没有data-allowed-chars属性的元素if(elt.type != "text" || !elt.getAttribute("data-allowed-chars"))continue;// 在input元素上注册事件处理程序if(elt.addEventListener){elt.addEventListener("keypress", filter, false);elt.addEventListener("textInput", filter, false);elt.addEventListener("textinput", filter, false);}else{elt.attachEvent("onkeypress", filter);}}// 处理程序function filter(event){var e = event || window.event;var target = e.target || e.srcElement;var text = null;// 输入的文本// 获取输入的字符或文本if(e.type === "textinput" || e.type==="textInput" )text = e.data;else{var code = e.charCode || e.keyCode;// 如果按下的是功能键,不要过滤if(code < 32 ||// ASCII控制字符e.charCode == 0 || // Firefox的功能键e.ctrKey || e.altKey)// 辅助键return;text = String.fromCharCode(code);}var allowed = target.getAttribute("data-allowed-chars"); // 合法字符var messageid = target.getAttribute("data-messageid");// 信息元素idif(messageid)var messageElement = document.getElementById(messageid);for(var i=0, len=text.length; i<len; i){var c = text.charAt(i);if(allowed.indexOf(c) == -1){if(messageElement)messageElement.style.visibility = "visible";if(e.preventDefault)e.preventDefault();if(e.returnValue)e.returnValue = false;return false;}}if(messageElement)messageElement.style.visibility = "hidden";}};

应用:

<p><inputtype="text" data-allowed-chars="0123456789" data-message /><span>只支持数字</span></p><script>window.onload = function(){inputfilter();}</script>

InputEvent事件:

InputEvent类用来构造和字符输入相关的事件对象;

input事件:

当一个 <input>、<select>或<textarea>元素的 value 被修改时,就会触发 input事件;如:txt.addEventListener("input", function(event){console.log(event);// InputEvent});

另外,可编辑元素也可添加input事件;

keypress和textinput事件是在新输入的文本真正插入到可编辑区域元素前触发的,所以能够在事件处理程序中取消事件或阻止文本插入;而input事件,其是在文本插入后才触发事件,因此,这个事件不能取消,不能指定其事件对象中的最新文本;如:

姓名:<input type="text" oninput="this.value = this.value.toUpperCase();" />

该事件和文本事件一样,拥有data和isComposing属性;

data属性:只读,返回当前输入的字符串,如果是删除操作,则该值为空字符串;

isComposing属性:只读,返回一个布尔值,表明该事件是在触发compositionstart事件之后且触发 compositionend事件之前触发的,也就是表明当前输入的字符是输入法的输入的;

txt.addEventListener("input", function(event){console.log(event.data);console.log(event.isComposing);});

如果更改未插入文本(例如删除字符时),则其可能为空字符串;

inputType属性:表示当前编辑文本的类型,如果是插入文本,值为insertText,如果是Delete删除字符,值为ddeleContentForward,如果是Backspace删除字符,值为deleteContentBackward,如果剪切文本,值为deleteByCut,如果是回车换行,值为insertLineBreak,如果是粘贴输入,值为insertFromPaste,如果是拖入,值为insertFromDrop;

IE虽然支持input事件,但是把它当作普通的Event类型的,因此,它没有data和isComposing属性;

IE8及以下不支持该事件,其提供了一个专用的propertychange事件,可以用来检测文本输入元素的value属性的变化;

如:跨平台:

function forceToUpperCase(element){if(typeof element === "string")element = document.getElementById(element);element.oninput = upcase;element.onpropertychange = upcaseOnPropertyChange;function upcase(event){this.value = this.value.toUpperCase();}function upcaseOnPropertyChange(event){var e = event || window.event;if(e.propertyName === "value"){// 移除事件处理程序,避免循环调用this.onpropertychange = null;this.value = this.value.toUpperCase();// 再恢复原来的propertychange处理程序this.onpropertychange = upcaseOnPropertyChange;}}}forceToUpperCase(document.getElementById("username"));

beforeinput事件:beforeinput 在<input>, <select> 或 <textarea> 的值即将被修改前触发,这个事件也可以在 contenteditable 被设置为 true 的元素和打开 designMode 后的任何元素上被触发;

var txt = document.getElementById("txt");txt.addEventListener("beforeinput", function(event){console.log(event.type);});txt.addEventListener("input", function(event){console.log(event.type);});

该事件是可以取消的,如果取消,input事件就不会被触发;

change事件:当用户更改<input>、<select>和<textarea>元素的值并提交这个更改时,change事件就是触发;和 input事件不一样的是,change事件并不是每次元素的value改变时都会触发;

该事件不可被取消;该事件属于Event类;

<input type="text"/><br/><p ></p><script>var txt = document.getElementById("txt");txt.addEventListener("change", function(event){var info = document.getElementById("info");info.innerHTML = event.target.value;});</script>

    推荐阅读
  • 河南的胡辣汤哪个好吃(郑州最好的胡辣汤)

    本朕以为,方中山的辣,辣中带香,滋味丰富,绝对有别于那种纯辣味,所以才形成独特的口感,受到嗜辣的郑州人民欢迎。好在这两家都已经又翻过身来,一家完全克隆了方中山模式,生意好的不要不要的,另一家深耕居民小区,口味终于固定下来。

  • 肚子上的赘肉做哪个动作比较好减(两周教你把肚肚赘肉减下去)

    两周教你把肚肚赘肉减下去如果你也是躺着,腹部看起来平坦,但是坐下来,腹部上的肉肉确实有三层,这就是复制机分离加骨盆前倾所导致的脂肪堆积你可以试试全球公认的萨尔曼进阶练习1⃣️交替伸腿2⃣️交替落腿3⃣️交替点地4⃣️并腿抬腿。

  • 少儿编程课程哪个比较好(少儿编程培训值得吗)

    家长王女士告诉记者。跟王女士一样想法的人很多。南师附中专职从事科技活动、科技创新比赛的一位老师在接受采访时表示,他并不赞成这种套件搭建。这位老师表示,南师附中对这种套件式的机器人竞赛获奖是不认可的。

  • 狗狗老是出现不舒服的表现(狗狗为什么总是目不转睛地看着你)

    有些超级害怕的狗狗还会直接避免目光接触。说明狗狗有可能是压力太大了,或者出现了疾病,主人要转移狗狗的注意力,解决它这种无所事事的凝视。关于狗狗的行为教育,主人最好要讲究方法,做到奖惩分明,狗狗做错了不应该动手打它,适当地教育纠正最好,平时给狗狗做训练时,它表现得好,要及时给予零食奖励。因为它想通过眼神给主人传递信号,如果狗狗真的想要一些东西,它们通常会提供其它线索以配合目光。

  • 陇西行原文翻译及赏析(陇西行介绍)

    陇西行原文翻译及赏析原文:誓扫匈奴不顾身,五千貂锦丧胡尘。可怜无定河边骨,犹是深闺梦里人。全诗反映了唐代长期征战带给人民的痛苦和灾难,表达了非战情绪。

  • 腌制整个辣椒的方法(如何腌制整个青辣椒)

    以下内容希望对你有帮助!腌制整个辣椒的方法原料:大豆油、酱油、盐、姜、大蒜、花椒、白糖。

  • 陶瓷补水如何做(做陶瓷补水的方法)

    下面内容希望能帮助到你,我们来一起看看吧!陶瓷补水如何做陶瓷在泥巴成型后,因为手工拉坯产品经利坯之后坯面常有细孔和细小刀痕,并附着坯粉和灰尘,如果直接施釉,烧制过程极易导致麻点、针孔、缩釉等釉面缺陷。所以在此就有了补水这道必须的工序。一般于补水前先清扫、吹净坯体内外的灰尘杂质等,在用特制的补水笔蘸清水刷抹。补水时应注意保持水清洁,经常换水,防止水中沾有油渍或污物、杂质,或者容易产生缩釉等缺陷。

  • 多名煤老虎现出原形

    靶向整治之下,多名“煤老虎”现出原形,“骗煤”“套煤”等问题浮出水面。广东省旅游控股集团有限公司原党委委员、副总经理邱庆新被开除党籍和公职。内蒙古地质矿产(集团)有限责任公司原董事长杨永宽严重违纪违法被开除党籍。内蒙古自治区纪委监委发布消息,自治区原国土资源厅党组书记、厅长白盾,内蒙古矿业(集团)有限责任公司党委副书记、总经理苏日勒格涉嫌严重违纪违法接受审查调查。

  • 元旦发给同学的祝福语简短(元旦祝福语简短送同学)

    元旦发给同学的祝福语简短天苍苍,野茫茫,假期总是不够长。花丛丛,鸟啾啾,元旦祝你乐悠悠。此信虽无墨香,笔尖祈愿徜徉,唯有华灯伴星解,举目间有祝福流淌;幸福新年时光,心中情谊激荡,愿您一生无忧,快乐满,幸福常伴,元旦欢畅!陈年钟声入元旦,爆竹炸响新岁添,斗转星移轮流换,欢天喜地又一年,风调雨顺看五洲,华夏抖擞换新颜。元旦到,元旦到,短信条条心意到。

  • 清洗鱼的方法(怎么清洗鱼)

    清洗鱼的方法首先找一个盆子,放上水后,把你所买的鱼放进去。或者一条一条的整理也行。刮鱼鳞时,左手抓着鱼的尾部,右手顺着尾部用小刀往上刮。这样能够防止小刀不小心把手弄伤了。鱼鳞刮完后,把水倒了。换上新水,然后把鱼肚子割开,把鱼肚子里面的东西淘洗干净。特别是鱼肚附近透明的鳞片。将鱼挂到院子里向阳的地方,注意防止猫和狗之类的小动物,别让它们偷吃了。待鱼表面的水分风干后,便可以炖鱼了。