关于ExtJS4.1:快捷键支持的问题


Posted in Javascript onApril 24, 2013

问题一个页面有两个面板,都有一个【添加(F2)】按钮,如何做快捷键支持?图片示意

关于ExtJS4.1:快捷键支持的问题

第一次实现
感觉应该很简单,ExtJs提供了“Ext.util.KeyMap”,很容易做快捷键支持。
代码示例

/// <reference path="Ext/ext-all-debug-w-comments.js" /> Ext.onReady(function () {
     var viewport = Ext.create('Ext.container.Viewport', {
         layout: {
             type: 'vbox',
             align: 'stretch'
         },
         padding: 10,
         items: [{
             xtype: 'panel',
             id: 'panelA',
             title: '快捷键测试A',
             tbar: [{
                 text: '添加(F2)'
             }],
             frame: true,
             flex: 1,
             html: '您好,这里显示的表格或表单 。'
         }, {
             xtype: 'panel',
             id: 'panelB',
             title: '快捷键测试B',
             tbar: [{
                 text: '添加(F2)'
             }],
             frame: true,
             flex: 1,
             html: '您好,这里显示的表格或表单 。'
         }]
     });
     Ext.create('Ext.util.KeyMap', {
         target: 'panelA',
         key: Ext.EventObject.F2,
         fn: function (key, ev) {
             alert('添加A');
             ev.stopEvent();
             return false;
         }
     });
     Ext.create('Ext.util.KeyMap', {
         target: 'panelB',
         key: Ext.EventObject.F2,
         fn: function (key, ev) {
             alert('添加B');
             ev.stopEvent();
             return false;
         }
     });
 });    

实际结果

打开浏览器后直接按F2没有效果;打开浏览器后用鼠标点击A或B后再按F2同样没有效果。
第二次实现
原来是div元素必须增加tabindex=0的属性才行。
代码示例

/// <reference path="Ext/ext-all-debug-w-comments.js" /> Ext.onReady(function () {
     var viewport = Ext.create('Ext.container.Viewport', {
         layout: {
             type: 'vbox',
             align: 'stretch'
         },
         padding: 10,
         items: [{
             xtype: 'panel',
             id: 'panelA',
             title: '快捷键测试A',
             tbar: [{
                 text: '添加(F2)'
             }],
             frame: true,
             flex: 1,
             html: '您好,这里显示的表格或表单 。',
             autoEl: {
                 tag: 'div',
                 tabindex: 0
             }
         }, {
             xtype: 'panel',
             id: 'panelB',
             title: '快捷键测试B',
             tbar: [{
                 text: '添加(F2)'
             }],
             frame: true,
             flex: 1,
             html: '您好,这里显示的表格或表单 。',
             autoEl: {
                 tag: 'div',
                 tabindex: 0
             }
         }]
     });
     Ext.create('Ext.util.KeyMap', {
         target: 'panelA',
         key: Ext.EventObject.F2,
         fn: function (key, ev) {
             alert('添加A');
             ev.stopEvent();
             return false;
         }
     });
     Ext.create('Ext.util.KeyMap', {
         target: 'panelB',
         key: Ext.EventObject.F2,
         fn: function (key, ev) {
             alert('添加B');
             ev.stopEvent();
             return false;
         }
     });
 });

实际结果
打开浏览器后直接按F2没有效果;打开浏览器后用鼠标点击A或B后再按F2就有效果了。

第三次实现
要解决打开浏览器之后不用点击div就能识别快捷键,需要手动调用foucs()方法。
代码示例

/// <reference path="Ext/ext-all-debug-w-comments.js" /> Ext.onReady(function () {
     var viewport = Ext.create('Ext.container.Viewport', {
         layout: {
             type: 'vbox',
             align: 'stretch'
         },
         padding: 10,
         items: [{
             xtype: 'panel',
             id: 'panelA',
             title: '快捷键测试A',
             tbar: [{
                 text: '添加(F2)'
             }],
             frame: true,
             flex: 1,
             html: '您好,这里显示的表格或表单 。',
             autoEl: {
                 tag: 'div',
                 tabindex: 0
             }
         }, {
             xtype: 'panel',
             id: 'panelB',
             title: '快捷键测试B',
             tbar: [{
                 text: '添加(F2)'
             }],
             frame: true,
             flex: 1,
             html: '您好,这里显示的表格或表单 。',
             autoEl: {
                 tag: 'div',
                 tabindex: 0
             }
         }]
     });
     Ext.create('Ext.util.KeyMap', {
         target: 'panelA',
         key: Ext.EventObject.F2,
         fn: function (key, ev) {
             alert('添加A');
             ev.stopEvent();
             return false;
         }
     });
     Ext.create('Ext.util.KeyMap', {
         target: 'panelB',
         key: Ext.EventObject.F2,
         fn: function (key, ev) {
             alert('添加B');
             ev.stopEvent();
             return false;
         }
     });
     Ext.get('panelB').focus();
 });

实际结果
打开浏览器后直接按F2有效果了;打开浏览器后用鼠标点击A或B后再按F2就有效果了。
Javascript 相关文章推荐
用JavaScript事件串连执行多个处理过程的方法
Mar 09 Javascript
javascript十个最常用的自定义函数(中文版)
Sep 07 Javascript
JQuery Ajax通过Handler访问外部XML数据的代码
Jun 01 Javascript
如何使用Javascript正则表达式来格式化XML内容
Jul 04 Javascript
javascript 通用loading动画效果实例代码
Jan 14 Javascript
纯js和css完成贪吃蛇小游戏demo
Sep 01 Javascript
详解webpack 多入口配置
Jun 16 Javascript
two.js之实现动画效果示例
Nov 06 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
Dec 29 Javascript
Layui 动态禁止select下拉的例子
Sep 03 Javascript
layui实现鼠标移动到单元格上显示数据的方法
Sep 11 Javascript
JS JQuery获取data-*属性值方法解析
Sep 01 jQuery
Jquery实现三层遍历删除功能代码
Apr 23 #Javascript
jQuery获取浏览器中的分辨率实现代码
Apr 23 #Javascript
使用PHP+JQuery+Ajax分页的实现
Apr 23 #Javascript
jQuery写的日历(包括日历的样式及功能)
Apr 23 #Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
Apr 23 #Javascript
js事件冒泡实例分享(已测试)
Apr 23 #Javascript
js绑定事件this指向发生改变的问题解决方法
Apr 23 #Javascript
You might like
PHP网站基础优化方法小结
2008/09/29 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
ThinkPHP控制器间实现相互调用的方法
2014/10/31 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
javascript整除实现代码
2010/11/23 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
微信jssdk在iframe页面失效问题的解决措施
2016/03/03 Javascript
javascript prototype原型详解(比较基础)
2016/12/26 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
Python获取指定网段正在使用的IP
2020/12/14 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
幼儿园小班教学反思
2014/02/02 职场文书
考试作弊检讨书大全
2014/02/18 职场文书
家长给学校的建议书
2014/05/15 职场文书
十佳青年事迹材料
2014/08/21 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
统计工作个人总结
2015/03/03 职场文书
一文搞懂php的垃圾回收机制
2021/06/18 PHP