In changePage() I see this:
$( window.document.activeElement || "" ).add( "input:focus, textarea:focus, select:focus" ).blur();
This will cause JQM to search the entire document every time we change pages just to release keyboard focus. Instead, we should probably be using a live("focus") handler and tracking the currently focused element so we don't have to crawl the document.
I'll try to address this as part of the path navigation re-working I'm doing.
Related changePage() performance issue:
Hey Kin, looking into this, unless I'm missing something window.document.activeElement is determinate. It's a reference to the page's h1 element typically. So this line does no document searching at all.
On the other hand, if you are actually referring to refocus(), which looks to be the other facet of this, then I understand :-)
But the add() searches the document doesn't it?
Doh! Right you are. I was looking at the wrong alternate signatures of .add(). http://api.jquery.com/add/
Something worth speed-testing: I bet $(":input:focus").blur() may be streets faster since, internally, the :input is regex-driven.
Is this still a concern? Already fixed?
We're still searching for :focus elements, so this should stay open.
See also #1855
Related to #4340
Hey @jaspermdegroot @jblas This issue is super old (has it really been 3 years since 2011?!?) Can you confirm whether this is still an issue or if it has been fixed with new releases of JQM? Thanks!
@ldeluca Even though this is super old, the issue/performance loss is still valid. Seaching jquery.mobile-1.4.5.js line 5573 reveals that this is still an issue:
// Kill the keyboard.
// XXX_jblas: We need to stop crawling the entire document to kill focus.
// Instead, we should be tracking focus with a delegate()
// handler so we already have the element in hand at this
If we end up keeping the selector we need to change it to this.document.find( "input:focus, textarea:focus, select:focus" ).blur(). We also need to change document.activeElement to this.document[ 0 ].activeElement.
this.document.find( "input:focus, textarea:focus, select:focus" ).blur()
this.document[ 0 ].activeElement
@arschmitz Could you please weigh in? Here's the code in question.
We discussed this today it does not look like there is any case where this will actually happen. so lets go ahead and remove this, and clean it up.
Pagecontainer: Remove unnecessary $( ":focus" ) fallback on page change