diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-01-07 13:06:14 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-01-07 13:06:14 +0100 |
| commit | 7086111ad4dd997e12a3220e1ee60c9b9bcf0bb8 (patch) | |
| tree | f7453d7dd5cbaaab246e23810b02d3edf1e451be /srcs/wordpress/wp-content/themes/twentysixteen/js | |
| parent | c59bdcf77c50cbe89b4a93782cdd6d9e7532080e (diff) | |
| download | ft_server-7086111ad4dd997e12a3220e1ee60c9b9bcf0bb8.tar.gz ft_server-7086111ad4dd997e12a3220e1ee60c9b9bcf0bb8.tar.bz2 ft_server-7086111ad4dd997e12a3220e1ee60c9b9bcf0bb8.zip | |
Added wordpress
Diffstat (limited to 'srcs/wordpress/wp-content/themes/twentysixteen/js')
6 files changed, 738 insertions, 0 deletions
diff --git a/srcs/wordpress/wp-content/themes/twentysixteen/js/color-scheme-control.js b/srcs/wordpress/wp-content/themes/twentysixteen/js/color-scheme-control.js new file mode 100644 index 0000000..e65b5bd --- /dev/null +++ b/srcs/wordpress/wp-content/themes/twentysixteen/js/color-scheme-control.js @@ -0,0 +1,96 @@ +/* global colorScheme, Color */ +/** + * Add a listener to the Color Scheme control to update other color controls to new values/defaults. + * Also trigger an update of the Color Scheme CSS when a color is changed. + */ + +( function( api ) { + var cssTemplate = wp.template( 'twentysixteen-color-scheme' ), + colorSchemeKeys = [ + 'background_color', + 'page_background_color', + 'link_color', + 'main_text_color', + 'secondary_text_color' + ], + colorSettings = [ + 'background_color', + 'page_background_color', + 'link_color', + 'main_text_color', + 'secondary_text_color' + ]; + + api.controlConstructor.select = api.Control.extend( { + ready: function() { + if ( 'color_scheme' === this.id ) { + this.setting.bind( 'change', function( value ) { + var colors = colorScheme[value].colors; + + // Update Background Color. + var color = colors[0]; + api( 'background_color' ).set( color ); + api.control( 'background_color' ).container.find( '.color-picker-hex' ) + .data( 'data-default-color', color ) + .wpColorPicker( 'defaultColor', color ); + + // Update Page Background Color. + color = colors[1]; + api( 'page_background_color' ).set( color ); + api.control( 'page_background_color' ).container.find( '.color-picker-hex' ) + .data( 'data-default-color', color ) + .wpColorPicker( 'defaultColor', color ); + + // Update Link Color. + color = colors[2]; + api( 'link_color' ).set( color ); + api.control( 'link_color' ).container.find( '.color-picker-hex' ) + .data( 'data-default-color', color ) + .wpColorPicker( 'defaultColor', color ); + + // Update Main Text Color. + color = colors[3]; + api( 'main_text_color' ).set( color ); + api.control( 'main_text_color' ).container.find( '.color-picker-hex' ) + .data( 'data-default-color', color ) + .wpColorPicker( 'defaultColor', color ); + + // Update Secondary Text Color. + color = colors[4]; + api( 'secondary_text_color' ).set( color ); + api.control( 'secondary_text_color' ).container.find( '.color-picker-hex' ) + .data( 'data-default-color', color ) + .wpColorPicker( 'defaultColor', color ); + } ); + } + } + } ); + + // Generate the CSS for the current Color Scheme. + function updateCSS() { + var scheme = api( 'color_scheme' )(), + css, + colors = _.object( colorSchemeKeys, colorScheme[ scheme ].colors ); + + // Merge in color scheme overrides. + _.each( colorSettings, function( setting ) { + colors[ setting ] = api( setting )(); + } ); + + // Add additional color. + // jscs:disable + colors.border_color = Color( colors.main_text_color ).toCSS( 'rgba', 0.2 ); + // jscs:enable + + css = cssTemplate( colors ); + + api.previewer.send( 'update-color-scheme-css', css ); + } + + // Update the CSS whenever a color setting is changed. + _.each( colorSettings, function( setting ) { + api( setting, function( setting ) { + setting.bind( updateCSS ); + } ); + } ); +} )( wp.customize ); diff --git a/srcs/wordpress/wp-content/themes/twentysixteen/js/customize-preview.js b/srcs/wordpress/wp-content/themes/twentysixteen/js/customize-preview.js new file mode 100644 index 0000000..fc99333 --- /dev/null +++ b/srcs/wordpress/wp-content/themes/twentysixteen/js/customize-preview.js @@ -0,0 +1,41 @@ +/** + * Live-update changed settings in real time in the Customizer preview. + */ + +( function( $ ) { + var style = $( '#twentysixteen-color-scheme-css' ), + api = wp.customize; + + if ( ! style.length ) { + style = $( 'head' ).append( '<style type="text/css" id="twentysixteen-color-scheme-css" />' ) + .find( '#twentysixteen-color-scheme-css' ); + } + + // Site title. + api( 'blogname', function( value ) { + value.bind( function( to ) { + $( '.site-title a' ).text( to ); + } ); + } ); + + // Site tagline. + api( 'blogdescription', function( value ) { + value.bind( function( to ) { + $( '.site-description' ).text( to ); + } ); + } ); + + // Add custom-background-image body class when background image is added. + api( 'background_image', function( value ) { + value.bind( function( to ) { + $( 'body' ).toggleClass( 'custom-background-image', '' !== to ); + } ); + } ); + + // Color Scheme CSS. + api.bind( 'preview-ready', function() { + api.preview.bind( 'update-color-scheme-css', function( css ) { + style.html( css ); + } ); + } ); +} )( jQuery ); diff --git a/srcs/wordpress/wp-content/themes/twentysixteen/js/functions.js b/srcs/wordpress/wp-content/themes/twentysixteen/js/functions.js new file mode 100644 index 0000000..a15af11 --- /dev/null +++ b/srcs/wordpress/wp-content/themes/twentysixteen/js/functions.js @@ -0,0 +1,213 @@ +/* global screenReaderText */ +/** + * Theme functions file. + * + * Contains handlers for navigation and widget area. + */ + +( function( $ ) { + var body, masthead, menuToggle, siteNavigation, socialNavigation, siteHeaderMenu, resizeTimer; + + function initMainNavigation( container ) { + + // Add dropdown toggle that displays child menu items. + var dropdownToggle = $( '<button />', { + 'class': 'dropdown-toggle', + 'aria-expanded': false + } ).append( $( '<span />', { + 'class': 'screen-reader-text', + text: screenReaderText.expand + } ) ); + + container.find( '.menu-item-has-children > a' ).after( dropdownToggle ); + + // Toggle buttons and submenu items with active children menu items. + container.find( '.current-menu-ancestor > button' ).addClass( 'toggled-on' ); + container.find( '.current-menu-ancestor > .sub-menu' ).addClass( 'toggled-on' ); + + // Add menu items with submenus to aria-haspopup="true". + container.find( '.menu-item-has-children' ).attr( 'aria-haspopup', 'true' ); + + container.find( '.dropdown-toggle' ).click( function( e ) { + var _this = $( this ), + screenReaderSpan = _this.find( '.screen-reader-text' ); + + e.preventDefault(); + _this.toggleClass( 'toggled-on' ); + _this.next( '.children, .sub-menu' ).toggleClass( 'toggled-on' ); + + // jscs:disable + _this.attr( 'aria-expanded', _this.attr( 'aria-expanded' ) === 'false' ? 'true' : 'false' ); + // jscs:enable + screenReaderSpan.text( screenReaderSpan.text() === screenReaderText.expand ? screenReaderText.collapse : screenReaderText.expand ); + } ); + } + initMainNavigation( $( '.main-navigation' ) ); + + masthead = $( '#masthead' ); + menuToggle = masthead.find( '#menu-toggle' ); + siteHeaderMenu = masthead.find( '#site-header-menu' ); + siteNavigation = masthead.find( '#site-navigation' ); + socialNavigation = masthead.find( '#social-navigation' ); + + // Enable menuToggle. + ( function() { + + // Return early if menuToggle is missing. + if ( ! menuToggle.length ) { + return; + } + + // Add an initial values for the attribute. + menuToggle.add( siteNavigation ).add( socialNavigation ).attr( 'aria-expanded', 'false' ); + + menuToggle.on( 'click.twentysixteen', function() { + $( this ).add( siteHeaderMenu ).toggleClass( 'toggled-on' ); + + // jscs:disable + $( this ).add( siteNavigation ).add( socialNavigation ).attr( 'aria-expanded', $( this ).add( siteNavigation ).add( socialNavigation ).attr( 'aria-expanded' ) === 'false' ? 'true' : 'false' ); + // jscs:enable + } ); + } )(); + + // Fix sub-menus for touch devices and better focus for hidden submenu items for accessibility. + ( function() { + if ( ! siteNavigation.length || ! siteNavigation.children().length ) { + return; + } + + // Toggle `focus` class to allow submenu access on tablets. + function toggleFocusClassTouchScreen() { + if ( window.innerWidth >= 910 ) { + $( document.body ).on( 'touchstart.twentysixteen', function( e ) { + if ( ! $( e.target ).closest( '.main-navigation li' ).length ) { + $( '.main-navigation li' ).removeClass( 'focus' ); + } + } ); + siteNavigation.find( '.menu-item-has-children > a' ).on( 'touchstart.twentysixteen', function( e ) { + var el = $( this ).parent( 'li' ); + + if ( ! el.hasClass( 'focus' ) ) { + e.preventDefault(); + el.toggleClass( 'focus' ); + el.siblings( '.focus' ).removeClass( 'focus' ); + } + } ); + } else { + siteNavigation.find( '.menu-item-has-children > a' ).unbind( 'touchstart.twentysixteen' ); + } + } + + if ( 'ontouchstart' in window ) { + $( window ).on( 'resize.twentysixteen', toggleFocusClassTouchScreen ); + toggleFocusClassTouchScreen(); + } + + siteNavigation.find( 'a' ).on( 'focus.twentysixteen blur.twentysixteen', function() { + $( this ).parents( '.menu-item' ).toggleClass( 'focus' ); + } ); + } )(); + + // Add the default ARIA attributes for the menu toggle and the navigations. + function onResizeARIA() { + if ( window.innerWidth < 910 ) { + if ( menuToggle.hasClass( 'toggled-on' ) ) { + menuToggle.attr( 'aria-expanded', 'true' ); + } else { + menuToggle.attr( 'aria-expanded', 'false' ); + } + + if ( siteHeaderMenu.hasClass( 'toggled-on' ) ) { + siteNavigation.attr( 'aria-expanded', 'true' ); + socialNavigation.attr( 'aria-expanded', 'true' ); + } else { + siteNavigation.attr( 'aria-expanded', 'false' ); + socialNavigation.attr( 'aria-expanded', 'false' ); + } + + menuToggle.attr( 'aria-controls', 'site-navigation social-navigation' ); + } else { + menuToggle.removeAttr( 'aria-expanded' ); + siteNavigation.removeAttr( 'aria-expanded' ); + socialNavigation.removeAttr( 'aria-expanded' ); + menuToggle.removeAttr( 'aria-controls' ); + } + } + + // Add 'below-entry-meta' class to elements. + function belowEntryMetaClass( param ) { + if ( body.hasClass( 'page' ) || body.hasClass( 'search' ) || body.hasClass( 'single-attachment' ) || body.hasClass( 'error404' ) ) { + return; + } + + $( '.entry-content' ).find( param ).each( function() { + var element = $( this ), + elementPos = element.offset(), + elementPosTop = elementPos.top, + entryFooter = element.closest( 'article' ).find( '.entry-footer' ), + entryFooterPos = entryFooter.offset(), + entryFooterPosBottom = entryFooterPos.top + ( entryFooter.height() + 28 ), + caption = element.closest( 'figure' ), + figcaption = element.next( 'figcaption' ), + newImg; + + // Add 'below-entry-meta' to elements below the entry meta. + if ( elementPosTop > entryFooterPosBottom ) { + + // Check if full-size images and captions are larger than or equal to 840px. + if ( 'img.size-full' === param || '.wp-block-image img' === param ) { + + // Create an image to find native image width of resized images (i.e. max-width: 100%). + newImg = new Image(); + newImg.src = element.attr( 'src' ); + + $( newImg ).on( 'load.twentysixteen', function() { + if ( newImg.width >= 840 ) { + + // Check if an image in an image block has a width attribute; if its value is less than 840, return. + if ( '.wp-block-image img' === param && element.is( '[width]' ) && element.attr( 'width' ) < 840 ) { + return; + } + + element.addClass( 'below-entry-meta' ); + + if ( caption.hasClass( 'wp-caption' ) ) { + caption.addClass( 'below-entry-meta' ); + caption.removeAttr( 'style' ); + } + + if ( figcaption ) { + figcaption.addClass( 'below-entry-meta' ); + } + } + } ); + } else { + element.addClass( 'below-entry-meta' ); + } + } else { + element.removeClass( 'below-entry-meta' ); + caption.removeClass( 'below-entry-meta' ); + } + } ); + } + + $( document ).ready( function() { + body = $( document.body ); + + $( window ) + .on( 'load.twentysixteen', onResizeARIA ) + .on( 'resize.twentysixteen', function() { + clearTimeout( resizeTimer ); + resizeTimer = setTimeout( function() { + belowEntryMetaClass( 'img.size-full' ); + belowEntryMetaClass( 'blockquote.alignleft, blockquote.alignright' ); + belowEntryMetaClass( '.wp-block-image img' ); + }, 300 ); + onResizeARIA(); + } ); + + belowEntryMetaClass( 'img.size-full' ); + belowEntryMetaClass( 'blockquote.alignleft, blockquote.alignright' ); + belowEntryMetaClass( '.wp-block-image img' ); + } ); +} )( jQuery ); diff --git a/srcs/wordpress/wp-content/themes/twentysixteen/js/html5.js b/srcs/wordpress/wp-content/themes/twentysixteen/js/html5.js new file mode 100644 index 0000000..9c1f049 --- /dev/null +++ b/srcs/wordpress/wp-content/themes/twentysixteen/js/html5.js @@ -0,0 +1,326 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +;(function(window, document) { +/*jshint evil:true */ + /** version */ + var version = '3.7.3'; + + /** Preset options */ + var options = window.html5 || {}; + + /** Used to skip problem elements */ + var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; + + /** Not all elements can be cloned in IE **/ + var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i; + + /** Detect whether the browser supports default html5 styles */ + var supportsHtml5Styles; + + /** Name of the expando, to work with multiple documents or to re-shiv one document */ + var expando = '_html5shiv'; + + /** The id for the the documents expando */ + var expanID = 0; + + /** Cached data for each document */ + var expandoData = {}; + + /** Detect whether the browser supports unknown elements */ + var supportsUnknownElements; + + (function() { + try { + var a = document.createElement('a'); + a.innerHTML = '<xyz></xyz>'; + //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles + supportsHtml5Styles = ('hidden' in a); + + supportsUnknownElements = a.childNodes.length == 1 || (function() { + // assign a false positive if unable to shiv + (document.createElement)('a'); + var frag = document.createDocumentFragment(); + return ( + typeof frag.cloneNode == 'undefined' || + typeof frag.createDocumentFragment == 'undefined' || + typeof frag.createElement == 'undefined' + ); + }()); + } catch(e) { + // assign a false positive if detection fails => unable to shiv + supportsHtml5Styles = true; + supportsUnknownElements = true; + } + + }()); + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a style sheet with the given CSS text and adds it to the document. + * @private + * @param {Document} ownerDocument The document. + * @param {String} cssText The CSS text. + * @returns {StyleSheet} The style element. + */ + function addStyleSheet(ownerDocument, cssText) { + var p = ownerDocument.createElement('p'), + parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; + + p.innerHTML = 'x<style>' + cssText + '</style>'; + return parent.insertBefore(p.lastChild, parent.firstChild); + } + + /** + * Returns the value of `html5.elements` as an array. + * @private + * @returns {Array} An array of shived element node names. + */ + function getElements() { + var elements = html5.elements; + return typeof elements == 'string' ? elements.split(' ') : elements; + } + + /** + * Extends the built-in list of html5 elements + * @memberOf html5 + * @param {String|Array} newElements whitespace separated list or array of new element names to shiv + * @param {Document} ownerDocument The context document. + */ + function addElements(newElements, ownerDocument) { + var elements = html5.elements; + if(typeof elements != 'string'){ + elements = elements.join(' '); + } + if(typeof newElements != 'string'){ + newElements = newElements.join(' '); + } + html5.elements = elements +' '+ newElements; + shivDocument(ownerDocument); + } + + /** + * Returns the data associated to the given document + * @private + * @param {Document} ownerDocument The document. + * @returns {Object} An object of data. + */ + function getExpandoData(ownerDocument) { + var data = expandoData[ownerDocument[expando]]; + if (!data) { + data = {}; + expanID++; + ownerDocument[expando] = expanID; + expandoData[expanID] = data; + } + return data; + } + + /** + * returns a shived element for the given nodeName and document + * @memberOf html5 + * @param {String} nodeName name of the element + * @param {Document|DocumentFragment} ownerDocument The context document. + * @returns {Object} The shived element. + */ + function createElement(nodeName, ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createElement(nodeName); + } + if (!data) { + data = getExpandoData(ownerDocument); + } + var node; + + if (data.cache[nodeName]) { + node = data.cache[nodeName].cloneNode(); + } else if (saveClones.test(nodeName)) { + node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); + } else { + node = data.createElem(nodeName); + } + + // Avoid adding some elements to fragments in IE < 9 because + // * Attributes like `name` or `type` cannot be set/changed once an element + // is inserted into a document/fragment + // * Link elements with `src` attributes that are inaccessible, as with + // a 403 response, will cause the tab/window to crash + // * Script elements appended to fragments will execute when their `src` + // or `text` property is set + return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node; + } + + /** + * returns a shived DocumentFragment for the given document + * @memberOf html5 + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived DocumentFragment. + */ + function createDocumentFragment(ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createDocumentFragment(); + } + data = data || getExpandoData(ownerDocument); + var clone = data.frag.cloneNode(), + i = 0, + elems = getElements(), + l = elems.length; + for(;i<l;i++){ + clone.createElement(elems[i]); + } + return clone; + } + + /** + * Shivs the `createElement` and `createDocumentFragment` methods of the document. + * @private + * @param {Document|DocumentFragment} ownerDocument The document. + * @param {Object} data of the document. + */ + function shivMethods(ownerDocument, data) { + if (!data.cache) { + data.cache = {}; + data.createElem = ownerDocument.createElement; + data.createFrag = ownerDocument.createDocumentFragment; + data.frag = data.createFrag(); + } + + + ownerDocument.createElement = function(nodeName) { + //abort shiv + if (!html5.shivMethods) { + return data.createElem(nodeName); + } + return createElement(nodeName, ownerDocument, data); + }; + + ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' + + 'var n=f.cloneNode(),c=n.createElement;' + + 'h.shivMethods&&(' + + // unroll the `createElement` calls + getElements().join().replace(/[\w\-:]+/g, function(nodeName) { + data.createElem(nodeName); + data.frag.createElement(nodeName); + return 'c("' + nodeName + '")'; + }) + + ');return n}' + )(html5, data.frag); + } + + /*--------------------------------------------------------------------------*/ + + /** + * Shivs the given document. + * @memberOf html5 + * @param {Document} ownerDocument The document to shiv. + * @returns {Document} The shived document. + */ + function shivDocument(ownerDocument) { + if (!ownerDocument) { + ownerDocument = document; + } + var data = getExpandoData(ownerDocument); + + if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) { + data.hasCSS = !!addStyleSheet(ownerDocument, + // corrects block display not defined in IE6/7/8/9 + 'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' + + // adds styling not present in IE6/7/8/9 + 'mark{background:#FF0;color:#000}' + + // hides non-rendered elements + 'template{display:none}' + ); + } + if (!supportsUnknownElements) { + shivMethods(ownerDocument, data); + } + return ownerDocument; + } + + /*--------------------------------------------------------------------------*/ + + /** + * The `html5` object is exposed so that more elements can be shived and + * existing shiving can be detected on iframes. + * @type Object + * @example + * + * // options can be changed before the script is included + * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false }; + */ + var html5 = { + + /** + * An array or space separated string of node names of the elements to shiv. + * @memberOf html5 + * @type Array|String + */ + 'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video', + + /** + * current version of html5shiv + */ + 'version': version, + + /** + * A flag to indicate that the HTML5 style sheet should be inserted. + * @memberOf html5 + * @type Boolean + */ + 'shivCSS': (options.shivCSS !== false), + + /** + * Is equal to true if a browser supports creating unknown/HTML5 elements + * @memberOf html5 + * @type boolean + */ + 'supportsUnknownElements': supportsUnknownElements, + + /** + * A flag to indicate that the document's `createElement` and `createDocumentFragment` + * methods should be overwritten. + * @memberOf html5 + * @type Boolean + */ + 'shivMethods': (options.shivMethods !== false), + + /** + * A string to describe the type of `html5` object ("default" or "default print"). + * @memberOf html5 + * @type String + */ + 'type': 'default', + + // shivs the document according to the specified `html5` object options + 'shivDocument': shivDocument, + + //creates a shived element + createElement: createElement, + + //creates a shived documentFragment + createDocumentFragment: createDocumentFragment, + + //extends list of elements + addElements: addElements + }; + + /*--------------------------------------------------------------------------*/ + + // expose html5 + window.html5 = html5; + + // shiv the document + shivDocument(document); + + if(typeof module == 'object' && module.exports){ + module.exports = html5; + } + +}(typeof window !== "undefined" ? window : this, document));
\ No newline at end of file diff --git a/srcs/wordpress/wp-content/themes/twentysixteen/js/keyboard-image-navigation.js b/srcs/wordpress/wp-content/themes/twentysixteen/js/keyboard-image-navigation.js new file mode 100644 index 0000000..b10927c --- /dev/null +++ b/srcs/wordpress/wp-content/themes/twentysixteen/js/keyboard-image-navigation.js @@ -0,0 +1,26 @@ +/** + * Twenty Sixteen keyboard support for image navigation. + */ + +( function( $ ) { + $( document ).on( 'keydown.twentysixteen', function( e ) { + var url = false; + + // Left arrow key code. + if ( 37 === e.which ) { + url = $( '.nav-previous a' ).attr( 'href' ); + + // Right arrow key code. + } else if ( 39 === e.which ) { + url = $( '.nav-next a' ).attr( 'href' ); + + // Other key code. + } else { + return; + } + + if ( url && ! $( 'textarea, input' ).is( ':focus' ) ) { + window.location = url; + } + } ); +} )( jQuery ); diff --git a/srcs/wordpress/wp-content/themes/twentysixteen/js/skip-link-focus-fix.js b/srcs/wordpress/wp-content/themes/twentysixteen/js/skip-link-focus-fix.js new file mode 100644 index 0000000..ae8a5da --- /dev/null +++ b/srcs/wordpress/wp-content/themes/twentysixteen/js/skip-link-focus-fix.js @@ -0,0 +1,36 @@ +/** + * Makes "skip to content" link work correctly in IE9, Chrome, and Opera + * for better accessibility. + * + * @link http://www.nczonline.net/blog/2013/01/15/fixing-skip-to-content-links/ + */ + + ( function() { + var isWebkit = navigator.userAgent.toLowerCase().indexOf( 'webkit' ) > -1, + isOpera = navigator.userAgent.toLowerCase().indexOf( 'opera' ) > -1, + isIE = navigator.userAgent.toLowerCase().indexOf( 'msie' ) > -1; + + if ( ( isWebkit || isOpera || isIE ) && document.getElementById && window.addEventListener ) { + window.addEventListener( 'hashchange', function() { + var id = location.hash.substring( 1 ), + element; + + if ( ! ( /^[A-z0-9_-]+$/.test( id ) ) ) { + return; + } + + element = document.getElementById( id ); + + if ( element ) { + if ( ! ( /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) ) { + element.tabIndex = -1; + } + + element.focus(); + + // Repositions the window on jump-to-anchor to account for admin bar and border height. + window.scrollBy( 0, -53 ); + } + }, false ); + } +} )(); |
