【问题标题】:Get part of className using JQuery returns null使用 JQuery 获取部分类名返回 null
【发布时间】:2020-01-28 22:46:50
【问题描述】:

我在代码和框中有这段代码,但是当我尝试使用 JQuery 从 div 获取部分类名时它返回 null。我怎样才能让它工作?

Codesandbox Code example

import React, { Component } from "react";
import "./styles.css";
import $ from "jquery";

export default class App extends Component {
  componentDidMount() {
    $(".MainContainer").on("mousedown", function(evt) {
      $(".MainContainer").on("mouseup mousemove", function handler(evt) {
        alert(
          $(this)
            .attr("class")
            .match(/\bsizes[^\s]+\b/)
        );
      });
    });
  }

  constructor(props) {
    super(props);

    this.state = {};
  }

  render() {
    return <div className="MainContainer sizes" />;
  }
}

css 类:

.MainContainer {
  background: #282c34;
  position: relative;
  display: flex;
  min-height: 100vh;
}

【问题讨论】:

  • 请在 StackOverflow 上的问题中发布您的代码(作为 minimal reproducible example
  • alert($(this).hasClass("sizes"));
  • 我需要返回的类名不是真假。
  • 等待猎犬到达说不要在反应中使用 jQuery....(猜我是第一个)
  • 不确定reg exp 是如何匹配“尺寸”的 "foo sizes".match(/\bsizes[^\s]+\b/) 为空,因为尺寸后面没有任何内容...

标签: javascript jquery css reactjs


【解决方案1】:

首先,我强烈建议不要在你的 React 代码中使用 jQuery,但是如果你必须使用 ref 实用程序来处理 dom 事件并让 React 处理它们,而不是直接使用 jQuery。

除了为on()方法使用多个事件之外,传递一个具有多个方法的对象而不是嵌套它们。

我建议使用console.log() 而不是alert() 方法来检索任何数据或DOM 元素以防止错误。

最后我评论了你的正则表达式,看看它是否有效。正则表达式返回 null 但其余代码正在运行。

View on Codesandbox

PS:反应方式如下。

import React, { Component } from "react";
import "./styles.css";
import $ from "jquery";

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {};
    this.myRef = React.createRef();
  }

  componentDidMount() {
    $(this.myRef.current).on({
      mousedown: function(evt) {
        console.log(
          $(this).attr("class")
          // .match(/\bsizes[^\s]+\b/)
        );
      },
      mouseup: function(evt) {
        console.log(
          $(this).attr("class")
          // .match(/\bsizes[^\s]+\b/)
        );
      },
      mousemove: function(evt) {
        console.log(
          $(this).attr("class")
          // .match(/\bsizes[^\s]+\b/)
        );
      }
    });
  }

  render() {
    return <div className="MainContainer sizes" ref={this.myRef} />;
  }
}

反应方式

因为我建议只使用 react 来处理 DOM 元素,所以我也会发布 React 代码。

注意:我对事件进行了循环,但您可以手动重复事件以降低复杂性。此外,我使用find() 循环通过DOMTokenList 值并检查它们以匹配正则表达式。我评论了该行以防止正则表达式检查的响应。

View on Codesandbox

import React, { Component } from "react";
import "./styles.css";

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {};
    this.myRef = React.createRef();
  }

  componentDidMount() {
    this.eventHandler();
  }

  eventHandlerCallback = e => {
    console.log(
      Object.values(e.target.classList)
      // .find(item => item.match(/\bsizes[^\s]+\b/))
    );
  };

  eventHandler = () => {
    const events = ["mousedown", "mouseup", "mousemove"];
    events.map(e =>
      this.myRef.current.addEventListener(e, this.eventHandlerCallback)
    );
  };

  render() {
    return <div className="MainContainer sizes" ref={this.myRef} />;
  }
}

【讨论】:

  • 为什么不展示 React 方式?显然,OP 正在从一个库转移到另一个库。
  • 我会用 React 的方式更新答案。谢谢提醒:)
猜你喜欢
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2011-01-24
  • 1970-01-01
  • 2019-04-18
  • 2013-01-30
  • 1970-01-01
相关资源
最近更新 更多