123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430 |
- var startDomListener = false;
- var shortcut = {
- echo: function (shortcust) {
- var r = this.parse(shortcust);
- if ($.type(r) === 'object') {
- return r.echo;
- }
- },
- processButton: function ($dom, item, context) {
- //处理按钮
- if ($.type(item.shortcut) === 'string') {
- var bind = shortcut.parse(item.shortcut);
- if ($.type(bind) === 'object') {
- var echo = bind.echo;
- echo = "<u style='font-size: smaller;'>(" + echo + ")</u>";
- item.text = item.text + echo;
- bind.handler = function () {
- $dom.trigger('click');
- };
- //在容器中注册快捷键
- context.shortcutContainer.bind.push(bind);
- }
- }
- if ($.type(item.ff) === 'number') {
- setTimeout(function () {
- var $ff = $dom;
- if ($ff.length > 0) {
- $ff.focus();
- }
- }, item.ff);
- }
- },
- processGrid: function ($dg, item, context) {
- //处理表格
- if ($.type(item.ff) === 'number') {
- setTimeout(function () {
- $dom.closest('.datagrid-view').focus();
- }, item.ff);
- }
- var $dom = $dg.closest('.datagrid-view');
- //允许所有 datagrid 有焦点
- $dom.attr('tabIndex', 10);
- //不允许 pagination 有焦点
- var pagination = $dg.datagrid('getPager');
- pagination.attr('tabIndex', -1);
- pagination.find('a').attr('tabIndex', -1);
- pagination.find('select').attr('tabIndex', -1);
- pagination.find('input').attr('tabIndex', -1);
- },
- processEgridEditor: function ($dg, index, row) {
- //处理 egrid.columns 里面每一个 editor
- var editors = $dg.datagrid('getEditors', index);
- for (var i = 0; i < editors.length; i++) {
- if ($.inArray(editors[i].type, ['textbox', 'numberbox', 'numberspinner', 'combobox', 'combotree', 'combogrid', 'datebox', 'datetimebox', 'searchbox']) >= 0) {
- var $editor = editors[i].target;
- $editor.textbox('textbox').keydown(function (e) {
- var success = shortcut.processKey(e);
- if (success) {
- if (e.preventDefault) {
- e.preventDefault();
- } else {
- e.returnValue = false;
- }
- }
- });
- }
- }
- },
- processInputAfter: function ($dom, item, context) {
- //$dom.textbox('textbox').attr('tabIndex', 10);
- },
- processInput: function ($dom, item, context) {
- //处理输入框
- var handler = function ($dom) {
- var $ff = $dom.next('span').find('.validatebox-text');
- if ($ff.length > 0) {
- $ff.focus();
- }
- };
- $dom.attr('tabIndex', 10);
- if ($.type(item.shortcut) === 'string') {
- var bind = this.parse(item.shortcut);
- if ($.type(bind) === 'object') {
- var echo = bind.echo.replace('Alt+', '');
- echo = "<u style='font-size: smaller;'>" + echo + "</u>";
- item.label = item.label + echo;
- bind.handler = function () {
- handler($dom);
- };
- //在容器中注册快捷键
- context.shortcutContainer.bind.push(bind);
- }
- }
- if ($.type(item.ff) === 'number') {
- setTimeout(function () {
- handler($dom);
- }, item.ff);
- }
- },
- ffApply:function($container) {
- var vv = $container.find('[ff]:first')
- var xtype = vv.attr('xtype')
- if(xtype === 'textbox' || xtype==='searchbox' || xtype==='numberbox'){
- vv.next().children('input:first').focus();
- }
- },
- disableLayroTabIndex: function (layero) {
- //禁用 layer 中的tabIndex辅助按钮
- layero.find('.layui-layer-setwin>a').attr('tabIndex', -1);
- },
- registe: function ($dom, shortcut, handler) {
- if (!$dom.is('.shortcutContainer')) {
- $dom = $dom.closest('.shortcutContainer');
- }
- if ($dom.length <= 0) {
- return false;
- }
- $.data($dom[0], 'shortcut').bind.push(
- $.extend(this.parse(shortcut), {
- handler: handler
- })
- );
- },
- parse: function (shortcust, hasEcho) {
- shortcust = shortcust.toLowerCase();
- var bind = {};
- bind.key = shortcust.replace('+', '').replace(' ', '').replace(',', '').replace('ctrl', '').replace('shift', '').replace('alt', '');
- if ($.type(bind.key) !== 'string' || !$.trim(bind.key)) {
- console.log("非法的快捷键定义:" + shortcust);
- return;
- }
- var array = ['F1',
- 'F2',
- 'F3',
- 'F4',
- 'F5',
- 'F6',
- 'F7',
- 'F8',
- 'F9',
- 'F10',
- 'F11',
- 'F12',
- 'Escape',
- 'Enter',
- 'PageDown',
- 'PageUp',
- 'Home',
- 'End',
- 'Delete',
- 'Insert',
- 'ArrowUp',
- 'ArrowDown',
- 'ArrowLeft',
- 'ArrowRight'];
- //别名定义
- switch (bind.key) {
- case 'esc':
- bind.key = 'escape';
- break;
- case 'up':
- bind.key = 'ArrowUp';
- break;
- case 'down':
- bind.key = 'ArrowDown';
- break;
- case 'left':
- bind.key = 'ArrowLeft';
- break;
- case 'right':
- bind.key = 'ArrowRight';
- break;
- }
- var find = $.inArray(bind.key, array.map(function (v) {
- return v.toLowerCase()
- }));
- if (bind.key.length !== 1 && find < 0) {
- console.log("非法的快捷键定义:" + shortcust);
- return;
- }
- bind.ctrl = shortcust.indexOf("ctrl") >= 0;
- bind.shift = shortcust.indexOf("shift") >= 0;
- bind.alt = shortcust.indexOf("alt") >= 0;
- if (find < 0) {
- bind.key = bind.key.toUpperCase();
- if (!bind.ctrl && !bind.shift && !bind.alt) {
- bind.alt = true;
- }
- } else {
- bind.key = array[find];
- }
- if (hasEcho !== false) {
- bind.echo = (bind.ctrl ? "Ctrl+" : "") +
- (bind.alt ? "Alt+" : "") +
- (bind.shift ? "Shift+" : "") +
- bind.key;
- }
- bind.key = bind.key.toUpperCase();
- return bind;
- },
- createContainer: function ($dom, context) {
- if (context.hasOwnProperty('shortcutContainer')) {
- //已经包含 shortcutContainer 的设定
- return;
- }
- $dom.addClass('shortcutContainer');
- var shortcutContainer = {bind: []};
- $.data($dom[0], 'shortcut', shortcutContainer);
- context.shortcutContainer = shortcutContainer;
- },
- processKey: function (e) {
- //传入keydown事件参数,如果处理成功 返回true,否则返回false
- var log = function () {
- var arg = ['shortcut'];
- for (var i = 0; i < arguments.length; i++) {
- arg.push(arguments[i]);
- }
- console.log.apply(this, arg);
- };
- var hooks = {
- datagrid: function ($f, e) {
- var dff = function (xtype) {
- if (e.code === 'PageDown') {
- if ($f.down(xtype).datagrid('getPager').length <= 0) return false;
- log(xtype, 'PageDown');
- var $next = $.data($f.down(xtype).datagrid('getPager')[0]).pagination.bb.next;
- if (!$next.is('.l-btn-disabled')) {
- $next.trigger('click');
- }
- return true;
- } else if (e.code === 'PageUp') {
- if ($f.down(xtype).datagrid('getPager').length <= 0) return false;
- log(xtype, 'PageUp');
- var $prev = $.data($f.down(xtype).datagrid('getPager')[0]).pagination.bb.prev;
- if (!$prev.is('.l-btn-disabled')) {
- $prev.trigger('click');
- }
- return true;
- } else if (e.code === 'ArrowUp') {
- log(xtype, 'ArrowUp');
- var $dg = $f.down(xtype);
- var row = $dg.datagrid('getSelected');
- if (!row) return true;
- var index = $dg.datagrid('getRowIndex', row);
- if (index <= 0) return true;
- $dg.datagrid('selectRow', index - 1);
- return true;
- } else if (e.code === 'ArrowDown') {
- log(xtype, 'ArrowDown');
- var $dg = $f.down(xtype);
- var row = $dg.datagrid('getSelected');
- if (xtype === 'egrid') {
- //egrid 没有任何数据时按"下"键,需要添加操作,并聚焦到第一个编辑框
- var rowsLength = $dg.datagrid('getRows').length;
- if (rowsLength <= 0) {
- $dg.edatagrid('addRow');
- setTimeout(function () {
- $dg.edatagrid('focusEditor');
- }, 50);
- return true;
- }
- }
- if (!row) return true;
- var index = $dg.datagrid('getRowIndex', row);
- if (xtype === 'egrid') {
- //egrid 最后一行按"下"键,需要添加操作,并聚焦到第一个编辑框
- if (index >= rowsLength - 1) {
- //最后一行
- $dg.edatagrid('addRow');
- setTimeout(function () {
- $dg.edatagrid('focusEditor');
- }, 50);
- return true;
- }
- }
- if (index < 0) return true;
- $dg.datagrid('selectRow', index + 1);
- return true;
- } else if (e.code === 'Escape') {
- if (xtype === 'egrid') {
- log(xtype, 'Escape');
- var $dg = $f.down(xtype);
- var editRowIndex = $dg.edatagrid('getEditRowIndex');
- if ($.type(editRowIndex) === 'number' && editRowIndex >= 0) {
- $dg.edatagrid('cancelRow');
- }
- }
- }
- };
- if ($f.down('list').length > 0) {
- return dff('list');
- } else if ($f.down('grid').length > 0) {
- return dff('grid');
- } else if ($f.down('egrid').length > 0) {
- return dff('egrid');
- }
- return false;
- }
- };
- if (e.key === 'Control' || e.key === 'Shift' || e.key === 'Alt') {
- return false;
- }
- if (e.ctrlKey && e.shiftKey && e.altKey && e.key.toLocaleLowerCase() === 'a') {
- console.log($("[tabindex]"));
- return true;
- }
- if (e.ctrlKey && e.shiftKey && e.altKey && e.key.toLocaleLowerCase() === 'c') {
- console.log($(document.activeElement));
- return true;
- }
- var $f = $(document.activeElement);
- if ($f.is('div.datagrid-view')) {
- //当前是在 grid 体系的容器里
- if (hooks.datagrid($f, e)) {
- return true;
- }
- } else if ($f.closest('div.datagrid-view').down('egrid').length > 0) {
- //当前是在 egrid 表格容器的grid里
- if (hooks.datagrid($f.closest('div.datagrid-view'), e)) {
- return true;
- }
- }
- //找到当前焦点控件的快捷键容器
- var shortcutContainer = $f;
- if (!$f.is('.shortcutContainer')) {
- shortcutContainer = $f.closest('.shortcutContainer');
- }
- if (shortcutContainer.length <= 0) {
- return false;
- }
- shortcutContainer = $.data(shortcutContainer[0], 'shortcut');
- //寻找容器中有没有注册当前的按键
- for (var i = 0; i < shortcutContainer.bind.length; i++) {
- var bind = shortcutContainer.bind[i];
- if ((bind.alt === e.altKey) &&
- (bind.ctrl === e.ctrlKey) &&
- (bind.shift === e.shiftKey) &&
- (bind.key === e.key.toUpperCase())) {
- bind.handler();
- }
- }
- return false;
- }
- };
- $(function () {
- var setupGridTabIndex = function (data) {
- var $dg = $(this);
- var $dom = $dg.closest('.datagrid-view');
- //允许所有 datagrid 有焦点
- $dom.attr('tabIndex', 10);
- //不允许 pagination 有焦点
- var pagination = $dg.datagrid('getPager');
- pagination.attr('tabIndex', -1);
- pagination.find('a').attr('tabIndex', -1);
- pagination.find('select').attr('tabIndex', -1);
- pagination.find('input').attr('tabIndex', -1);
- //默认选中第一行
- if (data && data.rows.length > 0) {
- $dg.datagrid('selectRow', 0);
- }
- };
- if ($.fn.edatagrid) {
- $.fn.edatagrid.defaults.onLoadSuccess = setupGridTabIndex;
- }
- if ($.fn.datagrid) {
- $.fn.datagrid.defaults.onLoadSuccess = setupGridTabIndex;
- }
- document.onkeydown = function (e) {
- var success = shortcut.processKey(e);
- if (success) {
- if (e.preventDefault) {
- e.preventDefault();
- } else {
- e.returnValue = false;
- }
- }
- };
- });
|