javascript tutorial - [Solved-5 Solutions] DOM element focus - javascript - java script - javascript array
Problem:
How do I find out which DOM element has the focus?
Solution 1:
document.activeElement
is now part of the HTML5 working draft specification, but it might not yet be supported in some non-major/mobile/older browsers. we can fall back toquerySelector
(if that is supported). It's also worth mentioning thatdocument.activeElement
will returndocument.body
code> if no element is focused - even if the browser window doesn't have focus.- The following code will work around this issue and fall back to
querySelector
giving a little better support.
var focused = document.activeElement;
if (!focused || focused == document.body)
focused = null;
else if (document.querySelector)
focused = document.querySelector(":focus");
click below button to copy the code. By JavaScript tutorial team
Solution 3:
The approach used by Joel S, but I also love the simplicity of document.activeElement
. I used jQuery and combined the two. Older browsers that don't support document.activeElement
will use jQuery.data()
to store the value of 'hasFocus'. Newer browsers will use document.activeElement
. I assume that document.activeElement
will have better performance.
(function($) {
var settings;
$.fn.focusTracker = function(options) {
settings = $.extend({}, $.focusTracker.defaults, options);
if (!document.activeElement) {
this.each(function() {
var $this = $(this).data('hasFocus', false);
$this.focus(function(event) {
$this.data('hasFocus', true);
});
$this.blur(function(event) {
$this.data('hasFocus', false);
});
});
}
return this;
};
$.fn.hasFocus = function() {
if (this.length === 0) { return false; }
if (document.activeElement) {
return this.get(0) === document.activeElement;
}
return this.data('hasFocus');
};
$.focusTracker = {
defaults: {
context: 'body'
},
focusedElement: function(context) {
var focused;
if (!context) { context = settings.context; }
if (document.activeElement) {
if ($(document.activeElement).closest(context).length > 0) {
focused = document.activeElement;
}
} else {
$(':visible:enabled', context).each(function() {
if ($(this).data('hasFocus')) {
focused = this;
return false;
}
});
}
return $(focused);
}
};
})(jQuery);
click below button to copy the code. By JavaScript tutorial team
Solution 4:
FocusTracker = {
startFocusTracking: function() {
this.store('hasFocus', false);
this.addEvent('focus', function() { this.store('hasFocus', true); });
this.addEvent('blur', function() { this.store('hasFocus', false); });
},
hasFocus: function() {
return this.retrieve('hasFocus');
}
}
Element.implement(FocusTracker);
click below button to copy the code. By JavaScript tutorial team
Solution 5:
if (typeof document.activeElement === 'undefined') { // Check browser doesn't do it anyway
$('*').live('focus', function () { // Attach to all focus events using .live()
document.activeElement = this; // Set activeElement to the element that has been focussed
});
}