WordPress.org

Make WordPress Core

Ticket #20614: 20614-4.patch

File 20614-4.patch, 7.9 KB (added by azaozz, 8 years ago)

Touchstart works better than click on touch screen devices

  • wp-admin/js/common.js

     
    195195                }
    196196        });
    197197
    198         $('li.wp-has-submenu', menu).hoverIntent({
    199                 over: function(e){
    200                         var b, h, o, f, m = $(this).find('.wp-submenu'), menutop, wintop, maxtop, top = parseInt( m.css('top'), 10 );
     198        if ( 'ontouchstart' in window ) { // touch screen device
     199                // close any open submenus
     200                $(document.body).on('touchstart.wp-mobile-adminmenu-hover', function(e) {
     201                        menu.find('li.wp-has-submenu.opensub').removeClass('opensub');
     202                });
    201203
    202                         if ( isNaN(top) || top > -5 ) // meaning the submenu is visible
    203                                 return;
     204                menu.find('li.wp-has-submenu').on('touchstart.wp-mobile-adminmenu-hover', function(e) {
     205                        var el = $(this);
    204206
    205                         menutop = $(this).offset().top;
    206                         wintop = $(window).scrollTop();
    207                         maxtop = menutop - wintop - 30; // max = make the top of the sub almost touch admin bar
     207                        e.stopPropagation();
    208208
    209                         b = menutop + m.height() + 1; // Bottom offset of the menu
    210                         h = $('#wpwrap').height(); // Height of the entire page
    211                         o = 60 + b - h;
    212                         f = $(window).height() + wintop - 15; // The fold
     209                        if ( !el.hasClass('opensub') ) {
     210                                e.preventDefault();
     211                                menu.find('li.wp-has-submenu.opensub').removeClass('opensub');
     212                                el.addClass('opensub');
     213                        }
     214                });
     215        } else {
     216                menu.find('li.wp-has-submenu').hoverIntent({
     217                        over: function(e){
     218                                var b, h, o, f, m = $(this).find('.wp-submenu'), menutop, wintop, maxtop, top = parseInt( m.css('top'), 10 );
    213219
    214                         if ( f < (b - o) )
    215                                 o = b - f;
     220                                if ( isNaN(top) || top > -5 ) // meaning the submenu is visible
     221                                        return;
    216222
    217                         if ( o > maxtop )
    218                                 o = maxtop;
     223                                menutop = $(this).offset().top;
     224                                wintop = $(window).scrollTop();
     225                                maxtop = menutop - wintop - 30; // max = make the top of the sub almost touch admin bar
    219226
    220                         if ( o > 1 )
    221                                 m.css('margin-top', '-'+o+'px');
    222                         else
    223                                 m.css('margin-top', '');
     227                                b = menutop + m.height() + 1; // Bottom offset of the menu
     228                                h = $('#wpwrap').height(); // Height of the entire page
     229                                o = 60 + b - h;
     230                                f = $(window).height() + wintop - 15; // The fold
    224231
    225                         menu.find('li.menu-top').removeClass('opensub');
    226                         $(this).addClass('opensub');
    227                 },
    228                 out: function(){
    229                         $(this).removeClass('opensub').find('.wp-submenu').css('margin-top', '');
    230                 },
    231                 timeout: 200,
    232                 sensitivity: 7,
    233                 interval: 90
    234         });
     232                                if ( f < (b - o) )
     233                                        o = b - f;
    235234
    236         menu.on('focus.adminmenu', '.wp-submenu a', function(e){
    237                 $(e.target).closest('li.menu-top').addClass('opensub');
    238         }).on('blur.adminmenu', '.wp-submenu a', function(e){
    239                 $(e.target).closest('li.menu-top').removeClass('opensub');
    240         });
     235                                if ( o > maxtop )
     236                                        o = maxtop;
    241237
     238                                if ( o > 1 )
     239                                        m.css('margin-top', '-'+o+'px');
     240                                else
     241                                        m.css('margin-top', '');
     242
     243                                menu.find('li.menu-top').removeClass('opensub');
     244                                $(this).addClass('opensub');
     245                        },
     246                        out: function(){
     247                                $(this).removeClass('opensub').find('.wp-submenu').css('margin-top', '');
     248                        },
     249                        timeout: 200,
     250                        sensitivity: 7,
     251                        interval: 90
     252                });
     253               
     254                menu.on('focus.adminmenu', '.wp-submenu a', function(e){
     255                        $(e.target).closest('li.menu-top').addClass('opensub');
     256                }).on('blur.adminmenu', '.wp-submenu a', function(e){
     257                        $(e.target).closest('li.menu-top').removeClass('opensub');
     258                });
     259        }
     260
    242261        // Move .updated and .error alert boxes. Don't move boxes designed to be inline.
    243262        $('div.wrap h2:first').nextAll('div.updated, div.error').addClass('below-h2');
    244263        $('div.updated, div.error').not('.below-h2, .inline').insertAfter( $('div.wrap h2:first') );
  • wp-includes/js/admin-bar.js

     
    44                (function(a){a.fn.hoverIntent=function(l,j){var m={sensitivity:7,interval:100,timeout:0};m=a.extend(m,j?{over:l,out:j}:l);var o,n,h,d;var e=function(f){o=f.pageX;n=f.pageY};var c=function(g,f){f.hoverIntent_t=clearTimeout(f.hoverIntent_t);if((Math.abs(h-o)+Math.abs(d-n))<m.sensitivity){a(f).unbind("mousemove",e);f.hoverIntent_s=1;return m.over.apply(f,[g])}else{h=o;d=n;f.hoverIntent_t=setTimeout(function(){c(g,f)},m.interval)}};var i=function(g,f){f.hoverIntent_t=clearTimeout(f.hoverIntent_t);f.hoverIntent_s=0;return m.out.apply(f,[g])};var b=function(q){var f=this;var g=(q.type=="mouseover"?q.fromElement:q.toElement)||q.relatedTarget;while(g&&g!=this){try{g=g.parentNode}catch(q){g=this}}if(g==this){if(a.browser.mozilla){if(q.type=="mouseout"){f.mtout=setTimeout(function(){k(q,f)},30)}else{if(f.mtout){f.mtout=clearTimeout(f.mtout)}}}return}else{if(f.mtout){f.mtout=clearTimeout(f.mtout)}k(q,f)}};var k=function(p,f){var g=jQuery.extend({},p);if(f.hoverIntent_t){f.hoverIntent_t=clearTimeout(f.hoverIntent_t)}if(p.type=="mouseover"){h=g.pageX;d=g.pageY;a(f).bind("mousemove",e);if(f.hoverIntent_s!=1){f.hoverIntent_t=setTimeout(function(){c(g,f)},m.interval)}}else{a(f).unbind("mousemove",e);if(f.hoverIntent_s==1){f.hoverIntent_t=setTimeout(function(){i(g,f)},m.timeout)}}};return this.mouseover(b).mouseout(b)}})(jQuery);
    55
    66        jQuery(document).ready(function($){
    7                 var refresh = function(i, el){ // force the browser to refresh the tabbing index
     7                var adminbar = $('#wpadminbar'), refresh = function(i, el){ // force the browser to refresh the tabbing index
    88                        var node = $(el), tab = node.attr('tabindex');
    99                        if ( tab )
    1010                                node.attr('tabindex', '0').attr('tabindex', tab);
    1111                };
    1212
    13                 $('#wpadminbar').removeClass('nojq').removeClass('nojs').find('li.menupop').hoverIntent({
    14                         over: function(e){
    15                                 $(this).addClass('hover');
    16                         },
    17                         out: function(e){
    18                                 $(this).removeClass('hover');
    19                         },
    20                         timeout: 180,
    21                         sensitivity: 7,
    22                         interval: 100
    23                 });
     13                adminbar.removeClass('nojq').removeClass('nojs');
     14               
     15                if ( 'ontouchstart' in window ) { // touch screen device
     16                        // close any open drop-downs
     17                        $(document.body).on('touchstart.wp-mobile-adminbar-hover', function() {
     18                                adminbar.find('li.menupop.hover').removeClass('hover');
     19                        });
    2420
     21                        adminbar.find('li.menupop').on('touchstart.wp-mobile-adminbar-hover', function(e) {
     22                                var el = $(this);
     23
     24                                e.stopPropagation();
     25
     26                                if ( !el.hasClass('hover') ) {
     27                                        e.preventDefault();
     28                                        adminbar.find('li.menupop.hover').removeClass('hover');
     29                                        el.addClass('hover');
     30                                }
     31                        });
     32                } else {
     33                        adminbar.find('li.menupop').hoverIntent({
     34                                over: function(e){
     35                                        $(this).addClass('hover');
     36                                },
     37                                out: function(e){
     38                                        $(this).removeClass('hover');
     39                                },
     40                                timeout: 180,
     41                                sensitivity: 7,
     42                                interval: 100
     43                        });
     44                }
     45
    2546                $('#wp-admin-bar-get-shortlink').click(function(e){
    2647                        e.preventDefault();
    2748                        $(this).addClass('selected').children('.shortlink-input').blur(function(){
     
    84105} else {
    85106        (function(d, w) {
    86107                var addEvent = function( obj, type, fn ) {
    87                         if (obj.addEventListener)
     108                        if ( obj.addEventListener )
    88109                                obj.addEventListener(type, fn, false);
    89                         else if (obj.attachEvent)
     110                        else if ( obj.attachEvent )
    90111                                obj.attachEvent('on' + type, function() { return fn.call(obj, window.event);});
    91112                },
    92113
     
    98119                 */
    99120                getTOID = function(el) {
    100121                        var i = q.length;
    101                         while( i-- )
     122                        while ( i-- ) {
    102123                                if ( q[i] && el == q[i][1] )
    103124                                        return q[i][0];
     125                        }
    104126                        return false;
    105127                },
    106128
     
    110132                                ancestorLength = 0;
    111133
    112134                        while ( t && t != aB && t != d ) {
    113                                 if( 'LI' == t.nodeName.toUpperCase() ) {
     135                                if ( 'LI' == t.nodeName.toUpperCase() ) {
    114136                                        ancestors[ ancestors.length ] = t;
    115137                                        id = getTOID(t);
    116138                                        if ( id )
     
    151173
    152174                removeHoverClass = function(t) {
    153175                        while ( t && t != aB && t != d ) {
    154                                 if( 'LI' == t.nodeName.toUpperCase() ) {
     176                                if ( 'LI' == t.nodeName.toUpperCase() ) {
    155177                                        (function(t) {
    156178                                                var to = setTimeout(function() {
    157179                                                        t.className = t.className ? t.className.replace(hc, '') : '';