zoukankan      html  css  js  c++  java
  • IE6不支持<a>标签以外元素的hover的解决方案

    IE6以及更低版本的浏览器对“:hover”的支持不理想,对于类似的“p:hover”、“img:hover”、“#header:hover”...,今天给大家介绍一种新的方法,可以完美解决IE6不支持hover的情况,用法很简单,将下载后的“csshover.htc”文件,定义在body样式内

    1. body { behavior:url("csshover.htc"); }  /*不管这句样式是定义在外部还是页面中的  url(csshover.htc)中htc文件的路径始终是相对html页面的。 */

    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-9_-]+):[a-z]+)|(:[a-z]+)/gi, '.$2' + pseudo);
    var className = (/.([a-z0-9_-]*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-9_-]+)/i).exec(select);
    var identify = (/#([a-z0-9_-]+)/i).exec(select);
    var tagName = select.replace(/(.|#|:)[a-z0-9_-]+/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> 
  • 相关阅读:
    git 学习网站
    Vue 部署在 IIS 上
    Element UI 的坑
    Vue 中 Prop 传至的 一个Bug
    Asp.net Core 部署在 IIS上
    今天用UniApp开发, 用到 Vuex 中的 mutations, 设置值的时候好像只能传2个参数, 第一个是固定的state, 第二个是一个值, 不能传第三个了
    anxios 和 uni.request 访问Asp.net 服务器传参出错的坑
    内网计算机设置问题说明
    关于综合布线
    Android学习 -- Activity 以及Activity之间值传递
  • 原文地址:https://www.cnblogs.com/stephenykk/p/3663877.html
Copyright © 2011-2022 走看看