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

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

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

下面希望有你要的答案,我们一起来看看吧!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>

    推荐阅读
  • 恐艾艾滋病窗口期(恐艾症可以休矣)

    恐艾艾滋病窗口期我们都知道艾滋病主要经由血液传播,如患有艾滋病的病人与正常人共用针头注射,现在这种情况主要是瘾君子过瘾时可能出现的情形,在过去有偿献血时疏于防范造成的献血者集中感染;其次为患病母亲在分娩时垂直传播给自己婴儿;偶发的输血事故和血液透析事故;职业暴露等都是艾滋病可能的传播方式。

  • 素火锅丸子的家常做法(教你做好吃的素丸子)

    素火锅丸子的家常做法大家好,我第一美食的阿飞,关注阿飞有更多的家常菜供大家参考!锅内烧油、油温5成热时起锅下丸子,抓一把馅料,在虎口处挤出丸子,用勺子把丸子挖入锅中。轻轻晃动炒锅,并用勺子轻推油面,使丸子受热均匀。

  • 出演家有儿女小雨现在情况(记得家有儿女小雨吗)

    年少成名,泯然众人尤浩然在拍摄了公益广告之后,受到了许多观众的一致好评,也因此获得了很多娱乐圈的好资源,各种影片一部接一部。然而随着尤浩然的慢慢长大,他的演艺事业却慢慢下滑。他的体重更是飙升到了180多斤,让人不得不感慨“岁月是把杀猪刀,在尤浩然身上刀刀暴击”。尤浩然开始下定决心减肥,无论是为了自己的身体健康,还是为了自己的演艺生涯。在减肥期间,尤浩然还上过综艺节目。

  • 属牛女孩高雅有涵养的名字(女孩寓意自信阳光的名字)

    属牛女孩高雅有涵养的名字雪烟-《水龙吟》-李纲-晚春天气融和,乍惊密雪烟空坠。寒艳-《渔家傲》-欧阳修-寒艳冷香秋不管。琼桂-《莺啼序》-高似孙-曲琼桂帐流苏暖,望美人、又是论千里。如凤-《安乐宫》-李贺-新成安乐宫,宫如凤凰翅。紫葵-《和胡西曹示顾贼曹》-陶渊明-流目视西园,晔晔荣紫葵。花琪-《题庐山植物园》--瑶花琪草争芳妍,东风必定压西风。

  • 有氧运动和无氧运动各有哪些(什么是无氧运动)

    由于无氧运动主要由高阻力运动组成,所有无氧运动又称力量运动、抗阻运动、循环阻力运动。力量运动或抗阻运动锻炼可以增加肌肉重量和力量,提高瘦体重比例,预防肥胖,有利于塑造良好的身材和体形;对心血管健康和改善血糖水平也具有促进作用;特别是对骨骼、关节和肌肉的强壮作用更大,这不仅可以延缓身体运动功能的丧失,还有助于预防老年人跌倒和骨折造成的伤害。

  • 长期熬夜有哪些影响(这四点危害你知道吗)

    使人感到疲劳,精神不振.抵抗力也就会随之下降。人体抵抗力下降后,感冒等呼吸道疾病、胃肠等消化道疾病也都会找上门来。更为严重的是时间长了,还会出现神经衰弱,失眠等症状。对从事高危行业的人来说.熬夜的危害就更大了,有可能引发意外伤害,甚至火灾、爆炸等恶性事故。此外眼部肌肉的疲劳还会导致视力下降。

  • 去甲醛味用什么植物(去甲醛味最好的四种植物介绍)

    去甲醛味用什么植物滴水观音滴水观音有清除空气灰尘的功效,可以去除甲醛等有害气体,并且滴水观音茎内的白色汁液有毒,避免误碰或误食,否则会产生中毒现象,但滴水观音并不属于致癌植物。铁线蕨铁线蕨每小时能吸收大约20微克的甲醛,因此被认为是有效的生物净化器,成天与油漆、涂料打交道者,或者身边有喜好吸烟的人,应该在工作场所放一盆蕨类植物。

  • 干蘑菇过期三年能吃吗(干蘑菇过期三年能不能吃)

    干蘑菇过期三年能吃吗不能,由于存放时间过长其营养成分被破坏,对身体无益处,同时过期干蘑菇容易滋生细菌或者产生毒素,食用会对人体造成伤害。干蘑菇是由鲜蘑菇经烤制等工艺加工而来的农产品。蘑菇具有极强的吸附性,必须单独贮存,即装贮蘑菇的容器不得混装其他物品,贮存蘑菇的库房不宜混贮其他物资。另外,不得用有气味挥发的容器或吸附有异味的容器装贮蘑菇。

  • 巅峰c罗vs梅西谁厉害(昔日足坛一百单八将)

    托雷斯宣布退役,金童告别让无数托蜜泪流。日本球星中村俊辅已经41岁,目前在日本磐田喜悦征战。如今,罗比尼奥并未达到期望中的高度,而梅西则在巴塞罗那成为了一代球王。唯一现役的法布雷加斯在先后效力阿森纳、巴萨、切尔西后,在法甲摩纳哥继续征战。比利亚在东亚日本的神户胜利船,埃托奥则效力于西亚卡塔尔的卡塔尔体育。当年的108将中,有多达20名意大利球员,15名巴西球员,12名阿根廷球员。

  • 粉色裤子搭配什么颜色上衣(粉色裤子应该怎么搭配上衣)

    下面内容希望能帮助到你,我们来一起看看吧!黑色百搭,能中和降低粉色的甜腻感,甜美又低调。可以选择黑色运动风上衣搭配粉色休闲裤,甜美运动风,非常有活力。这是同色系搭配方法,比较安全的搭配颜色,利用单品色度深浅和面料差异营造层次感。酒红色是一个非常时髦的红色,选择高领中修设计酒红色打底衫搭配粉色阔脱裤,甜美优雅。非常温柔优雅,灰色有高级感,搭配甜美的粉色,能够提升甜美气质。