JAVASCRIPT   16

modernizr.js

Guest on 6th August 2021 06:40:00 PM

  1. /* Modernizr 2.7.1 (Custom Build) | MIT & BSD
  2.  * Build: http://modernizr.com/download/#-video-touch-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes
  3.  */
  4. ;
  5.  
  6.  
  7.  
  8. window.Modernizr = (function( window, document, undefined ) {
  9.  
  10.     var version = '2.7.1',
  11.  
  12.     Modernizr = {},
  13.  
  14.  
  15.     docElement = document.documentElement,
  16.  
  17.     mod = 'modernizr',
  18.     modElem = document.createElement(mod),
  19.     mStyle = modElem.style,
  20.  
  21.     inputElem  ,
  22.  
  23.  
  24.     toString = {}.toString,
  25.  
  26.     prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
  27.  
  28.  
  29.  
  30.     omPrefixes = 'Webkit Moz O ms',
  31.  
  32.     cssomPrefixes = omPrefixes.split(' '),
  33.  
  34.     domPrefixes = omPrefixes.toLowerCase().split(' '),
  35.  
  36.  
  37.     tests = {},
  38.     inputs = {},
  39.     attrs = {},
  40.  
  41.     classes = [],
  42.  
  43.     slice = classes.slice,
  44.  
  45.     featureName,
  46.  
  47.  
  48.     injectElementWithStyles = function( rule, callback, nodes, testnames ) {
  49.  
  50.       var style, ret, node, docOverflow,
  51.           div = document.createElement('div'),
  52.                 body = document.body,
  53.                 fakeBody = body || document.createElement('body');
  54.  
  55.       if ( parseInt(nodes, 10) ) {
  56.                       while ( nodes-- ) {
  57.               node = document.createElement('div');
  58.               node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
  59.               div.appendChild(node);
  60.           }
  61.       }
  62.  
  63.                 style = ['&#173;','<style id="s', mod, '">', rule, '</style>'].join('');
  64.       div.id = mod;
  65.           (body ? div : fakeBody).innerHTML += style;
  66.       fakeBody.appendChild(div);
  67.       if ( !body ) {
  68.                 fakeBody.style.background = '';
  69.                 fakeBody.style.overflow = 'hidden';
  70.           docOverflow = docElement.style.overflow;
  71.           docElement.style.overflow = 'hidden';
  72.           docElement.appendChild(fakeBody);
  73.       }
  74.  
  75.       ret = callback(div, rule);
  76.         if ( !body ) {
  77.           fakeBody.parentNode.removeChild(fakeBody);
  78.           docElement.style.overflow = docOverflow;
  79.       } else {
  80.           div.parentNode.removeChild(div);
  81.       }
  82.  
  83.       return !!ret;
  84.  
  85.     },
  86.  
  87.  
  88.  
  89.     isEventSupported = (function() {
  90.  
  91.       var TAGNAMES = {
  92.         'select': 'input', 'change': 'input',
  93.         'submit': 'form', 'reset': 'form',
  94.         'error': 'img', 'load': 'img', 'abort': 'img'
  95.       };
  96.  
  97.       function isEventSupported( eventName, element ) {
  98.  
  99.         element = element || document.createElement(TAGNAMES[eventName] || 'div');
  100.         eventName = 'on' + eventName;
  101.  
  102.             var isSupported = eventName in element;
  103.  
  104.         if ( !isSupported ) {
  105.                 if ( !element.setAttribute ) {
  106.             element = document.createElement('div');
  107.           }
  108.           if ( element.setAttribute && element.removeAttribute ) {
  109.             element.setAttribute(eventName, '');
  110.             isSupported = is(element[eventName], 'function');
  111.  
  112.                     if ( !is(element[eventName], 'undefined') ) {
  113.               element[eventName] = undefined;
  114.             }
  115.             element.removeAttribute(eventName);
  116.           }
  117.         }
  118.  
  119.         element = null;
  120.         return isSupported;
  121.       }
  122.       return isEventSupported;
  123.     })(),
  124.  
  125.  
  126.     _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
  127.  
  128.     if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {
  129.       hasOwnProp = function (object, property) {
  130.         return _hasOwnProperty.call(object, property);
  131.       };
  132.     }
  133.     else {
  134.       hasOwnProp = function (object, property) {
  135.         return ((property in object) && is(object.constructor.prototype[property], 'undefined'));
  136.       };
  137.     }
  138.  
  139.  
  140.     if (!Function.prototype.bind) {
  141.       Function.prototype.bind = function bind(that) {
  142.  
  143.         var target = this;
  144.  
  145.         if (typeof target != "function") {
  146.             throw new TypeError();
  147.         }
  148.  
  149.         var args = slice.call(arguments, 1),
  150.             bound = function () {
  151.  
  152.             if (this instanceof bound) {
  153.  
  154.               var F = function(){};
  155.               F.prototype = target.prototype;
  156.               var self = new F();
  157.  
  158.               var result = target.apply(
  159.                   self,
  160.                   args.concat(slice.call(arguments))
  161.               );
  162.               if (Object(result) === result) {
  163.                   return result;
  164.               }
  165.               return self;
  166.  
  167.             } else {
  168.  
  169.               return target.apply(
  170.                   that,
  171.                   args.concat(slice.call(arguments))
  172.               );
  173.  
  174.             }
  175.  
  176.         };
  177.  
  178.         return bound;
  179.       };
  180.     }
  181.  
  182.     function setCss( str ) {
  183.         mStyle.cssText = str;
  184.     }
  185.  
  186.     function setCssAll( str1, str2 ) {
  187.         return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
  188.     }
  189.  
  190.     function is( obj, type ) {
  191.         return typeof obj === type;
  192.     }
  193.  
  194.     function contains( str, substr ) {
  195.         return !!~('' + str).indexOf(substr);
  196.     }
  197.  
  198.     function testProps( props, prefixed ) {
  199.         for ( var i in props ) {
  200.             var prop = props[i];
  201.             if ( !contains(prop, "-") && mStyle[prop] !== undefined ) {
  202.                 return prefixed == 'pfx' ? prop : true;
  203.             }
  204.         }
  205.         return false;
  206.     }
  207.  
  208.     function testDOMProps( props, obj, elem ) {
  209.         for ( var i in props ) {
  210.             var item = obj[props[i]];
  211.             if ( item !== undefined) {
  212.  
  213.                             if (elem === false) return props[i];
  214.  
  215.                             if (is(item, 'function')){
  216.                                 return item.bind(elem || obj);
  217.                 }
  218.  
  219.                             return item;
  220.             }
  221.         }
  222.         return false;
  223.     }
  224.  
  225.     function testPropsAll( prop, prefixed, elem ) {
  226.  
  227.         var ucProp  = prop.charAt(0).toUpperCase() + prop.slice(1),
  228.             props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');
  229.  
  230.             if(is(prefixed, "string") || is(prefixed, "undefined")) {
  231.           return testProps(props, prefixed);
  232.  
  233.             } else {
  234.           props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');
  235.           return testDOMProps(props, prefixed, elem);
  236.         }
  237.     }    tests['touch'] = function() {
  238.         var bool;
  239.  
  240.         if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
  241.           bool = true;
  242.         } else {
  243.           injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {
  244.             bool = node.offsetTop === 9;
  245.           });
  246.         }
  247.  
  248.         return bool;
  249.     };
  250.     tests['video'] = function() {
  251.         var elem = document.createElement('video'),
  252.             bool = false;
  253.  
  254.             try {
  255.             if ( bool = !!elem.canPlayType ) {
  256.                 bool      = new Boolean(bool);
  257.                 bool.ogg  = elem.canPlayType('video/ogg; codecs="theora"')      .replace(/^no$/,'');
  258.  
  259.                             bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,'');
  260.  
  261.                 bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,'');
  262.             }
  263.  
  264.         } catch(e) { }
  265.  
  266.         return bool;
  267.     };
  268.     for ( var feature in tests ) {
  269.         if ( hasOwnProp(tests, feature) ) {
  270.                                     featureName  = feature.toLowerCase();
  271.             Modernizr[featureName] = tests[feature]();
  272.  
  273.             classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);
  274.         }
  275.     }
  276.  
  277.  
  278.  
  279.      Modernizr.addTest = function ( feature, test ) {
  280.        if ( typeof feature == 'object' ) {
  281.          for ( var key in feature ) {
  282.            if ( hasOwnProp( feature, key ) ) {
  283.              Modernizr.addTest( key, feature[ key ] );
  284.            }
  285.          }
  286.        } else {
  287.  
  288.          feature = feature.toLowerCase();
  289.  
  290.          if ( Modernizr[feature] !== undefined ) {
  291.                                               return Modernizr;
  292.          }
  293.  
  294.          test = typeof test == 'function' ? test() : test;
  295.  
  296.          if (typeof enableClasses !== "undefined" && enableClasses) {
  297.            docElement.className += ' ' + (test ? '' : 'no-') + feature;
  298.          }
  299.          Modernizr[feature] = test;
  300.  
  301.        }
  302.  
  303.        return Modernizr;
  304.      };
  305.  
  306.  
  307.     setCss('');
  308.     modElem = inputElem = null;
  309.  
  310.  
  311.     Modernizr._version      = version;
  312.  
  313.     Modernizr._prefixes     = prefixes;
  314.     Modernizr._domPrefixes  = domPrefixes;
  315.     Modernizr._cssomPrefixes  = cssomPrefixes;
  316.  
  317.  
  318.     Modernizr.hasEvent      = isEventSupported;
  319.  
  320.     Modernizr.testProp      = function(prop){
  321.         return testProps([prop]);
  322.     };
  323.  
  324.     Modernizr.testAllProps  = testPropsAll;
  325.  
  326.  
  327.     Modernizr.testStyles    = injectElementWithStyles;
  328.     Modernizr.prefixed      = function(prop, obj, elem){
  329.       if(!obj) {
  330.         return testPropsAll(prop, 'pfx');
  331.       } else {
  332.             return testPropsAll(prop, obj, elem);
  333.       }
  334.     };
  335.  
  336.  
  337.  
  338.     return Modernizr;
  339.  
  340. })(this, this.document);
  341. ;

Raw Paste


Login or Register to edit or fork this paste. It's free.