If you try to click the button while you are writing, it won't display the 'Click' alert, as onBlur prevents onClick to execute. A solution could be to use onMouseDown instead of onClick . That works because the onMouseDown event has a higher priority than the onBlur event.
If the element that has the onBlur effect and tabindex is created onClick of another element, it does not automatically gets focus when it appears. Thus, you may need to focus it using element. focus() after creating the element.
You would use onMouseDown if you want to preventDefault as soon as the user clicks on a button. This is preferred in a texteditor where you want to keep the focus on the input while clicking on buttons that change the styles of the text.
In browsers, pressing the tab key when a control has focus will move it to the next element in the tab order, causing the current element to lose focus and dispatch a blur event.
I was having the exact same issue as you, my UI is designed exactly as you describe. I solved the problem by simply replacing the onClick
for the menu items with an onMouseDown
. I did nothing else; no onMouseUp
, no flags. This resolved the problem by letting the browser automatically re-order based on the priority of these event handlers, without any additional work from me.
Is there any reason why this wouldn't have also worked for you?
onClick
should not be replaced with onMouseDown
.
While this approach somewhat works, the two are fundamentally different events that have different expectations in the eyes of the user. Using onMouseDown
instead of onClick
will ruin the predictability of your software in this case. Thus, the two events are noninterchangeable.
To illustrate: when accidentally clicking on a button, users expect to be able to hold down the mouse click, drag the cursor outside of the element, and release the mouse button, ultimately resulting in no action. onClick
does this. onMouseDown
doesn't allow the user to hold the mouse down, and instead will immediately trigger an action, without any recourse for the user. onClick
is the standard by which we expect to trigger actions on a computer.
In this situation, call event.preventDefault()
on the onMouseDown
event. onMouseDown
will cause a blur event by default, and will not do so when preventDefault
is called. Then, onClick
will have a chance to be called. A blur event will still happen, only after onClick
.
After all, the onClick
event is a combination of onMouseDown
and onMouseUp
, if and only if they both occur within the same element.
Replace on onmousedown
with onfocus
. So this event will be triggered when the focus is inside the textbox.
Replace on onmouseup
with onblur
. The moment you take out your focus out of textbox, onblur will execute.
I guess this is what you might need.
UPDATE:
when you execute your function onfocus-->remove the classes that you will apply in onblur and add the classes that you want to be executed onfocus
and
when you execute your function onblur-->remove the classes that you will apply in onfocus and add the classes that you want to be executed onblur
I don't see any need of flag variables.
UPDATE 2:
You can use the events onmouseout and onmouseover
onmouseover-Detects when the cursor is over it.
onmouseout-Detects when the cursor leaves.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With