How to detect `focusin` support?

前端 未结 3 2029
天命终不由人
天命终不由人 2020-12-30 06:44

Thanks to Perfection kills, we can use the following JavaScript to detect event support:

function hasEvent(ev) {
    var elem = document.createElement(\'a\'),         


        
相关标签:
3条回答
  • 2020-12-30 06:58

    You can test for ("onfocusin" in document).

    This method has the advantage of being light and unobtrusive and it will tell you whether the browser supports the focusin event. (not on Chrome, sorry)

    You may use the following code to get the same behaviour as the focusin event on all browsers (IE9+, Chrome, Firefox, Edge):

    var eventName, useCapture;
    if ("onfocusin" in document) {
      eventName = "focusin";
      useCapture = false;
    } else {      
      eventName = "focus";
      useCapture = true;
    }
    
    document.body.addEventListener(eventName, function( event ) {
        event.target.style.background = "pink";    
      }, useCapture);
    

    JS fiddle here: https://jsfiddle.net/d306qm92/2/

    More information about the Firefox workaround here: https://developer.mozilla.org/en-US/docs/Web/Events/focus#Event_delegation

    UPDATE: As said above, the test will wrongly say "false" on Chrome, nonetheless the code sample will work as intended as Chrome supports both methods (focusin and focus with useCapture).

    0 讨论(0)
  • 2020-12-30 07:00

    focusin & focusout should be fired BEFORE target element receives focus, event order is also seems buggy

    http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order

    currently, only IE works according to spec:

    Chrome/Safari:
    focus
    focusin
    DOMFocusIn
    blur
    focusout
    DOMFocusOut
    focus
    focusin
    DOMFocusIn
    
    Opera 12:
    focus
    DOMFocusIn
    focusin
    blur
    DOMFocusOut
    focusout
    focus
    DOMFocusIn
    focusin
    
    IE 8:
    focusin
    focus
    focusout
    focusin
    blur
    focus
    
    Firefox 14:
    focus
    blur
    focus
    
    0 讨论(0)
  • 2020-12-30 07:19

    This uses the fact that calling focus() triggers focusin: http://jsfiddle.net/pimvdb/YXeD3/.

    The element must be visible and inserted into the DOM, otherwise focusin is not fired for some reason.

    var result = (function() {
        var hasIt = false;
    
        function swap() {
            hasIt = true; // when fired, set hasIt to true
        }
    
        var a = document.createElement('a'); // create test element
        a.href = "#"; // to make it focusable
        a.addEventListener('focusin', swap, false); // bind focusin
    
        document.body.appendChild(a); // append
        a.focus(); // focus
        document.body.removeChild(a); // remove again
    
        return hasIt; // should be true if focusin is fired
    })();
    
    0 讨论(0)
提交回复
热议问题