Skip to main content

Bug Tracker

Side navigation

#7340 closed bug (fixed)

Opened October 28, 2010 06:06AM UTC

Closed March 21, 2011 02:53PM UTC

Last modified February 21, 2014 07:24AM UTC

.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: Blocking:
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

Attachments (0)
Change History (19)

Changed October 28, 2010 05:13PM UTC by rwaldron comment:1

component: unfiledevent
keywords: → regression
milestone: 1.51.4.5
priority: undecidedblocker
status: newopen

Changed December 31, 2010 05:55PM UTC by dmethvin comment:2

owner: → dmethvin
status: openassigned

Changed January 02, 2011 04:09AM UTC by dmethvin comment:3

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.

Changed January 17, 2011 06:50PM UTC by dmethvin comment:4

milestone: 1.4.51.5

Changed January 19, 2011 02:02PM UTC by dmethvin comment:5

#8004 is a duplicate of this ticket.

Changed January 19, 2011 04:38PM UTC by leeoniya@gmail.com comment:6

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:

1. focus a

2. focusin a

3. focus b

4. focusout a

5. focusin b

6. focus c

7. focusout b

8. focusin c

native (no jquery):

1. focus a

2. blur a

3. focus b

4. blur b

5. focus c

this is reproducible both manually (mouse/keyboard) and in code

i believe a proper mix should therefore be

$("#a").focus():

1. blur document.activeElement

2. focusout document.activeElement (bubbles)

3. change document.activeElement (if there was a change)

4. haschanged document.activeElement (maybe a new bubbling change event)

5. focus a

6. 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

Changed January 21, 2011 02:25PM UTC by john comment:7

Changed January 21, 2011 05:10PM UTC by leeoniya@gmail.com comment:8

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

Changed January 22, 2011 03:31AM UTC by dmethvin comment:9

blockedby: → 8036

Changed January 24, 2011 05:10PM UTC by john comment:10

milestone: 1.51.6

Pushing to 1.6.

Changed January 25, 2011 07:15AM UTC by leeoniya@gmail.com comment:11

might as well add this in here, hacked together some jquery-less event delegation code that has consistent event order (no IE)

http://jsfiddle.net/B46RY/1/

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

Changed February 14, 2011 11:12PM UTC by jitter comment:12

blocking: → 8275

(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.

Changed February 28, 2011 05:42PM UTC by dmethvin comment:13

milestone: 1.61.5.2

Changed March 07, 2011 05:08PM UTC by dmethvin comment:14

Changed March 21, 2011 02:53PM UTC by john comment:15

resolution: → fixed
status: assignedclosed

Landed.

Changed March 24, 2011 03:22PM UTC by dmethvin comment:16

#8582 is a duplicate of this ticket.

Changed April 21, 2011 06:33PM UTC by harriswong comment:17

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

Changed April 29, 2011 04:14PM UTC by harriswong comment:18

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

Changed February 21, 2014 07:24AM UTC by anonymous comment:19

Interesting to see ... thank you it's well done :)[http://www.aquademica.se/mogel/fuktskada/ fuktskada]