让IE6支持非a标签的hover属性

本文介绍了一种在IE6浏览器上实现CSS hover效果的方法,通过创建hover.htc文件并结合CSS规则,使得非a标签也能响应鼠标悬停事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自从windows7推出以后,IE9也随之而来,但很多人还是喜欢用旧版本,并且相当一部分个人和企业都在使用IE6,不得不承认IE6是一款很成功的产品,但英雄总有暮年时,该退还得退,世界是在不断的更迭中丰富多彩的。既然有人习惯于旧事物,那么身为一名为人民服务的程序员,就得全心全意为客户。

目前CSS最新版是CSS3,而IE6支持的是CSS1.0,因此IE6不支持CSS中一些新特性。这次项目,要做下拉菜单,IE6不支持非a标签的hover属性,不得不采用HTML组件,虽然效果一般,但能实现功能。自Internet Explorer 5开始微软引入了HTML组件(Html Components)的概念,详见百度百科,HTML组件扩展名是.htc。

想要和其他浏览器一样使用hover的话,首先需要建立一个hover.htc的文件,将如下代码拷贝进去。

[javascript] view plain copy
  1. <attachevent="ondocumentready"handler="parseStylesheets"/>
  2. <script>
  3. varcsshoverReg=/(^|\s)(([^a]([^]+)?)|(a([^#.][^]+)+)):(hover|active)/i,
  4. currentSheet,doc=window.document,hoverEvents=[],activators={
  5. onhover:{on:'onmouseover',off:'onmouseout'},
  6. onactive:{on:'onmousedown',off:'onmouseup'}
  7. }
  8. functionparseStylesheets(){
  9. if(!/MSIE(5|6)/.test(navigator.userAgent))return;
  10. window.attachEvent('onunload',unhookHoverEvents);
  11. varsheets=doc.styleSheets,l=sheets.length;
  12. for(vari=0;i<l;i++)
  13. parseStylesheet(sheets[i]);
  14. }
  15. functionparseStylesheet(sheet){
  16. if(sheet.imports){
  17. try{
  18. varimports=sheet.imports,l=imports.length;
  19. for(vari=0;i<l;i++)parseStylesheet(sheet.imports[i]);
  20. }catch(securityException){}
  21. }
  22. try{
  23. varrules=(currentSheet=sheet).rules,l=rules.length;
  24. for(varj=0;j<l;j++)parseCSSRule(rules[j]);
  25. }catch(securityException){}
  26. }
  27. functionparseCSSRule(rule){
  28. varselect=rule.selectorText,style=rule.style.cssText;
  29. if(!csshoverReg.test(select)||!style)return;
  30. varpseudo=select.replace(/[^:]+:([a-z-]+).*/i,'on$1');
  31. varnewSelect=select.replace(/(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi,'.$2'+pseudo);
  32. varclassName=(/\.([a-z0-9_-]*on(hover|active))/i).exec(newSelect)[1];
  33. varaffected=select.replace(/:(hover|active).*$/,'');
  34. varelements=getElementsBySelect(affected);
  35. if(elements.length==0)return;
  36. currentSheet.addRule(newSelect,style);
  37. for(vari=0;i<elements.length;i++)
  38. newHoverElement(elements[i],className,activators[pseudo]);
  39. }
  40. functionHoverElement(node,className,events){
  41. if(!node.hovers)node.hovers={};
  42. if(node.hovers[className])return;
  43. node.hovers[className]=true;
  44. hookHoverEvent(node,events.on,function(){node.className+=''+className;});
  45. hookHoverEvent(node,events.off,function(){node.className=node.className.replace(newRegExp('\\s+'+className,'g'),'');});
  46. }
  47. functionhookHoverEvent(node,type,handler){
  48. node.attachEvent(type,handler);
  49. hoverEvents[hoverEvents.length]={
  50. node:node,type:type,handler:handler
  51. };
  52. }
  53. functionunhookHoverEvents(){
  54. for(vare,i=0;i<hoverEvents.length;i++){
  55. e=hoverEvents[i];
  56. e.node.detachEvent(e.type,e.handler);
  57. }
  58. }
  59. functiongetElementsBySelect(rule){
  60. varparts,nodes=[doc];
  61. parts=rule.split('');
  62. for(vari=0;i<parts.length;i++){
  63. nodes=getSelectedNodes(parts[i],nodes);
  64. }returnnodes;
  65. }
  66. functiongetSelectedNodes(select,elements){
  67. varresult,node,nodes=[];
  68. varidentify=(/\#([a-z0-9_-]+)/i).exec(select);
  69. if(identify){
  70. varelement=doc.getElementById(identify[1]);
  71. returnelement?[element]:nodes;
  72. }
  73. varclassname=(/\.([a-z0-9_-]+)/i).exec(select);
  74. vartagName=select.replace(/(\.|\#|\:)[a-z0-9_-]+/i,'');
  75. varclassReg=classname?newRegExp('\\b'+classname[1]+'\\b'):false;
  76. for(vari=0;i<elements.length;i++){
  77. result=tagName?elements[i].all.tags(tagName):elements[i].all;
  78. for(varj=0;j<result.length;j++){
  79. node=result[j];
  80. if(classReg&&!classReg.test(node.className))continue;
  81. nodes[nodes.length]=node;
  82. }
  83. }
  84. returnnodes;
  85. }
  86. </script>

然后在CSS文件中添加对hover.htc文件的引用,如下:

  1. div{
  2. behavior:url(js/hover.htc);
  3. }

此处注意引入文件的路径,一般不成功都是由路径问题引起的。添加完这两段代码后,就可以直接在CSS中对div标签使用hover啦。如下:
  1. #menuli:hoverdiv{
  2. visibility:visible;
  3. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值