[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

title

Body

[close]

/wp-includes/js/ -> admin-bar.js (source)

   1  /**
   2   * @output wp-includes/js/admin-bar.js
   3   */
   4  
   5  /* jshint loopfunc: true */
   6  // use jQuery and hoverIntent if loaded
   7  if ( typeof(jQuery) != 'undefined' ) {
   8      if ( typeof(jQuery.fn.hoverIntent) == 'undefined' ) {
   9          /* jshint ignore:start */
  10          // hoverIntent v1.8.1 - Copy of wp-includes/js/hoverIntent.min.js
  11          !function(a){a.fn.hoverIntent=function(b,c,d){var e={interval:100,sensitivity:6,timeout:0};e="object"==typeof b?a.extend(e,b):a.isFunction(c)?a.extend(e,{over:b,out:c,selector:d}):a.extend(e,{over:b,out:b,selector:c});var f,g,h,i,j=function(a){f=a.pageX,g=a.pageY},k=function(b,c){return c.hoverIntent_t=clearTimeout(c.hoverIntent_t),Math.sqrt((h-f)*(h-f)+(i-g)*(i-g))<e.sensitivity?(a(c).off("mousemove.hoverIntent",j),c.hoverIntent_s=!0,e.over.apply(c,[b])):(h=f,i=g,c.hoverIntent_t=setTimeout(function(){k(b,c)},e.interval),void 0)},l=function(a,b){return b.hoverIntent_t=clearTimeout(b.hoverIntent_t),b.hoverIntent_s=!1,e.out.apply(b,[a])},m=function(b){var c=a.extend({},b),d=this;d.hoverIntent_t&&(d.hoverIntent_t=clearTimeout(d.hoverIntent_t)),"mouseenter"===b.type?(h=c.pageX,i=c.pageY,a(d).on("mousemove.hoverIntent",j),d.hoverIntent_s||(d.hoverIntent_t=setTimeout(function(){k(c,d)},e.interval))):(a(d).off("mousemove.hoverIntent",j),d.hoverIntent_s&&(d.hoverIntent_t=setTimeout(function(){l(c,d)},e.timeout)))};return this.on({"mouseenter.hoverIntent":m,"mouseleave.hoverIntent":m},e.selector)}}(jQuery);
  12          /* jshint ignore:end */
  13      }
  14      jQuery(document).ready(function($){
  15          var adminbar = $('#wpadminbar'), refresh, touchOpen, touchClose, disableHoverIntent = false;
  16  
  17          /**
  18           * Forces the browser to refresh the tabbing index.
  19           *
  20           * @since 3.3.0
  21           *
  22           * @param {number}      i  The index of the HTML element to remove the tab index
  23           *                         from. This parameter is necessary because we use this
  24           *                         function in .each calls.
  25           * @param {HTMLElement} el The HTML element to remove the tab index from.
  26           *
  27           * @return {void}
  28           */
  29          refresh = function(i, el){
  30              var node = $(el), tab = node.attr('tabindex');
  31              if ( tab )
  32                  node.attr('tabindex', '0').attr('tabindex', tab);
  33          };
  34  
  35          /**
  36           * Adds or removes the hover class on touch.
  37           *
  38           * @since 3.5.0
  39           *
  40           * @param {boolean} unbind If true removes the wp-mobile-hover class.
  41           *
  42           * @return {void}
  43           */
  44          touchOpen = function(unbind) {
  45              adminbar.find('li.menupop').on('click.wp-mobile-hover', function(e) {
  46                  var el = $(this);
  47  
  48                  if ( el.parent().is('#wp-admin-bar-root-default') && !el.hasClass('hover') ) {
  49                      e.preventDefault();
  50                      adminbar.find('li.menupop.hover').removeClass('hover');
  51                      el.addClass('hover');
  52                  } else if ( !el.hasClass('hover') ) {
  53                      e.stopPropagation();
  54                      e.preventDefault();
  55                      el.addClass('hover');
  56                  } else if ( ! $( e.target ).closest( 'div' ).hasClass( 'ab-sub-wrapper' ) ) {
  57                      // We're dealing with an already-touch-opened menu genericon (we know el.hasClass('hover')),
  58                      // so close it on a second tap and prevent propag and defaults. See #29906
  59                      e.stopPropagation();
  60                      e.preventDefault();
  61                      el.removeClass('hover');
  62                  }
  63  
  64                  if ( unbind ) {
  65                      $('li.menupop').off('click.wp-mobile-hover');
  66                      disableHoverIntent = false;
  67                  }
  68              });
  69          };
  70  
  71          /**
  72           * Removes the hover class if clicked or touched outside the admin bar.
  73           *
  74           * @since 3.5.0
  75           *
  76           * @return {void}
  77           */
  78          touchClose = function() {
  79              var mobileEvent = /Mobile\/.+Safari/.test(navigator.userAgent) ? 'touchstart' : 'click';
  80              // close any open drop-downs when the click/touch is not on the toolbar
  81              $(document.body).on( mobileEvent+'.wp-mobile-hover', function(e) {
  82                  if ( !$(e.target).closest('#wpadminbar').length )
  83                      adminbar.find('li.menupop.hover').removeClass('hover');
  84              });
  85          };
  86  
  87          adminbar.removeClass('nojq').removeClass('nojs');
  88  
  89          // If clicked on the adminbar add the hoverclass, if clicked outside it remove
  90          // it.
  91          if ( 'ontouchstart' in window ) {
  92              adminbar.on('touchstart', function(){
  93                  touchOpen(true);
  94                  disableHoverIntent = true;
  95              });
  96              touchClose();
  97          } else if ( /IEMobile\/[1-9]/.test(navigator.userAgent) ) {
  98              touchOpen();
  99              touchClose();
 100          }
 101  
 102          // Adds or removes the hover class based on the hover intent.
 103          adminbar.find('li.menupop').hoverIntent({
 104              over: function() {
 105                  if ( disableHoverIntent )
 106                      return;
 107  
 108                  $(this).addClass('hover');
 109              },
 110              out: function() {
 111                  if ( disableHoverIntent )
 112                      return;
 113  
 114                  $(this).removeClass('hover');
 115              },
 116              timeout: 180,
 117              sensitivity: 7,
 118              interval: 100
 119          });
 120  
 121          // Prevents the toolbar from covering up content when a hash is present in the
 122          // URL.
 123          if ( window.location.hash )
 124              window.scrollBy( 0, -32 );
 125  
 126          /**
 127           * Handles the selected state of the Shortlink link.
 128           *
 129           * When the input is visible the link should be selected, when the input is
 130           * unfocused the link should be unselected.
 131           *
 132           * @param {Object} e The click event.
 133           *
 134           * @return {void}
 135           **/
 136          $('#wp-admin-bar-get-shortlink').click(function(e){
 137              e.preventDefault();
 138              $(this).addClass('selected').children('.shortlink-input').blur(function(){
 139                  $(this).parents('#wp-admin-bar-get-shortlink').removeClass('selected');
 140              }).focus().select();
 141          });
 142  
 143          /**
 144           * Removes the hoverclass if the enter key is pressed.
 145           *
 146           * Makes sure the tab index is refreshed by refreshing each ab-item
 147           * and its children.
 148           *
 149           * @param {Object} e The keydown event.
 150           *
 151           * @return {void}
 152           */
 153          $('#wpadminbar li.menupop > .ab-item').bind('keydown.adminbar', function(e){
 154              // Key code 13 is the enter key.
 155              if ( e.which != 13 )
 156                  return;
 157  
 158              var target = $(e.target),
 159                  wrap = target.closest('.ab-sub-wrapper'),
 160                  parentHasHover = target.parent().hasClass('hover');
 161  
 162              e.stopPropagation();
 163              e.preventDefault();
 164  
 165              if ( !wrap.length )
 166                  wrap = $('#wpadminbar .quicklinks');
 167  
 168              wrap.find('.menupop').removeClass('hover');
 169  
 170              if ( ! parentHasHover ) {
 171                  target.parent().toggleClass('hover');
 172              }
 173  
 174              target.siblings('.ab-sub-wrapper').find('.ab-item').each(refresh);
 175          }).each(refresh);
 176  
 177          /**
 178           * Removes the hover class when the escape key is pressed.
 179           *
 180           * Makes sure the tab index is refreshed by refreshing each ab-item
 181           * and its children.
 182           *
 183           * @param {Object} e The keydown event.
 184           *
 185           * @return {void}
 186           */
 187          $('#wpadminbar .ab-item').bind('keydown.adminbar', function(e){
 188              // Key code 27 is the escape key.
 189              if ( e.which != 27 )
 190                  return;
 191  
 192              var target = $(e.target);
 193  
 194              e.stopPropagation();
 195              e.preventDefault();
 196  
 197              target.closest('.hover').removeClass('hover').children('.ab-item').focus();
 198              target.siblings('.ab-sub-wrapper').find('.ab-item').each(refresh);
 199          });
 200  
 201          /**
 202           * Scrolls to top of page by clicking the adminbar.
 203           *
 204           * @param {Object} e The click event.
 205           *
 206           * @return {void}
 207           */
 208          adminbar.click( function(e) {
 209              if ( e.target.id != 'wpadminbar' && e.target.id != 'wp-admin-bar-top-secondary' ) {
 210                  return;
 211              }
 212  
 213              adminbar.find( 'li.menupop.hover' ).removeClass( 'hover' );
 214              $( 'html, body' ).animate( { scrollTop: 0 }, 'fast' );
 215              e.preventDefault();
 216          });
 217  
 218          /**
 219           * Sets the focus on an element with a href attribute.
 220           *
 221           * The timeout is used to fix a focus bug in WebKit.
 222           *
 223           * @param {Object} e The keydown event.
 224           *
 225           * @return {void}
 226           */
 227          $('.screen-reader-shortcut').keydown( function(e) {
 228              var id, ua;
 229  
 230              if ( 13 != e.which )
 231                  return;
 232  
 233              id = $( this ).attr( 'href' );
 234  
 235              ua = navigator.userAgent.toLowerCase();
 236  
 237              if ( ua.indexOf('applewebkit') != -1 && id && id.charAt(0) == '#' ) {
 238                  setTimeout(function () {
 239                      $(id).focus();
 240                  }, 100);
 241              }
 242          });
 243  
 244          $( '#adminbar-search' ).on({
 245              /**
 246               * Adds the adminbar-focused class on focus.
 247               *
 248               * @return {void}
 249               */
 250              focus: function() {
 251                  $( '#adminbarsearch' ).addClass( 'adminbar-focused' );
 252              /**
 253               * Removes the adminbar-focused class on blur.
 254               *
 255               * @return {void}
 256               */
 257              }, blur: function() {
 258                  $( '#adminbarsearch' ).removeClass( 'adminbar-focused' );
 259              }
 260          } );
 261  
 262          if ( 'sessionStorage' in window ) {
 263              /**
 264               * Empties sessionStorage on logging out.
 265               *
 266               * @return {void}
 267               */
 268              $('#wp-admin-bar-logout a').click( function() {
 269                  try {
 270                      for ( var key in sessionStorage ) {
 271                          if ( key.indexOf('wp-autosave-') != -1 )
 272                              sessionStorage.removeItem(key);
 273                      }
 274                  } catch(e) {}
 275              });
 276          }
 277  
 278          if ( navigator.userAgent && document.body.className.indexOf( 'no-font-face' ) === -1 &&
 279              /Android (1.0|1.1|1.5|1.6|2.0|2.1)|Nokia|Opera Mini|w(eb)?OSBrowser|webOS|UCWEB|Windows Phone OS 7|XBLWP7|ZuneWP7|MSIE 7/.test( navigator.userAgent ) ) {
 280  
 281              document.body.className += ' no-font-face';
 282          }
 283      });
 284  } else {
 285      /**
 286       * Wrapper function for the adminbar that's used if jQuery isn't available.
 287       *
 288       * @param {Object} d The document object.
 289       * @param {Object} w The window object.
 290       *
 291       * @return {void}
 292       */
 293      (function(d, w) {
 294          /**
 295           * Adds an event listener to an object.
 296           *
 297           * @since 3.1.0
 298           *
 299           * @param {Object}   obj  The object to add the event listener to.
 300           * @param {string}   type The type of event.
 301           * @param {function} fn   The function to bind to the event listener.
 302           *
 303           * @return {void}
 304           */
 305          var addEvent = function( obj, type, fn ) {
 306              if ( obj && typeof obj.addEventListener === 'function' ) {
 307                  obj.addEventListener( type, fn, false );
 308              } else if ( obj && typeof obj.attachEvent === 'function' ) {
 309                  obj.attachEvent( 'on' + type, function() {
 310                      return fn.call( obj, window.event );
 311                  } );
 312              }
 313          },
 314  
 315          aB, hc = new RegExp('\\bhover\\b', 'g'), q = [],
 316          rselected = new RegExp('\\bselected\\b', 'g'),
 317  
 318          /**
 319           * Gets the timeout ID of the given element.
 320           *
 321           * @since 3.1.0
 322           *
 323           * @param {HTMLElement} el The HTML element.
 324           *
 325           * @return {number|boolean} The ID value of the timer that is set or false.
 326           */
 327          getTOID = function(el) {
 328              var i = q.length;
 329              while ( i-- ) {
 330                  if ( q[i] && el == q[i][1] )
 331                      return q[i][0];
 332              }
 333              return false;
 334          },
 335  
 336          /**
 337           * Adds the hoverclass to menu items.
 338           *
 339           * @since 3.1.0
 340           *
 341           * @param {HTMLElement} t The HTML element.
 342           *
 343           * @return {void}
 344           */
 345          addHoverClass = function(t) {
 346              var i, id, inA, hovering, ul, li,
 347                  ancestors = [],
 348                  ancestorLength = 0;
 349  
 350              // aB is adminbar. d is document.
 351              while ( t && t != aB && t != d ) {
 352                  if ( 'LI' == t.nodeName.toUpperCase() ) {
 353                      ancestors[ ancestors.length ] = t;
 354                      id = getTOID(t);
 355                      if ( id )
 356                          clearTimeout( id );
 357                      t.className = t.className ? ( t.className.replace(hc, '') + ' hover' ) : 'hover';
 358                      hovering = t;
 359                  }
 360                  t = t.parentNode;
 361              }
 362  
 363              // Removes any selected classes.
 364              if ( hovering && hovering.parentNode ) {
 365                  ul = hovering.parentNode;
 366                  if ( ul && 'UL' == ul.nodeName.toUpperCase() ) {
 367                      i = ul.childNodes.length;
 368                      while ( i-- ) {
 369                          li = ul.childNodes[i];
 370                          if ( li != hovering )
 371                              li.className = li.className ? li.className.replace( rselected, '' ) : '';
 372                      }
 373                  }
 374              }
 375  
 376              // Removes the hover class for any objects not in the immediate element's ancestry.
 377              i = q.length;
 378              while ( i-- ) {
 379                  inA = false;
 380                  ancestorLength = ancestors.length;
 381                  while( ancestorLength-- ) {
 382                      if ( ancestors[ ancestorLength ] == q[i][1] )
 383                          inA = true;
 384                  }
 385  
 386                  if ( ! inA )
 387                      q[i][1].className = q[i][1].className ? q[i][1].className.replace(hc, '') : '';
 388              }
 389          },
 390  
 391          /**
 392           * Removes the hoverclass from menu items.
 393           *
 394           * @since 3.1.0
 395           *
 396           * @param {HTMLElement} t The HTML element.
 397           *
 398           * @return {void}
 399           */
 400          removeHoverClass = function(t) {
 401              while ( t && t != aB && t != d ) {
 402                  if ( 'LI' == t.nodeName.toUpperCase() ) {
 403                      (function(t) {
 404                          var to = setTimeout(function() {
 405                              t.className = t.className ? t.className.replace(hc, '') : '';
 406                          }, 500);
 407                          q[q.length] = [to, t];
 408                      })(t);
 409                  }
 410                  t = t.parentNode;
 411              }
 412          },
 413  
 414          /**
 415           * Handles the click on the Shortlink link in the adminbar.
 416           *
 417           * @since 3.1.0
 418           *
 419           * @param {Object} e The click event.
 420           *
 421           * @return {boolean} Returns false to prevent default click behavior.
 422           */
 423          clickShortlink = function(e) {
 424              var i, l, node,
 425                  t = e.target || e.srcElement;
 426  
 427              // Make t the shortlink menu item, or return.
 428              while ( true ) {
 429                  // Check if we've gone past the shortlink node,
 430                  // or if the user is clicking on the input.
 431                  if ( ! t || t == d || t == aB )
 432                      return;
 433                  // Check if we've found the shortlink node.
 434                  if ( t.id && t.id == 'wp-admin-bar-get-shortlink' )
 435                      break;
 436                  t = t.parentNode;
 437              }
 438  
 439              // IE doesn't support preventDefault, and does support returnValue
 440              if ( e.preventDefault )
 441                  e.preventDefault();
 442              e.returnValue = false;
 443  
 444              if ( -1 == t.className.indexOf('selected') )
 445                  t.className += ' selected';
 446  
 447              for ( i = 0, l = t.childNodes.length; i < l; i++ ) {
 448                  node = t.childNodes[i];
 449                  if ( node.className && -1 != node.className.indexOf('shortlink-input') ) {
 450                      node.focus();
 451                      node.select();
 452                      node.onblur = function() {
 453                          t.className = t.className ? t.className.replace( rselected, '' ) : '';
 454                      };
 455                      break;
 456                  }
 457              }
 458              return false;
 459          },
 460  
 461          /**
 462           * Scrolls to the top of the page.
 463           *
 464           * @since 3.4.0
 465           *
 466           * @param {HTMLElement} t The HTML element.
 467           *
 468           * @return {void}
 469           */
 470          scrollToTop = function(t) {
 471              var distance, speed, step, steps, timer, speed_step;
 472  
 473              // Ensure that the #wpadminbar was the target of the click.
 474              if ( t.id != 'wpadminbar' && t.id != 'wp-admin-bar-top-secondary' )
 475                  return;
 476  
 477              distance    = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
 478  
 479              if ( distance < 1 )
 480                  return;
 481  
 482              speed_step = distance > 800 ? 130 : 100;
 483              speed     = Math.min( 12, Math.round( distance / speed_step ) );
 484              step      = distance > 800 ? Math.round( distance / 30  ) : Math.round( distance / 20  );
 485              steps     = [];
 486              timer     = 0;
 487  
 488              // Animate scrolling to the top of the page by generating steps to
 489              // the top of the page and shifting to each step at a set interval.
 490              while ( distance ) {
 491                  distance -= step;
 492                  if ( distance < 0 )
 493                      distance = 0;
 494                  steps.push( distance );
 495  
 496                  setTimeout( function() {
 497                      window.scrollTo( 0, steps.shift() );
 498                  }, timer * speed );
 499  
 500                  timer++;
 501              }
 502          };
 503  
 504          addEvent(w, 'load', function() {
 505              aB = d.getElementById('wpadminbar');
 506  
 507              if ( d.body && aB ) {
 508                  d.body.appendChild( aB );
 509  
 510                  if ( aB.className )
 511                      aB.className = aB.className.replace(/nojs/, '');
 512  
 513                  addEvent(aB, 'mouseover', function(e) {
 514                      addHoverClass( e.target || e.srcElement );
 515                  });
 516  
 517                  addEvent(aB, 'mouseout', function(e) {
 518                      removeHoverClass( e.target || e.srcElement );
 519                  });
 520  
 521                  addEvent(aB, 'click', clickShortlink );
 522  
 523                  addEvent(aB, 'click', function(e) {
 524                      scrollToTop( e.target || e.srcElement );
 525                  });
 526  
 527                  addEvent( document.getElementById('wp-admin-bar-logout'), 'click', function() {
 528                      if ( 'sessionStorage' in window ) {
 529                          try {
 530                              for ( var key in sessionStorage ) {
 531                                  if ( key.indexOf('wp-autosave-') != -1 )
 532                                      sessionStorage.removeItem(key);
 533                              }
 534                          } catch(e) {}
 535                      }
 536                  });
 537              }
 538  
 539              if ( w.location.hash )
 540                  w.scrollBy(0,-32);
 541  
 542              if ( navigator.userAgent && document.body.className.indexOf( 'no-font-face' ) === -1 &&
 543                  /Android (1.0|1.1|1.5|1.6|2.0|2.1)|Nokia|Opera Mini|w(eb)?OSBrowser|webOS|UCWEB|Windows Phone OS 7|XBLWP7|ZuneWP7|MSIE 7/.test( navigator.userAgent ) ) {
 544  
 545                  document.body.className += ' no-font-face';
 546              }
 547          });
 548      })(document, window);
 549  
 550  }


Generated: Sat Nov 23 20:47:33 2019 Cross-referenced by PHPXref 0.7