按钮 onClick return 内部 html 而不是 Chrome 浏览器中的值

Button onClick return inner html instead of value in Chrome Browser

对于波纹管代码,我在 firefoxchrome 上有不同的行为,我认为 firefox 更正确。

firefox 将在 console 上打印:

<button value="2" class="mdl-button mdl-js-button mdl-button--icon" data-upgraded=",MaterialButton">

chrome 将打印此内容:

<i class="material-icons">star_border</i>

这是我的代码:

<button value={props.value} className="mdl-button mdl-js-button mdl-button--icon" onClick={(e) => {
    e.preventDefault();
    props.onClick(e);
}}>
    <i className="material-icons">{props.icon}</i>
</button>


onClick(e) {
    console.log(e.target);
}

您可能会在这里找到您要找的东西:ReactJS SyntheticEvent stopPropagation() only works with React events?

e.target 会给你点击的最后一片叶子 DOM ,在你的例子中,可以是 <button /> 也可以是它的 children 之一,即 <i />.

在下面的例子中,尝试:

  1. 点击按钮的角e.target === button

  2. 点击中间的按钮e.target === i

class App extends React.Component{

  
  
  render() {
    return (
      <button value={this.props.value} className="mdl-button mdl-js-button mdl-button-icon" onClick={(e) => {
    e.preventDefault(); 
    this.props.onClick(e);
}}>
    <i className="material-icons">{this.props.icon}</i>
</button>
    )
  }
}


ReactDOM.render(<App icon="click me" onClick={(e) => console.log(e.target)} />, document.querySelector('#app'))
.mdl-button {
  font-size: 15px;
  width: 200px;
  height:  40px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app" ></div>

为避免跨浏览器问题,最好的解决方案是将值传递给点击处理函数而不是事件本身。

<button value={props.value} className="mdl-button mdl-js-button mdl-button--icon" onClick={(e) => {
    e.preventDefault();
    props.onClick(props.value);
}}>
    <i className="material-icons">{props.icon}</i>
</button>


onClick(value) {
    console.log(value);
}