WordPress.org

Make WordPress Core

Ticket #47069: admin-bar-hoverintent.diff

File admin-bar-hoverintent.diff, 4.3 KB (added by afercia, 18 months ago)
  • src/js/_enqueues/lib/admin-bar.js

     
    282282                }
    283283        });
    284284} else {
     285
     286// No Jquery hoverIntent v2.2.0 - https://github.com/tristen/hoverintent
     287var myHoverIntent = function(el, onOver, onOut) {
     288        var x, y, pX, pY;
     289        var mouseOver = false;
     290        var focused = false;
     291        var h = {},
     292                state = 0,
     293                timer = 0;
     294
     295        var options = {
     296                sensitivity: 7,
     297                interval: 100,
     298                timeout: 0,
     299                handleFocus: false
     300        };
     301
     302        function delay(el, e) {
     303                if (timer) timer = clearTimeout(timer);
     304                state = 0;
     305                return focused ? undefined : onOut.call(el, e);
     306        }
     307
     308        function tracker(e) {
     309                x = e.clientX;
     310                y = e.clientY;
     311        }
     312
     313        function compare(el, e) {
     314                if (timer) timer = clearTimeout(timer);
     315                if ((Math.abs(pX - x) + Math.abs(pY - y)) < options.sensitivity) {
     316                        state = 1;
     317                        return focused ? undefined : onOver.call(el, e);
     318                } else {
     319                        pX = x;
     320                        pY = y;
     321                        timer = setTimeout(function() {
     322                                compare(el, e);
     323                        }, options.interval);
     324                }
     325        }
     326
     327        // Public methods
     328        h.options = function(opt) {
     329                var focusOptionChanged = opt.handleFocus !== options.handleFocus;
     330                options = Object.assign({}, options, opt);
     331                if (focusOptionChanged) {
     332                        options.handleFocus ? addFocus() : removeFocus();
     333                }
     334                return h;
     335        };
     336
     337        function dispatchOver(e) {
     338                mouseOver = true;
     339                if (timer) timer = clearTimeout(timer);
     340                el.removeEventListener('mousemove', tracker, false);
     341
     342                if (state !== 1) {
     343                        pX = e.clientX;
     344                        pY = e.clientY;
     345
     346                        el.addEventListener('mousemove', tracker, false);
     347
     348                        timer = setTimeout(function() {
     349                                compare(el, e);
     350                        }, options.interval);
     351                }
     352
     353                return this;
     354        }
     355
     356        function dispatchOut(e) {
     357                mouseOver = false;
     358                if (timer) timer = clearTimeout(timer);
     359                el.removeEventListener('mousemove', tracker, false);
     360
     361                if (state === 1) {
     362                        timer = setTimeout(function() {
     363                                delay(el, e);
     364                        }, options.timeout);
     365                }
     366
     367                return this;
     368        }
     369
     370        function dispatchFocus(e) {
     371                if (!mouseOver) {
     372                        focused = true;
     373                        onOver.call(el, e);
     374                }
     375        }
     376
     377        function dispatchBlur(e) {
     378                if (!mouseOver && focused) {
     379                        focused = false;
     380                        onOut.call(el, e);
     381                }
     382        }
     383
     384        function addFocus() {
     385                el.addEventListener('focus', dispatchFocus, false);
     386                el.addEventListener('blur', dispatchBlur, false);
     387        }
     388
     389        function removeFocus() {
     390                el.removeEventListener('focus', dispatchFocus, false);
     391                el.removeEventListener('blur', dispatchBlur, false);
     392        }
     393
     394        h.remove = function() {
     395                if (!el) return;
     396                el.removeEventListener('mouseover', dispatchOver, false);
     397                el.removeEventListener('mouseout', dispatchOut, false);
     398                removeFocus();
     399        };
     400
     401        if (el) {
     402                el.addEventListener('mouseover', dispatchOver, false);
     403                el.addEventListener('mouseout', dispatchOut, false);
     404        }
     405
     406        return h;
     407};
     408
    285409        /**
    286410         * Wrapper function for the adminbar that's used if jQuery isn't available.
    287411         *
     
    312436                        }
    313437                },
    314438
    315                 aB, hc = new RegExp('\\bhover\\b', 'g'), q = [],
     439                aB, adminBarMenus,
     440                hc = new RegExp('\\bhover\\b', 'g'), q = [],
    316441                rselected = new RegExp('\\bselected\\b', 'g'),
    317442
    318443                /**
     
    403528                                        (function(t) {
    404529                                                var to = setTimeout(function() {
    405530                                                        t.className = t.className ? t.className.replace(hc, '') : '';
    406                                                 }, 500);
     531                                                }, 180);
    407532                                                q[q.length] = [to, t];
    408533                                        })(t);
    409534                                }
     
    502627                };
    503628
    504629                addEvent(w, 'load', function() {
     630                        var i;
    505631                        aB = d.getElementById('wpadminbar');
     632                        adminBarMenus = aB.querySelectorAll( 'li.menupop' );
    506633
    507634                        if ( d.body && aB ) {
    508635                                d.body.appendChild( aB );
     
    510637                                if ( aB.className )
    511638                                        aB.className = aB.className.replace(/nojs/, '');
    512639
    513                                 addEvent(aB, 'mouseover', function(e) {
    514                                         addHoverClass( e.target || e.srcElement );
    515                                 });
     640                                for ( i = 0; i < adminBarMenus.length; i++ ) {
     641                                        myHoverIntent( adminBarMenus[ i ],
     642                                                function( e ) {
     643                                                        addHoverClass( e.target || e.srcElement );
     644                                                }, function( e ) {
     645                                                        removeHoverClass( e.target || e.srcElement );
     646                                        } ).options( {
     647                                                timeout: 0,
     648                                                sensitivity: 7,
     649                                                interval: 100
     650                                        } );
     651                                }
    516652
    517                                 addEvent(aB, 'mouseout', function(e) {
    518                                         removeHoverClass( e.target || e.srcElement );
    519                                 });
    520 
    521653                                addEvent(aB, 'click', clickShortlink );
    522654
    523655                                addEvent(aB, 'click', function(e) {