最近在做前台换肤技术预研时遇到几个IE(IE8)上需要注意的问题,记录如下:
一、关于base标签的使用
Base标签是为页面上的所有链接规定默认地址或默认目标,但base标签在IE浏览器的使用上需要特殊注意,其作用范围与其他浏览器(chrome、firefox等)不同,在其他浏览器中其作用域是整个页面,而在IE中,只对第一个引入的资源生效,例如页面引入资源如下:
<base href="${CONTEXT_PATH}/" /> <link rel="stylesheet" type="text/css" href="scripts/pagelayout/layout-default-latest.css" /> <link rel="stylesheet" href="scripts/jquery-ui/development-bundle/themes/ui-lightness/jquery.ui.all.css">
在上面的示例代码中,layout-default-latest.css资源可被正常引入,而jquery.ui.all.css资源无法正常引入。通过网上查找相关资料,问题定位为IE的页面快速渲染机制存在bug,该问题可以通过升级包(KB974455)进行修复。或者在引入资源前都加入base标签来解决。
<base href="${CONTEXT_PATH}/" /> <link rel="stylesheet" type="text/css" href="scripts/pagelayout/layout-default-latest.css" /> <base href="${CONTEXT_PATH}/" /> <link rel="stylesheet" href="scripts/jquery-ui/development-bundle/themes/ui-lightness/jquery.ui.all.css">
由于每次都追加base标签比较繁琐,而且在js中也无法引入,最终采用request中加入上下文信息供资源引入时使用。方式如下:
<link id="jQueryCss" rel="stylesheet" type="text/css" href="${CONTEXT_PATH}/scripts/pagelayout/layout-default-latest.css" /> <link rel="stylesheet" href="${CONTEXT_PATH}/scripts/jquery-ui/development-bundle/themes/ui-lightness/jquery.ui.all.css"> <link rel="stylesheet" type="text/css" href="${CONTEXT_PATH}/scripts/formValidationEngine/css/validationEngine.jquery.css" />
二、关于换肤js使用方式
换肤实现机制是动态加载不同样式文件进行渲染来达到换肤的效果。通用的皮肤切换方式是将原有样式文件替换,再将新的样式文件append到head上,基于jQuery的实现方式如下:
var href = "${CONTEXT_PATH}/scripts/jquery-ui/development-bundle/themes/" + theme + "/jquery.ui.all.css"; $('#jQueryCss').remove(); $('head').append('<link id="jQueryCss" href="' + href + '" rel="Stylesheet" type="text/css" />');
但是此方式在IE上无法达到换肤的效果,需要使用如下方式来强制让IE进行页面渲染:
var href = "${CONTEXT_PATH}/scripts/jquery-ui/development-bundle/themes/" + theme + "/jquery.ui.all.css"; $(#jQueryCss).attr("type",""); $(#jQueryCss).attr("href", href); $(#jQueryCss).attr("type","text/css");
三、jQuery获取颜色值:
在使用jQuery(“#colorId”).css(“color”)取值时,不同的浏览器或版本获取到的颜色值会不同,有些浏览器获取到的颜色值时#9c9ef(16进制格式),有些浏览器则返回rgb(x,x,x)类。如需求需要获取到16进制颜色值,可通过浏览器版本判断来对rgb类颜色值进行转换,转换函数如下RGB2Hex('rgb(151, 203, 255)' ):
function RGB2Hex(rgb){ var re = rgb.replace(/(?:\(|\)|rgb|RGB)*/g,"").split(",");//利用正则表达式去掉多余的部分 var hexColor = "#"; var hex = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']; for (var i = 0; i < 3; i++) { var r = null; var c = re[i]; var hexAr = []; while (c > 16) { r = c % 16; c = (c / 16) >> 0; hexAr.push(hex[r]); } hexAr.push(hex[c]); hexColor += hexAr.reverse().join(''); } return hexColor; }