From 81011d1c489a822aa1cc9effaaaeb52d372fcb01 Mon Sep 17 00:00:00 2001 From: maranran Date: Wed, 8 Nov 2017 20:21:27 -0600 Subject: [PATCH] Accessibility for Cascader & Dropdown (#7973) --- packages/cascader/src/main.vue | 32 +++++++ packages/cascader/src/menu.vue | 66 +++++++++++++- packages/dropdown/src/dropdown-item.vue | 2 + packages/dropdown/src/dropdown.vue | 111 ++++++++++++++++++++++-- packages/theme-chalk/src/cascader.scss | 4 +- packages/theme-chalk/src/dropdown.scss | 10 ++- 6 files changed, 213 insertions(+), 12 deletions(-) diff --git a/packages/cascader/src/main.vue b/packages/cascader/src/main.vue index a5bdc4ffa..c02b70799 100644 --- a/packages/cascader/src/main.vue +++ b/packages/cascader/src/main.vue @@ -10,9 +10,12 @@ ]" @click="handleClick" @mouseenter="inputHover = true" + @focus="inputHover = true" @mouseleave="inputHover = false" + @blur="inputHover = false" ref="reference" v-clickoutside="handleClickoutside" + @keydown="handleKeydown" > { @@ -257,6 +272,23 @@ export default { }); this.$emit('active-item-change', value); }, + handleKeydown(e) { + const keyCode = e.keyCode; + if (keyCode === 13) { + this.handleClick(); + } else if (keyCode === 40) { // down + this.menuVisible = true; // 打开 + setTimeout(() => { + const firstMenu = this.popperElm.querySelectorAll('.el-cascader-menu')[0]; + firstMenu.querySelectorAll("[tabindex='-1']")[0].focus(); + }); + e.stopPropagation(); + e.preventDefault(); + } else if (keyCode === 27 || keyCode === 9) { // esc tab + this.inputValue = ''; + if (this.menu) this.menu.visible = false; + } + }, handlePick(value, close = true) { this.currentValue = value; this.$emit('input', value); diff --git a/packages/cascader/src/menu.vue b/packages/cascader/src/menu.vue index 07dff214a..09aeb0076 100644 --- a/packages/cascader/src/menu.vue +++ b/packages/cascader/src/menu.vue @@ -1,6 +1,7 @@