(function (window, undefined) { "use strict"; var links = []; // 所有css 地址 var importlinks = []; var precss = []; // 原始css var csslinks = []; // 所有css 地址 var allcsslist = []; // 所有样式列表{minwidth, maxwidth, csslist} var cssstyle = null; // css样式对象 var csstextnode = null; // css 字符串对象 var max_width = 1920; // 最大比例尺寸 var mediacss = []; // media样式列表{minwidth, maxwidth, csslist} var loadlinks = function () { var styles = document.getelementsbytagname('link'); var filteredlinks = []; for (var i = 0; i < styles.length; i++) { if (styles[i].rel.tolowercase() === 'stylesheet' && styles[i].getattribute('use-ie') !== null) { filteredlinks.push(styles[i].href); } } return filteredlinks; } var processlinks = function () { links = loadlinks(); // console.log(links); for (var i = 0; i < links.length; i++) { xhr(links[i], storecss); } }; var xhr = function (url, callback) { try { var xhr = window.activexobject ? (new activexobject('microsoft.xmlhttp') || new activexobject('msxml2.xmlhttp')) : new xmlhttprequest(); xhr.open('get', url, true); xhr.onreadystatechange = function () { if (xhr.readystate === 4) { callback(xhr, url); } }; xhr.send(null); } catch (e) { if (window.xdomainrequest) { var xdr = new xdomainrequest(); xdr.open('get', url); xdr.onload = function () { callback(xdr, url); }; xdr.onerror = function () { return false; }; xdr.send(); } } } var storecss = function (response, link) { //console.log(response, link); precss.push(response.responsetext); csslinks.push(link); var css = response.responsetext; css = parseimport(css); css = parsemedia(css); var csslist = parsecss(css); // console.log(csslist); allcsslist.push({ minwidth: 0, maxwidth: 0, csslist: csslist, }); if (csslinks.length === links.length) { if (importlinks.length == 0) { buildallcss(); $(window).resize(function () { buildallcss(); //console.log("resize"); }); } else { var list = importlinks; importlinks = []; for (var j = 0; j < list.length; j++) { links.push(list[j]) } for (var j = 0; j < list.length; j++) { xhr(list[j], storecss); } } } } // 去掉左右空格 var trim = function (x) { if (x) return x.replace(/^\s+|\s+$/gm, ''); else return ""; } // 解析css var parsecss = function (css) { var csslist = []; css = css.replace(/\n/g, "").replace(/\r/g, ""); var pattern = /(.*?){(.*?)}/gi; var current = css.match(pattern); if (current != null) { for (var j = 0; j < current.length; j++) { var rule = current[j].replace(/\n/g, "").replace(/\r/g, ""); // 去除回车换行 var index = rule.indexof("{"); var key = trim(rule.substr(0, index)); var content = rule.substr(index + 1).replace("}", ""); var items = content.split(";"); var attrlist = []; for (var i = 0; i < items.length; i++) { if (trim(items[i]) != "") { var sk = items[i].split(":"); var sk0 = trim(sk[0]).tolowercase(); var sk1 = trim(sk[1]).tolowercase(); //console.log(sk1s); var ls = []; if (sk0 == "background") { // 背景 var lsvalue = { "ovalue": sk1, "ispx": false, "unit": "", "value": sk1, "isbg": true, "url": "" }; var urls = sk1.match(/url\((.*?)\)/gi); if (urls != null && urls.length > 0) { var url = urls[0].substring(4, urls[0].length - 1); lsvalue["url"] = url; } ls.push(lsvalue); } else if (sk1.indexof("px") >= 0) { var sk1s = sk1.split(" "); for (var z = 0; z < sk1s.length; z++) { if (trim(sk1s[z]) != "") { var lsvalue = { "ovalue": sk1s[z], "ispx": false, "unit": "", "value": sk1s[z], "isbg": false, "url": "" }; if (sk1s[z].indexof("px") >= 0) { lsvalue['unit'] = 'px'; var val = parsefloat(sk1s[z].replace("px", "")); lsvalue['value'] = val; lsvalue["ispx"] = true; } ls.push(lsvalue); } } } else if (sk1.indexof("rem") >= 0) { var sk1s = sk1.split(" "); for (var z = 0; z < sk1s.length; z++) { if (trim(sk1s[z]) != "") { var lsvalue = { "ovalue": sk1s[z], "ispx": false, "unit": "", "value": sk1s[z], "isbg": false, "url": "" }; if (sk1s[z].indexof("rem") >= 0) { lsvalue['unit'] = 'px'; var val = parsefloat(sk1s[z].replace("rem", "")); lsvalue['value'] = val * 100; lsvalue["ispx"] = true; } ls.push(lsvalue); } } } else { var lsvalue = { "ovalue": sk1, "ispx": false, "unit": "", "value": sk1, "isbg": false, "url": "" }; ls.push(lsvalue); } attrlist.push({ key: sk0, values: ls }); } } csslist.push({ classname: key, attrlist: attrlist, }) } } return csslist; } // 解析 import var parseimport = function (csstext) { var pattern = /@import\s*url\(.*?\)\s*;/gi; var current = csstext.match(pattern); if (current != null) { for (var i = 0; i < current.length; i++) { var first = current[i].indexof("("); var end = current[i].indexof(")"); var url = current[i].substring(first + 2, end - 1); importlinks.push("css/" + url); csstext = csstext.replace(current[i], ""); } } return csstext; } // 解析媒体 var parsemedia = function (csstext) { var pattern = /@media[\s\s]*?\}\s*\}/gi; var current = csstext.match(pattern); if (current != null) { for (var i = 0; i < current.length; i++) { csstext = csstext.replace(current[i], ""); var mediacsstext = current[i].replace(/\n/g, "").replace(/\r/g, ""); // 去除回车换行 mediacsstext = trim(mediacsstext); var minvalue = 0; var maxvalue = 0; var pt = /min-width[\s\s]*?\d*px/gi var min = mediacsstext.match(pt); if (min != null && min.length > 0) { var minsplit = min[0].split(":"); var value = trim(minsplit[1]); value = value.replace("px", ""); minvalue = parseint(value); } var ptmax = /max-width[\s\s]*?\d*px/gi var max = mediacsstext.match(ptmax); if (max != null && max.length > 0) { var maxsplit = max[0].split(":"); var value = trim(maxsplit[1]); value = value.replace("px", ""); maxvalue = parseint(value); } var start = mediacsstext.indexof("{"); mediacsstext = mediacsstext.substring(start + 1, mediacsstext.length - 1); var csslist = parsecss(mediacsstext); mediacss.push({ minwidth: minvalue, maxwidth: maxvalue, precss: mediacsstext, csslist: csslist, }); } } return csstext; } // 构造所有css var buildallcss = function () { var width = $(window).width(); var cssstr = ""; for (var i = 0; i < allcsslist.length; i++) { cssstr += buildcss(width, allcsslist[i].csslist); } for (var j = 0; j < mediacss.length; mediacss++) { for (var i = 0; i < mediacss[j].length; i++) { if (mediacss[j][i].minwidth > 0 && mediacss[j][i].maxwidth > 0) { if (mediacss[j][i].minwidth >= width && mediacss[j][i].maxwidth < width) { cssstr += buildcss(width, mediacss[j][i].csslist); } } else if (mediacss[j][i].minwidth > 0 && mediacss[j][i].maxwidth == 0) { if (mediacss[j][i].minwidth >= width) { cssstr += buildcss(width, mediacss[j][i].csslist); } } else if (mediacss[j][i].minwidth == 0 && mediacss[j][i].maxwidth > 0) { if (mediacss[j][i].maxwidth < width) { cssstr += buildcss(width, mediacss[j][i].csslist); } } else { cssstr += buildcss(width, mediacss[j][i].csslist); } } } writecss(cssstr); } // 构造css var buildcss = function (width, csslist) { var radio = width / max_width; var csstext = ""; for (var i = 0; i < csslist.length; i++) { csstext += csslist[i].classname + "{"; for (var j = 0; j < csslist[i].attrlist.length; j++) { if (csslist[i].attrlist[j].key == "background") { var url = csslist[i].attrlist[j].values[0].url; url = url.replace(/\.\.\//g, ""); csstext += "filter: progid:dximagetransform.microsoft.alphaimageloader(src='" + url + "',sizingmethod='scale');"; csstext += "background:none\\9;"; csstext += "background:none\\8;"; } else { csstext += csslist[i].attrlist[j].key + ":"; var values = csslist[i].attrlist[j].values; for (var z = 0; z < values.length; z++) { if (values[z].ispx) { var v = values[z].value * radio; csstext += v + values[z].unit + " "; } else { csstext += values[z].value + values[z].unit + " "; } } } csstext += ";"; } csstext += "}"; } return csstext; } // 写css var writecss = function (csstext) { if (cssstyle == null) { cssstyle = document.createelement('style'); cssstyle.setattribute('type', 'text/css'); cssstyle.id = 'cssreplace'; document.getelementsbytagname('head')[0].appendchild(cssstyle); csstextnode = document.createtextnode(""); if (cssstyle.stylesheet) { cssstyle.stylesheet.csstext = csstext; } else { cssstyle.appendchild(csstextnode); csstextnode.textcontent = csstext; } } else { if (cssstyle.stylesheet) { cssstyle.stylesheet.csstext = csstext; } else { csstextnode.textcontent = csstext; } } } function checkletie9() { var theua = window.navigator.useragent.tolowercase(); if ((theua.match(/msie\s\d+/) && theua.match(/msie\s\d+/)[0]) || (theua.match(/trident\s?\d+/) && theua.match(/trident\s?\d+/)[0])) { var ieversion = theua.match(/msie\s\d+/)[0].match(/\d+/)[0] || theua.match(/trident\s?\d+/)[0]; if (ieversion <= 9) { return true; } } return false; } if(checkletie9()){ processlinks(); } window.console = window.console || (function () { var c ={};    c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile= c.clear = c.exception = c.trace = c.assert = function(){}; return c; })(); })(window);