#7340 closed bug (fixed)
.focus() not triggering focusin event for .live binding (1.4.3)?
Reported by: | AP Erebus | Owned by: | dmethvin |
---|---|---|---|
Priority: | blocker | Milestone: | 1.5.2 |
Component: | event | Version: | 1.4.3 |
Keywords: | regression | Cc: | |
Blocked by: | #8036 | Blocking: | #8275 |
Description
As demonstrated with this jsFiddle (http://jsfiddle.net/yt7Jd/2/), the focusin even isn't being triggered when .focus() is called.
This appears to be a bug introduced in 1.4.3 as when you change the jQuery version 1.4.2, it works correctly (as seen in this jsFiddle http://jsfiddle.net/yt7Jd/1/
I am testing on Chrome Stable 7.0.517.41
Change History (19)
comment:1 Changed 12 years ago by
Component: | unfiled → event |
---|---|
Keywords: | regression added |
Milestone: | 1.5 → 1.4.5 |
Priority: | undecided → blocker |
Status: | new → open |
comment:2 Changed 12 years ago by
Owner: | set to dmethvin |
---|---|
Status: | open → assigned |
comment:3 Changed 12 years ago by
comment:4 Changed 12 years ago by
Milestone: | 1.4.5 → 1.5 |
---|
comment:6 Changed 12 years ago by
RE: https://forum.jquery.com/topic/v1-4-3-unexpected-focus-behavior
even in 1.4.2, sequentially calling focus() on a,b,c is not exactly what the browsers do.
1.4.2:
- focus a
- focusin a
- focus b
- focusout a
- focusin b
- focus c
- focusout b
- focusin c
native (no jquery):
- focus a
- blur a
- focus b
- blur b
- focus c
this is reproducible both manually (mouse/keyboard) and in code
i believe a proper mix should therefore be
$("#a").focus():
- blur document.activeElement
- focusout document.activeElement (bubbles)
- change document.activeElement (if there was a change)
- haschanged document.activeElement (maybe a new bubbling change event)
- focus a
- focusin a (bubbles)
$("#b").focus():
repeat above
$("#c").focus():
repeat above
this is all logged using $('input').bind('focus blur focusin focusout'), not live() or delegate.
blur() should also work via 1-4. i know that different browsers fire change events before or after blur events, so the change() order might be screwy, but a custom "haschanged" or "changed" should always fire reliably after focusout().
just random thoughts of course,
Leon
comment:7 Changed 12 years ago by
I've reverted the commit in question here: https://github.com/jquery/jquery/commit/328a86f9a0d3f0907cc950f7543e34cb3efbda3f
comment:8 Changed 12 years ago by
i'm not too familiar with the details of the event dispatcher in jquery. i only know the high level overview of what's done (uniformize events via fix(), live handlers for blur/focus/change done via capture, then focusin/out triggered on e.target)
i'll try to slap a patch together that fires off events in the way i've outlined. also noticed there's a .specialChange there already, will need to dig further. preferably, i'd like to get something consistent into 1.5 final since changes to event dispatch order can be chalked up to a major version bump.
are there any IRC logs relating to discussions of event flow that i can read through instead of trying to make sense of everything through code analysis?
thanks, leon
comment:9 Changed 12 years ago by
Blocked by: | 8036 added |
---|
comment:11 Changed 12 years ago by
might as well add this in here, hacked together some jquery-less event delegation code that has consistent event order (no IE)
yes, there are numerous issues, just proto. technically if you want to catch focusin/out without delegating a blur/focus at same time...those first-order handlers should be registered capturing on document implicitly during lib init. (i think jq does this already)
leon
comment:12 Changed 12 years ago by
Blocking: | 8275 added |
---|
(In #8275) Thanks for taking the time to contribute to the jQuery project by writing a bug report and providing a test case!
jQuery 1.4.4 contained some code to make focusin/focusout bubble also in non IE-browsers. But the code was buggy and got removed for 1.5 .
You can follow the ticket #7340 for progress on this issue.
In the meantime you should be able to workaround this problem by binding to the focus
event instead of focusin
.
comment:13 Changed 12 years ago by
Milestone: | 1.6 → 1.5.2 |
---|
comment:17 Changed 12 years ago by
Hi,
I have some issues with trigger('focus') firing twice as of 1.5.2, 1.6beta, and the git version. Here is an example: http://jsfiddle.net/WVcy5/
In this example, I binded 'focus' and 'focusin' to an object and simply trigger('focus') on it.
expected output:
Focus called, count is :1 Do nothing
actual output:
Focus called, count is :1 Do nothing Focus called, count is :2
It seems like trigger('focus') would cause "focus" to fire twice if "focusin" is also binded, is this expected behavior?
Thanks, Harris
comment:18 Changed 12 years ago by
In addition to my previous post, it seems like it's only a problem when "tabindex" is in the element. I tried it on 1.6rc1 and the problem remains.
To demonstrate, you can checkout my github unit test here: https://github.com/harriswong/infusion/blob/FLUID-4113-test/src/webapp/tests/component-tests/reorderer/html/jQueryEventFocus-test.html
Or you can try this example here: https://github.com/harriswong/infusion/blob/FLUID-4113-test/src/webapp/tests/component-tests/reorderer/js/harris2.html
Thanks, Harris
It's this commit: https://github.com/dmethvin/jquery/commit/88068f82c199847d3679b130664dd91cc2e89f00
A focus from user action or DOM .focus() works fine, but a $().focus() is ignored. The test case seems to have intentionally used a DOM focus.