home *** CD-ROM | disk | FTP | other *** search
/ HTML Examples / WP.iso / wordpress2 / wp-content / themes / twentysixteen / js / html5.js < prev    next >
Encoding:
JavaScript  |  2017-05-30  |  10.1 KB  |  326 lines

  1. /**
  2. * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
  3. */
  4. ;(function(window, document) {
  5. /*jshint evil:true */
  6.   /** version */
  7.   var version = '3.7.3';
  8.  
  9.   /** Preset options */
  10.   var options = window.html5 || {};
  11.  
  12.   /** Used to skip problem elements */
  13.   var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
  14.  
  15.   /** Not all elements can be cloned in IE **/
  16.   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;
  17.  
  18.   /** Detect whether the browser supports default html5 styles */
  19.   var supportsHtml5Styles;
  20.  
  21.   /** Name of the expando, to work with multiple documents or to re-shiv one document */
  22.   var expando = '_html5shiv';
  23.  
  24.   /** The id for the the documents expando */
  25.   var expanID = 0;
  26.  
  27.   /** Cached data for each document */
  28.   var expandoData = {};
  29.  
  30.   /** Detect whether the browser supports unknown elements */
  31.   var supportsUnknownElements;
  32.  
  33.   (function() {
  34.     try {
  35.         var a = document.createElement('a');
  36.         a.innerHTML = '<xyz></xyz>';
  37.         //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
  38.         supportsHtml5Styles = ('hidden' in a);
  39.  
  40.         supportsUnknownElements = a.childNodes.length == 1 || (function() {
  41.           // assign a false positive if unable to shiv
  42.           (document.createElement)('a');
  43.           var frag = document.createDocumentFragment();
  44.           return (
  45.             typeof frag.cloneNode == 'undefined' ||
  46.             typeof frag.createDocumentFragment == 'undefined' ||
  47.             typeof frag.createElement == 'undefined'
  48.           );
  49.         }());
  50.     } catch(e) {
  51.       // assign a false positive if detection fails => unable to shiv
  52.       supportsHtml5Styles = true;
  53.       supportsUnknownElements = true;
  54.     }
  55.  
  56.   }());
  57.  
  58.   /*--------------------------------------------------------------------------*/
  59.  
  60.   /**
  61.    * Creates a style sheet with the given CSS text and adds it to the document.
  62.    * @private
  63.    * @param {Document} ownerDocument The document.
  64.    * @param {String} cssText The CSS text.
  65.    * @returns {StyleSheet} The style element.
  66.    */
  67.   function addStyleSheet(ownerDocument, cssText) {
  68.     var p = ownerDocument.createElement('p'),
  69.         parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
  70.  
  71.     p.innerHTML = 'x<style>' + cssText + '</style>';
  72.     return parent.insertBefore(p.lastChild, parent.firstChild);
  73.   }
  74.  
  75.   /**
  76.    * Returns the value of `html5.elements` as an array.
  77.    * @private
  78.    * @returns {Array} An array of shived element node names.
  79.    */
  80.   function getElements() {
  81.     var elements = html5.elements;
  82.     return typeof elements == 'string' ? elements.split(' ') : elements;
  83.   }
  84.  
  85.   /**
  86.    * Extends the built-in list of html5 elements
  87.    * @memberOf html5
  88.    * @param {String|Array} newElements whitespace separated list or array of new element names to shiv
  89.    * @param {Document} ownerDocument The context document.
  90.    */
  91.   function addElements(newElements, ownerDocument) {
  92.     var elements = html5.elements;
  93.     if(typeof elements != 'string'){
  94.       elements = elements.join(' ');
  95.     }
  96.     if(typeof newElements != 'string'){
  97.       newElements = newElements.join(' ');
  98.     }
  99.     html5.elements = elements +' '+ newElements;
  100.     shivDocument(ownerDocument);
  101.   }
  102.  
  103.    /**
  104.    * Returns the data associated to the given document
  105.    * @private
  106.    * @param {Document} ownerDocument The document.
  107.    * @returns {Object} An object of data.
  108.    */
  109.   function getExpandoData(ownerDocument) {
  110.     var data = expandoData[ownerDocument[expando]];
  111.     if (!data) {
  112.         data = {};
  113.         expanID++;
  114.         ownerDocument[expando] = expanID;
  115.         expandoData[expanID] = data;
  116.     }
  117.     return data;
  118.   }
  119.  
  120.   /**
  121.    * returns a shived element for the given nodeName and document
  122.    * @memberOf html5
  123.    * @param {String} nodeName name of the element
  124.    * @param {Document|DocumentFragment} ownerDocument The context document.
  125.    * @returns {Object} The shived element.
  126.    */
  127.   function createElement(nodeName, ownerDocument, data){
  128.     if (!ownerDocument) {
  129.         ownerDocument = document;
  130.     }
  131.     if(supportsUnknownElements){
  132.         return ownerDocument.createElement(nodeName);
  133.     }
  134.     if (!data) {
  135.         data = getExpandoData(ownerDocument);
  136.     }
  137.     var node;
  138.  
  139.     if (data.cache[nodeName]) {
  140.         node = data.cache[nodeName].cloneNode();
  141.     } else if (saveClones.test(nodeName)) {
  142.         node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
  143.     } else {
  144.         node = data.createElem(nodeName);
  145.     }
  146.  
  147.     // Avoid adding some elements to fragments in IE < 9 because
  148.     // * Attributes like `name` or `type` cannot be set/changed once an element
  149.     //   is inserted into a document/fragment
  150.     // * Link elements with `src` attributes that are inaccessible, as with
  151.     //   a 403 response, will cause the tab/window to crash
  152.     // * Script elements appended to fragments will execute when their `src`
  153.     //   or `text` property is set
  154.     return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
  155.   }
  156.  
  157.   /**
  158.    * returns a shived DocumentFragment for the given document
  159.    * @memberOf html5
  160.    * @param {Document} ownerDocument The context document.
  161.    * @returns {Object} The shived DocumentFragment.
  162.    */
  163.   function createDocumentFragment(ownerDocument, data){
  164.     if (!ownerDocument) {
  165.         ownerDocument = document;
  166.     }
  167.     if(supportsUnknownElements){
  168.         return ownerDocument.createDocumentFragment();
  169.     }
  170.     data = data || getExpandoData(ownerDocument);
  171.     var clone = data.frag.cloneNode(),
  172.         i = 0,
  173.         elems = getElements(),
  174.         l = elems.length;
  175.     for(;i<l;i++){
  176.         clone.createElement(elems[i]);
  177.     }
  178.     return clone;
  179.   }
  180.  
  181.   /**
  182.    * Shivs the `createElement` and `createDocumentFragment` methods of the document.
  183.    * @private
  184.    * @param {Document|DocumentFragment} ownerDocument The document.
  185.    * @param {Object} data of the document.
  186.    */
  187.   function shivMethods(ownerDocument, data) {
  188.     if (!data.cache) {
  189.         data.cache = {};
  190.         data.createElem = ownerDocument.createElement;
  191.         data.createFrag = ownerDocument.createDocumentFragment;
  192.         data.frag = data.createFrag();
  193.     }
  194.  
  195.  
  196.     ownerDocument.createElement = function(nodeName) {
  197.       //abort shiv
  198.       if (!html5.shivMethods) {
  199.           return data.createElem(nodeName);
  200.       }
  201.       return createElement(nodeName, ownerDocument, data);
  202.     };
  203.  
  204.     ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
  205.       'var n=f.cloneNode(),c=n.createElement;' +
  206.       'h.shivMethods&&(' +
  207.         // unroll the `createElement` calls
  208.         getElements().join().replace(/[\w\-:]+/g, function(nodeName) {
  209.           data.createElem(nodeName);
  210.           data.frag.createElement(nodeName);
  211.           return 'c("' + nodeName + '")';
  212.         }) +
  213.       ');return n}'
  214.     )(html5, data.frag);
  215.   }
  216.  
  217.   /*--------------------------------------------------------------------------*/
  218.  
  219.   /**
  220.    * Shivs the given document.
  221.    * @memberOf html5
  222.    * @param {Document} ownerDocument The document to shiv.
  223.    * @returns {Document} The shived document.
  224.    */
  225.   function shivDocument(ownerDocument) {
  226.     if (!ownerDocument) {
  227.         ownerDocument = document;
  228.     }
  229.     var data = getExpandoData(ownerDocument);
  230.  
  231.     if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
  232.       data.hasCSS = !!addStyleSheet(ownerDocument,
  233.         // corrects block display not defined in IE6/7/8/9
  234.         'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +
  235.         // adds styling not present in IE6/7/8/9
  236.         'mark{background:#FF0;color:#000}' +
  237.         // hides non-rendered elements
  238.         'template{display:none}'
  239.       );
  240.     }
  241.     if (!supportsUnknownElements) {
  242.       shivMethods(ownerDocument, data);
  243.     }
  244.     return ownerDocument;
  245.   }
  246.  
  247.   /*--------------------------------------------------------------------------*/
  248.  
  249.   /**
  250.    * The `html5` object is exposed so that more elements can be shived and
  251.    * existing shiving can be detected on iframes.
  252.    * @type Object
  253.    * @example
  254.    *
  255.    * // options can be changed before the script is included
  256.    * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
  257.    */
  258.   var html5 = {
  259.  
  260.     /**
  261.      * An array or space separated string of node names of the elements to shiv.
  262.      * @memberOf html5
  263.      * @type Array|String
  264.      */
  265.     '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',
  266.  
  267.     /**
  268.      * current version of html5shiv
  269.      */
  270.     'version': version,
  271.  
  272.     /**
  273.      * A flag to indicate that the HTML5 style sheet should be inserted.
  274.      * @memberOf html5
  275.      * @type Boolean
  276.      */
  277.     'shivCSS': (options.shivCSS !== false),
  278.  
  279.     /**
  280.      * Is equal to true if a browser supports creating unknown/HTML5 elements
  281.      * @memberOf html5
  282.      * @type boolean
  283.      */
  284.     'supportsUnknownElements': supportsUnknownElements,
  285.  
  286.     /**
  287.      * A flag to indicate that the document's `createElement` and `createDocumentFragment`
  288.      * methods should be overwritten.
  289.      * @memberOf html5
  290.      * @type Boolean
  291.      */
  292.     'shivMethods': (options.shivMethods !== false),
  293.  
  294.     /**
  295.      * A string to describe the type of `html5` object ("default" or "default print").
  296.      * @memberOf html5
  297.      * @type String
  298.      */
  299.     'type': 'default',
  300.  
  301.     // shivs the document according to the specified `html5` object options
  302.     'shivDocument': shivDocument,
  303.  
  304.     //creates a shived element
  305.     createElement: createElement,
  306.  
  307.     //creates a shived documentFragment
  308.     createDocumentFragment: createDocumentFragment,
  309.  
  310.     //extends list of elements
  311.     addElements: addElements
  312.   };
  313.  
  314.   /*--------------------------------------------------------------------------*/
  315.  
  316.   // expose html5
  317.   window.html5 = html5;
  318.  
  319.   // shiv the document
  320.   shivDocument(document);
  321.  
  322.   if(typeof module == 'object' && module.exports){
  323.     module.exports = html5;
  324.   }
  325.  
  326. }(typeof window !== "undefined" ? window : this, document));