el-radio 和 el-cascader 选择报错 Blocked aria-hidden on a...

前言

这个问题的出现不是代码问题,应该是web或浏览器相关协议更新导致。element ui 中的单选框组件 el-radio-group 在近期使用中 报错(有关标签属性-aria-hidden),经测试chrome浏览器会出现这个问题。(在Edge浏览器和360浏览器上均无报错现象)。 在官网使用demo的时候也会有这个错误。

报错内容:Blocked aria-hidden on a element because the element that just received focus must not be hidden from assistive technology users. Avoid using aria-hidden on a focused element or its ancestor. Consider using the inert attribute instead, which will also prevent focus. For more details, see the aria-hidden section of the WAI-ARIA specification at…

翻译:元素上的Blocked aria-hidden,因为刚刚接收焦点的元素不能对辅助技术用户隐藏。避免在焦点元素或其祖先元素上使用aria-hidden。考虑使用惰性属性,这也会阻止焦点。有关更多详细信息,请参见 WAI-ARIA规范 的aria隐藏部分。

这个错误虽然不影响正常使用,但是看到控制台爆红,一点都忍受不了,直接上代码:

解决办法:

方法一:针对只使用过el-radio标签的页面:在main.js添加指令removeAriaHidden。el-cascader级联标签则不适用。

Vue.directive('removeAriaHidden', {
  bind(el, binding) {
    let ariaEls = el.querySelectorAll('.el-radio__original');
    ariaEls.forEach((item) => {
      item.removeAttribute('aria-hidden');
    });
  }
});

在出现报错的 el-radio-group 组件 上去绑定我们的自定义指令。

  <el-radio-group  v-removeAriaHidden>
        <el-radio :label="1">A模式</el-radio>
        <el-radio :label="2">B模式</el-radio>
  </el-radio-group>

方法二:css去除aria-hidden

这个方法对于el-radio和el-cascader都适用,但是在样式上会有问题,按钮外廓会有模糊,此时需要设置一下对应的样式。

input[aria-hidden="true"] {
    display: none !important;
}

.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner {
    box-shadow: none;
}

到此完美解决,注意针对报错位置去应用,不要写全局样式,感谢点赞。

<think>嗯,用户问的是关于Vue中出现的“Blocked aria-hidden on an element because its descendant retained focus”这个警告的问题。首先,我需要理解这个警告的具体含义。根据经验,这可能与ARIA属性的不当使用有关,特别是在可聚焦元素被隐藏的情况下。 首先,我应该回忆一下ARIA的规范。aria-hidden="true"的作用是告诉辅助技术忽略该元素及其子元素。但是如果子元素仍然可以获得焦点,就会导致辅助技术用户无法感知到焦点,这显然有问题。所以浏览器或辅助工具会抛出这个警告,避免这种情况。 接下来,用户可能是在Vue组件中某个父元素上设置了aria-hidden,但其中的子元素(比如输入框、按钮等)仍然可以获取焦点。这时候,aria-hidden被阻塞,因为焦点没有被正确隐藏,影响可访问性。 解决办法的话,首先应该检查代码,找到哪些元素同时有aria-hidden可聚焦的子元素。可能需要调整结构,避免在需要隐藏的元素中包含可聚焦元素。或者考虑移除aria-hidden,改用其他方法隐藏元素,比如CSS的display:none或visibility:hidden,但这些方法可能影响布局或者不能完全解决问题。 另一个解决方案是使用inert属性。inert属性可以让浏览器自动处理元素及其子元素的不可交互状态,包括阻止焦点事件。但要注意inert的浏览器兼容性,可能需要polyfill。在Vue中,可以动态绑定inert属性,根据条件来判断是否应用。 然后,我应该提供一个Vue组件的例子,展示如何正确使用inert替代aria-hidden。比如,当需要隐藏一个模态框外的内容时,给父元素添加inert属性,而不是aria-hidden。同时,确保模态框内部的元素可以正确获得焦点,而外部元素被inert处理,无法聚焦。 此外,可能还需要提醒用户检查可聚焦元素是否被正确管理,比如使用tabindex属性或者动态控制焦点。在Vue中,可以使用ref相关的生命周期钩子来管理焦点,比如在mounted钩子中设置焦点到特定元素,或者在关闭模态框时将焦点返回到触发按钮。 最后,要总结问题产生的原因,即aria-hidden可聚焦子元素的冲突,以及正确的解决方法。同时,在相关问题上,需要引导用户进一步了解Vue中的可访问性处理,比如动态管理aria属性、使用Vue的过渡效果与可访问性结合,或者使用第三方库如vue-a11y-utils等。 现在需要确保回答的结构清晰,先解释问题原因,再给出解决方法,然后提供代码示例,最后列出相关问题。要注意代码部分必须是Vue相关的,比如使用v-bind:inert或者条件渲染来处理。</think><< 这个警告出现在使用了`aria-hidden="true"`但后代元素仍保留焦点时。以下是原因解决方法: **问题原因**: 1. `aria-hidden="true"`会隐藏整个子树的可访问性信息 2. 当被隐藏的元素内部存在可聚焦元素(如`<input>`、`<button>`)时 3. 辅助技术用户将无法感知焦点位置,造成可访问性障碍 **Vue解决方案**: ```vue <template> <!-- 错误示例 --> <div aria-hidden="true"> <input v-model="search" /> <!-- 仍可聚焦 --> </div> <!-- 正确方案1:移除aria-hidden --> <div v-if="!isDialogOpen"> <input v-model="search" /> </div> <!-- 正确方案2:使用inert属性 --> <div :inert="isDialogOpen"> <input v-model="search" /> </div> </template> <script> export default { data() { return { isDialogOpen: false } } } </script> ``` **最佳实践**: 1. 使用`inert`属性替代`aria-hidden`(需polyfill) 2. 通过`v-if`/`v-show`控制元素存在性 3. 使用Vue的`<teleport>`管理焦点上下文 4. 对模态框使用`@vue-a11y/focus-trap`等专用库 **关键点**: - `inert`属性会阻止用户交互并隐藏可访问性树 - 现代浏览器已原生支持`inert`(Chrome 102+) - 需要polyfill时可使用`@oddbird/popover-polyfill`
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值