Thanks to Perfection kills, we can use the following JavaScript to detect event support:
function hasEvent(ev) {
var elem = document.createElement('a'),
type = 'on' + ev,
supported = elem[type] !== undefined;
if (!supported) {
elem.setAttribute(type, 'return;');
supported = typeof elem[type] === 'function';
}
elem = null;
return supported;
}
This works for about the only time I need it: detecting mouseenter
support; hasEvent('mouseenter')
will return false in Chrome, Firefox, etc., as it should.
But now I'm trying to "fix" browsers that don't support the focusin
and focusout
events. According to PPK, that's basically just Firefox. Unfortunately, Chrome and Safari are listed as having "incomplete" support, for the following reason:
Safari and Chrome fire these events only with addEventListener; not with traditional registration.
In general, that's fine; I'd only be using addEventListener
anyway. It does mean, however, that detecting support via elem.onfocusin !== undefined
won't work. I tested it out, and it's true:
<p>Do I support <a href="#">focusin</a>?</p>
<script>
var elem = document.getElementsByTagName('p')[0];
// hasEvent method defined here
function listener() {
var response = hasEvent('focusin') ? 'Yes!' : 'No...';
alert(response);
}
elem.addEventListener('focusin', listener, false);
</script>
The above alerts No...
in Chrome! Is there any way to detect whether the browser supports focusin
, without using browser sniffing?
mouseenter
doesn't bubble, whilemouseover
does;focusin
/focusout
do bubble,focus
/blur
don't. – InkhornrelatedTarget
property which points to the element that has lost/received focus. – Clench