/** * @author alexander.farkas * @version 1.1.9 */ (function($){ $.testMedia = function(str){ var date = new Date().getTime(), styleS, div = $('
').css({ visibility: 'hidden', position: 'absolute' }).appendTo('body'), style = document.createElement('style'); style.setAttribute('type', 'text/css'); style.setAttribute('media', str); style = $(style).prependTo('head'); styleS = document.styleSheets[0]; if (styleS.cssRules || styleS.rules) { if (styleS.insertRule) { styleS.insertRule('.testMediaQuery' + date + ' {display:none !important;}', styleS.cssRules.length); } else if (styleS.addRule) { styleS.addRule('.testMediaQuery' + date, 'display:none'); } } var ret = div.css('display') === 'none'; div.remove(); style.remove(); return ret; }; $.arrayInString = function(str, arr){ var ret = -1; $.each(arr, function(i, item){ if (str.indexOf(item) != -1) { ret = i; return false; } }); return ret; }; $.enableMediaQuery = (function(){ var styles = [], styleLinks, date = new Date().getTime(); function parseMedia(link){ var medias = link.getAttribute('media'), pMin = /\(\s*min-width\s*:\s*(\d+)px\s*\)/, pMax = /\(\s*max-width\s*:\s*(\d+)px\s*\)/, resMin, resMax, supportedMedia = ['handheld', 'all', 'screen', 'projection', 'tty', 'tv', 'print'], curMedia, mediaString = []; medias = (!medias) ? ['all'] : medias.split(','); for (var i = 0, len = medias.length; i < len; i++) { curMedia = $.arrayInString(medias[i], supportedMedia); if (curMedia != -1) { curMedia = supportedMedia[curMedia]; if (!resMin) { resMin = pMin.exec(medias[i]); if (resMin) { resMin = parseInt(resMin[1], 10); } } if (!resMax) { resMax = pMax.exec(medias[i]); if (resMax) { resMax = parseInt(resMax[1], 10); } } mediaString.push(curMedia); } } if (resMin || resMax) { styles.push({ obj: link, min: resMin, max: resMax, medium: mediaString.join(','), used: false }); } } return { init: function(){ if (!styleLinks) { var resizeTimer; styleLinks = $('link[rel*=style]').each(function(){ parseMedia(this); }); $.enableMediaQuery.adjust(); $(window).bind('resize.mediaQueries', function(){ clearTimeout(resizeTimer); resizeTimer = setTimeout( $.enableMediaQuery.adjust , 29); }); } }, adjust: function(){ var width = $(window).width(), addStyles = [], changeQuery, shouldUse, i, len ; for (i = 0, len = styles.length; i < len; i++) { shouldUse = !styles[i].obj.disabled && ((!(styles[i].min && styles[i].min > width) && !(styles[i].max && styles[i].max < width)) || (!styles[i].max && !styles[i].min)); if ( shouldUse ) { var n = styles[i].obj.cloneNode(true); n.setAttribute('media', styles[i].medium); n.className = 'insertStyleforMedia' + date; addStyles.push(n); if( !styles[i].used ){ styles[i].used = true; changeQuery = true; } } else if( styles[i].used !== shouldUse ){ styles[i].used = false; changeQuery = true; } } if(changeQuery){ $('link.insertStyleforMedia' + date).remove(); var head = document.getElementsByTagName('head'); for(i = 0, len = addStyles.length; i < len; i++){ head[0].appendChild(addStyles[i]); } } } }; })(); //make some odd assumption before dom-ready $.support.mediaQueries = !( $.browser.msie && parseFloat($.browser.version, 10) < 9) || ($.browser.mozilla && parseFloat($.browser.version, 10) < 1.9 ); setTimeout(function(){ if (!$.isReady && document.body && !$.support.mediaQueries) { try { $.enableMediaQuery.init(); } catch (e) {} } }, 1); $(function(){ //test media query compatibility $.support.mediaQueries = $.testMedia('only all'); if (!$.support.mediaQueries) { $.enableMediaQuery.init(); } }); })(jQuery);