csshover.htc能够处理ie6下hover不起功效等适配难题

2021-03-11 04:09 jianzhan
在ie6 下仅有a 才适用:hover 伪类,其它标识都不适用,如今能够根据 csshover.htc 能够处理 ie6 的 hover 适配难题。
它运用 javascript 脚本制作来给元素的的款式界定,假如检验到 hover 界定,就给元素设定 onmouseover 和 onmouseout 恶性事件,以此来完成 hover 的实际效果。
下列是 csshover.htc 编码

拷贝编码
编码以下:

<attach event="ondocumentready" handler="parseStylesheets"/>
<script language="JScript">
var currentSheet, doc = window.document, activators = {
onhover:{on:'onmouseover', off:'onmouseout'},
onactive:{on:'onmousedown', off:'onmouseup'}
};
function parseStylesheets(){
var sheets = doc.styleSheets, l = sheets.length;
for(var i = 0; i < l; i++){
parseStylesheet(sheets[i]);
};
};
function parseStylesheet(sheet){
if(sheet.imports){
try{
var imports = sheet.imports, l = imports.length;
for(var i = 0; i < l; i++){
parseStylesheet(sheet.imports[i]);
};
}catch(securityException){};
};
try{
var rules = (currentSheet = sheet).rules, l = rules.length;
for(var j = 0; j < l; j++){
parseCSSRule(rules[j]);
};
}catch(securityException){};
};
function parseCSSRule(rule){
var select = rule.selectorText, style = rule.style.cssText;
if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active)/i).test(select) || !style) return;
var pseudo = select.replace(/[^:]+:([a-z-]+).*/i, 'on$1');
var newSelect = select.replace(/(\.([a-z0⑼_-]+):[a-z]+)|(:[a-z]+)/gi, '.$2' + pseudo);
var className = (/\.([a-z0⑼_-]*on(hover|active))/i).exec(newSelect)[1];
var affected = select.replace(/:hover.*$/, '');
var elements = getElementsBySelect(affected);
currentSheet.addRule(newSelect, style);
for(var i = 0; i < elements.length; i++){
new HoverElement(elements[i], className, activators[pseudo]);
};
};
function HoverElement(node, className, events){
if(!node.hovers) node.hovers = {};
if(node.hovers[className]) return;
node.hovers[className] = true;
node.attachEvent(events.on, function(){
node.className += ' ' + className;
});
node.attachEvent(events.off, function(){
node.className = node.className.replace(new RegExp('\\s+'+className, 'g'),'');
});
};
function getElementsBySelect(rule){
var parts, nodes = [doc];
parts = rule.split(' ');
for(var i = 0; i < parts.length; i++){
nodes = getSelectedNodes(parts[i], nodes);
};
return nodes;
};
function getSelectedNodes(select, elements){
var result, node, nodes = [];
var classname = (/\.([a-z0⑼_-]+)/i).exec(select);
var identify = (/\#([a-z0⑼_-]+)/i).exec(select);
var tagName = select.replace(/(\.|\#|\:)[a-z0⑼_-]+/i, '');
for(var i = 0; i < elements.length; i++){
result = tagName ? elements[i].all.tags(tagName) : elements[i].all;
for(var j = 0; j < result.length; j++){
node = result[j];
if((identify && node.id != identify[1]) || (classname && !(new RegExp('\\b' + classname[1] + '\\b').exec(node.className)))) continue;
nodes[nodes.length] = node;
};
};
return nodes;
};
</script>

应用方式

拷贝编码
编码以下:

body{behavior:url(css/csshover.htc);}

留意
在引入 csshover.htc 时,无论你是在 css 文档里边引入 htc 文档,還是 html 里边引入 htc 文档,全是 html 文档去找 htc 的相对路径。也便是说相对路径1定要相对性根文件目录或用肯定相对路径。