javascript - ReactJs 如果 div 包含 className 将负 tabindex 设置为 childs

标签 javascript reactjs tabindex

我是 ReactJs 新手。我试图避免 <input> 的键盘选项卡焦点事件, <a>特定 div 的元素。如果 div 包含 .text1类名 text1 div 子元素不应获得焦点。

在 React 中,我使用 props 完成了添加/删除 css className 的操作。

className={`${style.column5} ${ isActiveDiv ? style.column5Active : style.noTabindex }`}

我使用 jQuery 实现了以下输出。但是,我该如何在 ReactJs 中做到这一点?

$(document).ready(function() {
	if ($(".text1").length){
      $(".text1 input, .text1 a").attr("tabindex", "-1");
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="parent">
  <div class="text">
  
  </div>
  <div class="text1">
      <input type="text" />
      <a href="#">Anchor Tag</a>
  </div>
  <div class="text2">
      <input type="text" />
  </div>
  <div class="text3">
      <input type="text" />
  </div>
</div>

最佳答案

所以有几种方法可以解决这个问题。静态方式只需将 -1 的 tabIndex 属性传递给那些您不想聚焦的元素:

<input type="text" tabIndex={-1} />

动态方法是查找包含 text1 类的所有元素,然后动态更新其所有子元素的 tabIndex 属性。你可以尝试这样的事情:

import React, { useEffect } from "react";
import ReactDOM from "react-dom";

import "./styles.css";

function App() {
  const parentRef = React.createRef();

  useEffect(() => {
    //get children elements
    const refChildren = Object.values(parentRef.current.children);
    //find children with class of text1
    const childrenWithText1Class = refChildren.filter(
      child => child.className === "text1"
    );
    //find children's children to neglect
    const childrensChildren = childrenWithText1Class.flatMap(child =>
      Object.values(child.children)
    );

    const disableList = ["a", "input", "select", "textarea", "button"];

    //neglect children
    childrensChildren.forEach(elem => {
      if (disableList.includes(elem.nodeName.toLowerCase())) {
        elem.tabIndex = -1;
      }
    });
  }, []);

  return (
    <div id="parent" ref={parentRef}>
      <div class="text" />
      <div class="text1">
        <input type="text" />
        <a href="#">Anchor Tag</a>
        <select />
        <textarea />
        <audio controls />
        <button>Check</button>
      </div>
      <div class="text2">
        <input type="text" />
      </div>
      <div class="text3">
        <input type="text" />
      </div>
    </div>
  );
}

查看工作沙箱:https://codesandbox.io/s/elastic-sara-blp9q 您可以通过使用 text1 类单击 div(背景)并尝试按 Tab 键进行测试。您会发现实际上最终跳到了下一个 block 。

关于javascript - ReactJs 如果 div 包含 className 将负 tabindex 设置为 childs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57800656/

相关文章:

javascript - 绑定(bind)单击键和输入键以实现辅助功能

html - 如何使修改后的单选按钮可制表?

javascript - 使用 Ajax 运行 PHP 查询,以模式返回数据

javascript - 滚动到 View 时向元素添加类(可滚动的 div)

javascript - 最后的 'SetItem'不保存,刷新页面时清除

javascript - 访问 SyntheticEvent 目标上的 currentTime

html - <ul> 上的 tabindex ="-1"不起作用

JavaScript 原型(prototype)和构造函数

javascript - Bootstrap Center 两个宽度有限的进度条?

javascript - 是否未调用 setState 回调,然后更新本身就会被不同的更新覆盖?