Evan Zou

Welcome to my blog.

Javascript follower.


Hi, I am Evan, nice to meet you all.

React的onMouseDown,onBlur和onClick执行顺序问题

最近在项目中遇到了一个因为onBlur和onClick执行顺序不同而造成的bug,希望同大家分享一下。

原理

当输入框有onBlur事件的时候,在触发onBlur事件的同时,点击按钮,会同时触发按钮的onClick事件和输入框的onBlur事件,而onBlur事件的顺序大于onClick事件,此时可能会造成一些bug。

具体案例

1. 初始状态

First

2. 第一步

输入错误信息并触发输入框的onBlur事件,表单提交按钮发生向下位移,位移高度为错误信息文字高度。

Second

3. 第二步

随后输入正确信息,点击提交按钮,先触发了onBlur事件,错误信息消失,提交按钮向上位移,若鼠标点击在按钮位移之前的位置,会无法触发按钮的onClick事件。

Third

解决方案

给按钮添加onmousedown事件:

onMouseDown={e => {
    e.preventDefault();
}}

使用原理: 事件触发顺序

` onMouseDown > onBlur > onClick `

例外

但是如果按钮是一个封装的组件,如react-route的Link组件,这时候使用onMouseDown并不会解决问题。建议将Link换成button或者a标签。

最近的文章

CSS IE浏览器自带的清除按钮

最近在项目中遇到了一个浏览器自带样式的问题,在IE浏览器中,Input输入框会自带清除按钮,会与项目中写好的清除按钮发生冲突。解决办法:给Input添加以下样式:{% highlight ruby %}::-ms-clear { width : 0; height: 0;}{% endhighlight %}…

CSS IE继续阅读
更早的文章

React 表单(Forms)详解

如果希望 React 的表单和 HML 表单的默认行为不一致,需要使用到一种称为“受控组件(Controlled Components)”的技术。受控组件在 HTML 中,表单元素如 input,select 等根据用户输入更新。而在 React 中,可变状态一般保存在组件的 state 属性中,并通过 setState()方法更新。我们可以通过是 React 的 state 成为”单一数据源”来结合这两个形式。然后 React 组件也可以控制在用户输入之后的行为。这种形式,其值由 Rea...…

React继续阅读