csshover.htc 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <attach event="ondocumentready" handler="parseStylesheets"/>
  2. <script language="JScript">
  3. var currentSheet, doc = window.document, activators = {
  4. onhover:{on:'onmouseover', off:'onmouseout'},
  5. onactive:{on:'onmousedown', off:'onmouseup'}
  6. };
  7. function parseStylesheets(){
  8. var sheets = doc.styleSheets, l = sheets.length;
  9. for(var i = 0; i < l; i++){
  10. parseStylesheet(sheets[i]);
  11. };
  12. };
  13. function parseStylesheet(sheet){
  14. if(sheet.imports){
  15. try{
  16. var imports = sheet.imports, l = imports.length;
  17. for(var i = 0; i < l; i++){
  18. parseStylesheet(sheet.imports[i]);
  19. };
  20. }catch(securityException){};
  21. };
  22. try{
  23. var rules = (currentSheet = sheet).rules, l = rules.length;
  24. for(var j = 0; j < l; j++){
  25. parseCSSRule(rules[j]);
  26. };
  27. }catch(securityException){};
  28. };
  29. function parseCSSRule(rule){
  30. var select = rule.selectorText, style = rule.style.cssText;
  31. if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active)/i).test(select) || !style) return;
  32. var pseudo = select.replace(/[^:]+:([a-z-]+).*/i, 'on$1');
  33. var newSelect = select.replace(/(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi, '.$2' + pseudo);
  34. var className = (/\.([a-z0-9_-]*on(hover|active))/i).exec(newSelect)[1];
  35. var affected = select.replace(/:hover.*$/, '');
  36. var elements = getElementsBySelect(affected);
  37. currentSheet.addRule(newSelect, style);
  38. for(var i = 0; i < elements.length; i++){
  39. new HoverElement(elements[i], className, activators[pseudo]);
  40. };
  41. };
  42. function HoverElement(node, className, events){
  43. if(!node.hovers) node.hovers = {};
  44. if(node.hovers[className]) return;
  45. node.hovers[className] = true;
  46. node.attachEvent(events.on, function(){
  47. node.className += ' ' + className;
  48. });
  49. node.attachEvent(events.off, function(){
  50. node.className = node.className.replace(new RegExp('\\s+'+className, 'g'),'');
  51. });
  52. };
  53. function getElementsBySelect(rule){
  54. var parts, nodes = [doc];
  55. parts = rule.split(' ');
  56. for(var i = 0; i < parts.length; i++){
  57. nodes = getSelectedNodes(parts[i], nodes);
  58. };
  59. return nodes;
  60. };
  61. function getSelectedNodes(select, elements){
  62. var result, node, nodes = [];
  63. var classname = (/\.([a-z0-9_-]+)/i).exec(select);
  64. var identify = (/\#([a-z0-9_-]+)/i).exec(select);
  65. var tagName = select.replace(/(\.|\#|\:)[a-z0-9_-]+/i, '');
  66. for(var i = 0; i < elements.length; i++){
  67. result = tagName ? elements[i].all.tags(tagName) : elements[i].all;
  68. for(var j = 0; j < result.length; j++){
  69. node = result[j];
  70. if((identify && node.id != identify[1]) || (classname && !(new RegExp('\\b' + classname[1] + '\\b').exec(node.className)))) continue;
  71. nodes[nodes.length] = node;
  72. };
  73. };
  74. return nodes;
  75. };
  76. </script>