diff --git a/examples/plugins/xtable/index.js b/examples/plugins/xtable/index.js index 6fd592669..7f2f09b76 100644 --- a/examples/plugins/xtable/index.js +++ b/examples/plugins/xtable/index.js @@ -39,6 +39,7 @@ import VXETablePluginMenus from 'vxe-table-plugin-menus' import VXETablePluginExportXLSX from 'vxe-table-plugin-export-xlsx' import VXETablePluginExportPDF from 'vxe-table-plugin-export-pdf' import VXETablePluginRenderer from 'vxe-table-plugin-renderer' +// import VXETablePluginShortcutKey from 'vxe-table-plugin-shortcut-key' import 'vxe-table-plugin-element/dist/style.css' import 'vxe-table-plugin-iview/dist/style.css' import 'vxe-table-plugin-antd/dist/style.css' @@ -103,3 +104,4 @@ VXETable.use(VXETablePluginMenus) VXETable.use(VXETablePluginExportXLSX) VXETable.use(VXETablePluginExportPDF) VXETable.use(VXETablePluginRenderer) +// VXETable.use(VXETablePluginShortcutKey) diff --git a/examples/views/button/Button.vue b/examples/views/button/Button.vue index fc29f5e47..65392722b 100644 --- a/examples/views/button/Button.vue +++ b/examples/views/button/Button.vue @@ -214,7 +214,7 @@
       
         | Tab | 切换到上一个 |
-        | Shift Tab | 切换到下一个 |
+        | Shift + Tab | 切换到下一个 |
         | Spacebar | 按下点击 |
         | Enter | 点击 |
       
diff --git a/examples/views/checkbox/Checkbox.vue b/examples/views/checkbox/Checkbox.vue
index 7f9211d2d..5c830f7e2 100644
--- a/examples/views/checkbox/Checkbox.vue
+++ b/examples/views/checkbox/Checkbox.vue
@@ -33,7 +33,7 @@
     
       
         | Tab | 切换到上一个 |
-        | Shift Tab | 切换到下一个 |
+        | Shift + Tab | 切换到下一个 |
         | Spacebar | 按下勾选 |
       
     
diff --git a/examples/views/pager/Pager.vue b/examples/views/pager/Pager.vue index 8d37d021f..34275cffa 100644 --- a/examples/views/pager/Pager.vue +++ b/examples/views/pager/Pager.vue @@ -90,6 +90,10 @@ | Arrow Up ↑ | 如果在当前页输入框内则向上翻页 | | Arrow Down ↓ | 如果在当前页输入框内则向下翻页 | + | Tab | 切换到上一个 | + | Shift + Tab | 切换到下一个 | + | Spacebar | 按下点击 | + | Enter | 点击 |
diff --git a/examples/views/radio/Radio.vue b/examples/views/radio/Radio.vue index d9a75e545..dea979768 100644 --- a/examples/views/radio/Radio.vue +++ b/examples/views/radio/Radio.vue @@ -52,7 +52,7 @@
       
         | Tab | 切换到上一个 |
-        | Shift Tab | 切换到下一个 |
+        | Shift + Tab | 切换到下一个 |
         | Arrow Up ↑ | 如果在分组内则移动到上一个选项 |
         | Arrow Left ← | 如果在分组内则移动到上一个选项 |
         | Arrow Down ↓ | 如果在分组内则移动到下一个选项 |
diff --git a/package.json b/package.json
index 124aa1251..f0509fa14 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "vxe-table",
-  "version": "3.0.8",
+  "version": "3.0.9",
   "description": "一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、虚拟列表、模态窗口、自定义模板、渲染器、贼灵活的配置项、扩展接口等...",
   "scripts": {
     "serve": "vue-cli-service serve",
@@ -84,7 +84,7 @@
     "vxe-table-plugin-iview": "^1.10.0",
     "vxe-table-plugin-menus": "^1.5.2",
     "vxe-table-plugin-renderer": "^1.3.0",
-    "vxe-table-plugin-shortcut-key": "^1.4.0",
+    "vxe-table-plugin-shortcut-key": "^1.4.2",
     "vxe-table-plugin-virtual-tree": "0.5.6",
     "xe-ajax": "^4.0.5",
     "xe-ajax-mock": "^1.12.0",
diff --git a/packages/pager/src/pager.js b/packages/pager/src/pager.js
index 9df91bc6b..d24585e32 100644
--- a/packages/pager/src/pager.js
+++ b/packages/pager/src/pager.js
@@ -113,7 +113,7 @@ export default {
   methods: {
     // 上一页
     renderPrevPage (h) {
-      return h('span', {
+      return h('button', {
         class: ['vxe-pager--prev-btn', {
           'is--disabled': this.currentPage <= 1
         }],
@@ -131,7 +131,7 @@ export default {
     },
     // 向上翻页
     renderPrevJump (h, tagName) {
-      return h(tagName || 'span', {
+      return h(tagName || 'button', {
         class: ['vxe-pager--jump-prev', {
           'is--fixed': !tagName,
           'is--disabled': this.currentPage <= 1
@@ -153,19 +153,19 @@ export default {
     },
     // number
     renderNumber (h) {
-      return h('ul', {
+      return h('span', {
         class: 'vxe-pager--btn-wrapper'
       }, this.renderPageBtn(h))
     },
     // jumpNumber
     renderJumpNumber (h) {
-      return h('ul', {
+      return h('span', {
         class: 'vxe-pager--btn-wrapper'
       }, this.renderPageBtn(h, true))
     },
     // 向下翻页
     renderNextJump (h, tagName) {
-      return h(tagName || 'span', {
+      return h(tagName || 'button', {
         class: ['vxe-pager--jump-next', {
           'is--fixed': !tagName,
           'is--disabled': this.currentPage >= this.pageCount
@@ -187,7 +187,7 @@ export default {
     },
     // 下一页
     renderNextPage (h) {
-      return h('span', {
+      return h('button', {
         class: ['vxe-pager--next-btn', {
           'is--disabled': this.currentPage >= this.pageCount
         }],
@@ -285,20 +285,20 @@ export default {
       }
       if (showJump && isLt) {
         nums.push(
-          h('li', {
+          h('button', {
             class: 'vxe-pager--num-btn',
             on: {
               click: () => this.jumpPage(1)
             }
           }, 1),
-          this.renderPrevJump(h, 'li')
+          this.renderPrevJump(h, 'span')
         )
       }
       numList.forEach((item, index) => {
         const number = startNumber + index
         if (number <= pageCount) {
           nums.push(
-            h('li', {
+            h('button', {
               class: ['vxe-pager--num-btn', {
                 'is--active': currentPage === number
               }],
@@ -312,8 +312,8 @@ export default {
       })
       if (showJump && isGt) {
         nums.push(
-          this.renderNextJump(h, 'li'),
-          h('li', {
+          this.renderNextJump(h, 'button'),
+          h('button', {
             class: 'vxe-pager--num-btn',
             on: {
               click: () => this.jumpPage(pageCount)
diff --git a/packages/table/src/methods.js b/packages/table/src/methods.js
index f54056c89..eaf8643ae 100644
--- a/packages/table/src/methods.js
+++ b/packages/table/src/methods.js
@@ -1877,7 +1877,7 @@ const Methods = {
     // 该行为只对当前激活的表格有效
     if (this.isActivated) {
       this.preventEvent(evnt, 'event.keydown', null, () => {
-        const { isCtxMenu, ctxMenuStore, editStore, editOpts, editConfig, mouseConfig = {}, keyboardConfig = {}, treeConfig, treeOpts, highlightCurrentRow, currentRow, bodyCtxMenu } = this
+        const { isCtxMenu, ctxMenuStore, editStore, editOpts, editConfig, mouseConfig, mouseOpts, keyboardConfig, keyboardOpts, treeConfig, treeOpts, highlightCurrentRow, currentRow, bodyCtxMenu } = this
         const { selected, actived } = editStore
         const { keyCode } = evnt
         const isBack = keyCode === 8
@@ -1908,9 +1908,9 @@ const Methods = {
           } else {
             this.moveCtxMenu(evnt, keyCode, ctxMenuStore, 'selected', 39, true, this.ctxMenuList)
           }
-        } else if (keyboardConfig && this.mouseConfig && this.mouseOpts.area && this.handleKeyboardEvent) {
+        } else if (keyboardConfig && mouseConfig && mouseOpts.area && this.handleKeyboardEvent) {
           this.handleKeyboardEvent(evnt)
-        } else if (isSpacebar && (keyboardConfig.isArrow || keyboardConfig.isTab) && selected.row && selected.column && (selected.column.type === 'checkbox' || selected.column.type === 'radio')) {
+        } else if (keyboardConfig && isSpacebar && (keyboardOpts.isArrow || keyboardOpts.isTab) && selected.row && selected.column && (selected.column.type === 'checkbox' || selected.column.type === 'radio')) {
           // 空格键支持选中复选框
           evnt.preventDefault()
           if (selected.column.type === 'checkbox') {
@@ -1927,7 +1927,7 @@ const Methods = {
             params = actived.args
             this.clearActived(evnt)
             // 如果配置了选中功能,则为选中状态
-            if (mouseConfig.selected) {
+            if (mouseConfig && mouseOpts.selected) {
               this.$nextTick(() => this.handleSelected(params, evnt))
             }
           }
@@ -1946,7 +1946,7 @@ const Methods = {
           this.keyCtxTimeout = setTimeout(() => {
             this._keyCtx = false
           }, 1000)
-        } else if (isEnter && !hasAltKey && keyboardConfig.isEnter && (selected.row || actived.row || (treeConfig && highlightCurrentRow && currentRow))) {
+        } else if (isEnter && !hasAltKey && keyboardConfig && keyboardOpts.isEnter && (selected.row || actived.row || (treeConfig && highlightCurrentRow && currentRow))) {
           // 退出选中
           if (hasCtrlKey) {
             // 如果是激活编辑状态,则取消编辑
@@ -1954,7 +1954,7 @@ const Methods = {
               params = actived.args
               this.clearActived(evnt)
               // 如果配置了选中功能,则为选中状态
-              if (mouseConfig.selected) {
+              if (mouseConfig && mouseOpts.selected) {
                 this.$nextTick(() => this.handleSelected(params, evnt))
               }
             }
@@ -1963,13 +1963,13 @@ const Methods = {
             if (selected.row || actived.row) {
               const targetArgs = selected.row ? selected.args : actived.args
               if (hasShiftKey) {
-                if (keyboardConfig.enterToTab) {
+                if (keyboardOpts.enterToTab) {
                   this.moveTabSelected(targetArgs, hasShiftKey, evnt)
                 } else {
                   this.moveSelected(targetArgs, isLeftArrow, true, isRightArrow, false, evnt)
                 }
               } else {
-                if (keyboardConfig.enterToTab) {
+                if (keyboardOpts.enterToTab) {
                   this.moveTabSelected(targetArgs, hasShiftKey, evnt)
                 } else {
                   this.moveSelected(targetArgs, isLeftArrow, false, isRightArrow, true, evnt)
@@ -1988,7 +1988,7 @@ const Methods = {
               }
             }
           }
-        } else if (operArrow && keyboardConfig.isArrow) {
+        } else if (operArrow && keyboardConfig && keyboardOpts.isArrow) {
           if (!isEditStatus) {
             // 如果按下了方向键
             if (selected.row && selected.column) {
@@ -1998,22 +1998,22 @@ const Methods = {
               this.moveCurrentRow(isUpArrow, isDwArrow, evnt)
             }
           }
-        } else if (isTab && keyboardConfig.isTab) {
+        } else if (isTab && keyboardConfig && keyboardOpts.isTab) {
           // 如果按下了 Tab 键切换
           if (selected.row || selected.column) {
             this.moveTabSelected(selected.args, hasShiftKey, evnt)
           } else if (actived.row || actived.column) {
             this.moveTabSelected(actived.args, hasShiftKey, evnt)
           }
-        } else if (isDel || (treeConfig && highlightCurrentRow && currentRow ? isBack && keyboardConfig.isArrow : isBack)) {
+        } else if (keyboardConfig && (isDel || (treeConfig && highlightCurrentRow && currentRow ? isBack && keyboardOpts.isArrow : isBack))) {
           if (!isEditStatus) {
             // 如果是删除键
-            if (keyboardConfig.isDel && (selected.row || selected.column)) {
+            if (keyboardOpts.isDel && (selected.row || selected.column)) {
               setCellValue(selected.row, selected.column, null)
               if (isBack) {
                 this.handleActived(selected.args, evnt)
               }
-            } else if (isBack && keyboardConfig.isArrow && treeConfig && highlightCurrentRow && currentRow) {
+            } else if (isBack && keyboardOpts.isArrow && treeConfig && highlightCurrentRow && currentRow) {
               // 如果树形表格回退键关闭当前行返回父节点
               const { parent: parentRow } = XEUtils.findTree(this.afterFullData, item => item === currentRow, treeOpts)
               if (parentRow) {
@@ -2025,14 +2025,14 @@ const Methods = {
               }
             }
           }
-        } else if (keyboardConfig.isEdit && !hasCtrlKey && !hasMetaKey && (isSpacebar || (keyCode >= 48 && keyCode <= 57) || (keyCode >= 65 && keyCode <= 90) || (keyCode >= 96 && keyCode <= 111) || (keyCode >= 186 && keyCode <= 192) || (keyCode >= 219 && keyCode <= 222))) {
+        } else if (keyboardConfig && keyboardOpts.isEdit && !hasCtrlKey && !hasMetaKey && (isSpacebar || (keyCode >= 48 && keyCode <= 57) || (keyCode >= 65 && keyCode <= 90) || (keyCode >= 96 && keyCode <= 111) || (keyCode >= 186 && keyCode <= 192) || (keyCode >= 219 && keyCode <= 222))) {
           // 启用编辑后,空格键功能将失效
           // if (isSpacebar) {
           //   evnt.preventDefault()
           // }
           // 如果是按下非功能键之外允许直接编辑
           if (selected.column && selected.row && selected.column.editRender) {
-            if (!keyboardConfig.editMethod || !(keyboardConfig.editMethod(selected.args) === false)) {
+            if (!keyboardOpts.editMethod || !(keyboardOpts.editMethod(selected.args) === false)) {
               if (!editOpts.activeMethod || editOpts.activeMethod(selected.args)) {
                 setCellValue(selected.row, selected.column, null)
                 this.handleActived(selected.args, evnt)
@@ -2045,11 +2045,11 @@ const Methods = {
     }
   },
   handleGlobalPasteEvent (evnt) {
-    const { isActivated, keyboardConfig, mouseConfig, mouseOpts, editStore } = this
+    const { isActivated, keyboardConfig, keyboardOpts, mouseConfig, mouseOpts, editStore } = this
     const { actived } = editStore
     if (isActivated) {
       if (!(actived.row || actived.column)) {
-        if (keyboardConfig && keyboardConfig.isClip && mouseConfig && mouseOpts.area && this.handlePasteCellAreaEvent) {
+        if (keyboardConfig && keyboardOpts.isClip && mouseConfig && mouseOpts.area && this.handlePasteCellAreaEvent) {
           this.handlePasteCellAreaEvent(evnt)
         }
       }
@@ -2057,11 +2057,11 @@ const Methods = {
     }
   },
   handleGlobalCopyEvent (evnt) {
-    const { isActivated, keyboardConfig, mouseConfig, mouseOpts, editStore } = this
+    const { isActivated, keyboardConfig, keyboardOpts, mouseConfig, mouseOpts, editStore } = this
     const { actived } = editStore
     if (isActivated) {
       if (!(actived.row || actived.column)) {
-        if (keyboardConfig && keyboardConfig.isClip && mouseConfig && mouseOpts.area && this.handleCopyCellAreaEvent) {
+        if (keyboardConfig && keyboardOpts.isClip && mouseConfig && mouseOpts.area && this.handleCopyCellAreaEvent) {
           this.handleCopyCellAreaEvent(evnt)
         }
       }
@@ -2069,11 +2069,11 @@ const Methods = {
     }
   },
   handleGlobalCutEvent (evnt) {
-    const { isActivated, keyboardConfig, mouseConfig, mouseOpts, editStore } = this
+    const { isActivated, keyboardConfig, keyboardOpts, mouseConfig, mouseOpts, editStore } = this
     const { actived } = editStore
     if (isActivated) {
       if (!(actived.row || actived.column)) {
-        if (keyboardConfig && keyboardConfig.isClip && mouseConfig && mouseOpts.area && this.handleCutCellAreaEvent) {
+        if (keyboardConfig && keyboardOpts.isClip && mouseConfig && mouseOpts.area && this.handleCutCellAreaEvent) {
           this.handleCutCellAreaEvent(evnt)
         }
       }
diff --git a/styles/pager.scss b/styles/pager.scss
index 5359ad88a..2e4110288 100644
--- a/styles/pager.scss
+++ b/styles/pager.scss
@@ -37,7 +37,20 @@
   .vxe-pager--num-btn,
   .vxe-pager--jump-prev,
   .vxe-pager--jump-next {
+    color: inherit;
+    outline: 0;
     border: 1px solid transparent;
+    &:not(.is--disabled) {
+      &:focus {
+        box-shadow: 0 0 0.25em 0 $vxe-primary-color;
+      }
+      &:hover {
+        color: lighten($vxe-primary-color, 6%);
+      }
+      &:active {
+        background-color: darken($vxe-button-default-background-color, 3%);
+      }
+    }
   }
   &.is--border,
   &.is--perfect {
@@ -54,24 +67,27 @@
   &.is--background,
   &.is--perfect {
     .vxe-pager--prev-btn,
-    .vxe-pager--next-btn {
-      background-color: #f4f4f5;
+    .vxe-pager--next-btn,
+    .vxe-pager--jump-prev,
+    .vxe-pager--num-btn,
+    .vxe-pager--jump-next {
+      background-color: $vxe-pager-perfect-button-background-color;
     }
     .vxe-pager--jump-prev,
     .vxe-pager--num-btn,
     .vxe-pager--jump-next {
-      background-color: #f4f4f5;
       &:not(.is--disabled) {
-        &:hover {
-          color: $vxe-primary-color;
-        }
         &.is--active {
           color: #fff;
           background-color: $vxe-primary-color;
           &:hover {
             background-color: lighten($vxe-primary-color, 6%);
           }
+          &:focus {
+            border-color: $vxe-primary-color;
+          }
           &:active {
+            border-color: darken($vxe-primary-color, 3%);
             background-color: darken($vxe-primary-color, 3%);
           }
         }
@@ -157,7 +173,6 @@
     min-width: 2.15em;
   }
   .vxe-pager--btn-wrapper {
-    list-style-type: none;
     padding: 0;
     margin: 0;
     display: inline-block;
diff --git a/styles/variable.scss b/styles/variable.scss
index 076a932b2..340c79701 100644
--- a/styles/variable.scss
+++ b/styles/variable.scss
@@ -124,6 +124,7 @@ $vxe-tooltip-validate-error-background-color: #f56c6c;
 
 /*pager*/
 $vxe-pager-background-color: #fff;
+$vxe-pager-perfect-button-background-color: #f4f4f5;
 
 /*modal*/
 $vxe-modal-header-background-color: #F8F8F8;