为FireFox添加IE的方法和属性

简介:
Ieemu.js代码   收藏代码
  1. var ie = document.all != null;  
  2. var moz = !ie && document.getElementById != null && document.layers == null;  
  3.   
  4. /*  
  5.  * Extends the event object with srcElement, cancelBubble, returnValue,  
  6.  * fromElement and toElement  
  7.  */  
  8. function extendEventObject() {  
  9.     Event.prototype.__defineSetter__("returnValue", function (b) {  
  10.         if (!b) this.preventDefault();  
  11.     });  
  12.       
  13.     Event.prototype.__defineSetter__("cancelBubble", function (b) {  
  14.         if (b) this.stopPropagation();  
  15.     });  
  16.       
  17.     Event.prototype.__defineGetter__("srcElement", function () {  
  18.         var node = this.target;  
  19.         while (node.nodeType != 1) node = node.parentNode;  
  20.         return node;  
  21.     });  
  22.   
  23.     Event.prototype.__defineGetter__("fromElement", function () {  
  24.         var node;  
  25.         if (this.type == "mouseover")  
  26.             node = this.relatedTarget;  
  27.         else if (this.type == "mouseout")  
  28.             node = this.target;  
  29.         if (!node) return;  
  30.         while (node.nodeType != 1) node = node.parentNode;  
  31.         return node;  
  32.     });  
  33.   
  34.     Event.prototype.__defineGetter__("toElement", function () {  
  35.         var node;  
  36.         if (this.type == "mouseout")  
  37.             node = this.relatedTarget;  
  38.         else if (this.type == "mouseover")  
  39.             node = this.target;  
  40.         if (!node) return;  
  41.         while (node.nodeType != 1) node = node.parentNode;  
  42.         return node;  
  43.     });  
  44.       
  45.     Event.prototype.__defineGetter__("offsetX", function () {  
  46.         return this.layerX;  
  47.     });  
  48.     Event.prototype.__defineGetter__("offsetY", function () {  
  49.         return this.layerY;  
  50.     });  
  51. }  
  52.   
  53. /*  
  54.  * Emulates element.attachEvent as well as detachEvent  
  55.  */  
  56. function emulateAttachEvent() {  
  57.     HTMLDocument.prototype.attachEvent =   
  58.     HTMLElement.prototype.attachEvent = function (sType, fHandler) {  
  59.         var shortTypeName = sType.replace(/on/, "");  
  60.         fHandler._ieEmuEventHandler = function (e) {  
  61.             window.event = e;  
  62.             return fHandler();  
  63.         };  
  64.         this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);  
  65.     };  
  66.   
  67.     HTMLDocument.prototype.detachEvent =   
  68.     HTMLElement.prototype.detachEvent = function (sType, fHandler) {  
  69.         var shortTypeName = sType.replace(/on/, "");  
  70.         if (typeof fHandler._ieEmuEventHandler == "function")  
  71.             this.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);  
  72.         else  
  73.             this.removeEventListener(shortTypeName, fHandler, true);  
  74.     };  
  75. }  
  76.   
  77. /*  
  78.  * This function binds the event object passed along in an  
  79.  * event to window.event  
  80.  */  
  81. function emulateEventHandlers(eventNames) {  
  82.     for (var i = 0; i < eventNames.length; i++) {      
  83.         document.addEventListener(eventNames[i], function (e) {  
  84.             window.event = e;  
  85.         }, true);   // using capture  
  86.     }  
  87. }  
  88.   
  89. /*  
  90.  * Simple emulation of document.all  
  91.  * this one is far from complete. Be cautious  
  92.  */  
  93.    
  94. function emulateAllModel() {  
  95.     var allGetter = function () {  
  96.         var a = this.getElementsByTagName("*");  
  97.         var node = this;  
  98.         a.tags = function (sTagName) {  
  99.             return node.getElementsByTagName(sTagName);  
  100.         };  
  101.         return a;  
  102.     };  
  103.     HTMLDocument.prototype.__defineGetter__("all", allGetter);  
  104.     HTMLElement.prototype.__defineGetter__("all", allGetter);  
  105. }  
  106.   
  107. function extendElementModel() {  
  108.     HTMLElement.prototype.__defineGetter__("parentElement", function () {  
  109.         if (this.parentNode == this.ownerDocument) return null;  
  110.         return this.parentNode;  
  111.     });  
  112.       
  113.     HTMLElement.prototype.__defineGetter__("children", function () {  
  114.         var tmp = [];  
  115.         var j = 0;  
  116.         var n;  
  117.         for (var i = 0; i < this.childNodes.length; i++) {  
  118.             n = this.childNodes[i];  
  119.             if (n.nodeType == 1) {  
  120.                 tmp[j++] = n;  
  121.                 if (n.name) {   // named children  
  122.                     if (!tmp[n.name])  
  123.                         tmp[n.name] = [];  
  124.                     tmp[n.name][tmp[n.name].length] = n;  
  125.                 }  
  126.                 if (n.id)       // child with id  
  127.                     tmp[n.id] = n  
  128.             }  
  129.         }  
  130.         return tmp;  
  131.     });  
  132.       
  133.     HTMLElement.prototype.contains = function (oEl) {  
  134.         if (oEl == this) return true;  
  135.         if (oEl == null) return false;  
  136.         return this.contains(oEl.parentNode);         
  137.     };  
  138. }  
  139.   
  140. /*  
  141.   
  142. document.defaultView.getComputedStyle(el1,<BR>null).getPropertyValue('top');  
  143.   
  144. */  
  145. function emulateCurrentStyle(properties) {  
  146.     HTMLElement.prototype.__defineGetter__("currentStyle", function () {  
  147.         var cs = {};  
  148.         var el = this;  
  149.         for (var i = 0; i < properties.length; i++) {  
  150.             //cs.__defineGetter__(properties[i], function () {  
  151.             //  window.status = "i: " + i   ;  
  152.             //  return document.defaultView.getComputedStyle(el, null).getPropertyValue(properties[i]);  
  153.             //});  
  154.             cs.__defineGetter__(properties[i], encapsulateObjects(el, properties[i]));  
  155.         }  
  156.         return cs;  
  157.     });  
  158. }  
  159. // used internally for emualteCurrentStyle  
  160. function encapsulateObjects(el, sProperty) {  
  161.     return function () {  
  162.         return document.defaultView.getComputedStyle(el, null).getPropertyValue(sProperty);  
  163.     };  
  164. }  
  165.   
  166. function emulateHTMLModel() {  
  167.   
  168.     // This function is used to generate a html string for the text properties/methods  
  169.     // It replaces '\n' with "<BR"> as well as fixes consecutive white spaces  
  170.     // It also repalaces some special characters      
  171.     function convertTextToHTML(s) {  
  172.         s = s.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\n/g, "<BR>");  
  173.         while (/\s\s/.test(s))  
  174.             s = s.replace(/\s\s/, "&nbsp; ");  
  175.         return s.replace(/\s/g, " ");  
  176.     }  
  177.   
  178.     HTMLElement.prototype.insertAdjacentHTML = function (sWhere, sHTML) {  
  179.         var df; // : DocumentFragment  
  180.         var r = this.ownerDocument.createRange();  
  181.           
  182.         switch (String(sWhere).toLowerCase()) {  
  183.             case "beforebegin":  
  184.                 r.setStartBefore(this);  
  185.                 df = r.createContextualFragment(sHTML);  
  186.                 this.parentNode.insertBefore(df, this);  
  187.                 break;  
  188.                   
  189.             case "afterbegin":  
  190.                 r.selectNodeContents(this);  
  191.                 r.collapse(true);  
  192.                 df = r.createContextualFragment(sHTML);  
  193.                 this.insertBefore(df, this.firstChild);  
  194.                 break;  
  195.                   
  196.             case "beforeend":  
  197.                 r.selectNodeContents(this);  
  198.                 r.collapse(false);  
  199.                 df = r.createContextualFragment(sHTML);  
  200.                 this.appendChild(df);  
  201.                 break;  
  202.                   
  203.             case "afterend":  
  204.                 r.setStartAfter(this);  
  205.                 df = r.createContextualFragment(sHTML);  
  206.                 this.parentNode.insertBefore(df, this.nextSibling);  
  207.                 break;  
  208.         }     
  209.     };  
  210.   
  211.     HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML) {  
  212.        var r = this.ownerDocument.createRange();  
  213.        r.setStartBefore(this);  
  214.        var df = r.createContextualFragment(sHTML);  
  215.        this.parentNode.replaceChild(df, this);  
  216.          
  217.        return sHTML;  
  218.     });  
  219.   
  220.     HTMLElement.prototype.__defineGetter__("canHaveChildren", function () {  
  221.         switch (this.tagName) {  
  222.             case "AREA":  
  223.             case "BASE":  
  224.             case "BASEFONT":  
  225.             case "COL":  
  226.             case "FRAME":  
  227.             case "HR":  
  228.             case "IMG":  
  229.             case "BR":  
  230.             case "INPUT":  
  231.             case "ISINDEX":  
  232.             case "LINK":  
  233.             case "META":  
  234.             case "PARAM":  
  235.                 return false;  
  236.         }  
  237.         return true;  
  238.     });  
  239.   
  240.     HTMLElement.prototype.__defineGetter__("outerHTML", function () {  
  241.         var attr, attrs = this.attributes;  
  242.         var str = "<" + this.tagName;  
  243.         for (var i = 0; i < attrs.length; i++) {  
  244.             attr = attrs[i];  
  245.             if (attr.specified)  
  246.                 str += " " + attr.name + '="' + attr.value + '"';  
  247.         }  
  248.         if (!this.canHaveChildren)  
  249.             return str + ">";  
  250.           
  251.         return str + ">" + this.innerHTML + "</" + this.tagName + ">";  
  252.     });  
  253.   
  254.   
  255.     HTMLElement.prototype.__defineSetter__("innerText", function (sText) {  
  256.         this.innerHTML = convertTextToHTML(sText);  
  257.         return sText;         
  258.     });  
  259.   
  260.     var tmpGet;  
  261.     HTMLElement.prototype.__defineGetter__("innerText", tmpGet = function () {  
  262.         var r = this.ownerDocument.createRange();  
  263.         r.selectNodeContents(this);  
  264.         return r.toString();  
  265.     });  
  266.   
  267.     HTMLElement.prototype.__defineSetter__("outerText", function (sText) {  
  268.         this.outerHTML = convertTextToHTML(sText);  
  269.         return sText;  
  270.     });  
  271.     HTMLElement.prototype.__defineGetter__("outerText", tmpGet);  
  272.   
  273.     HTMLElement.prototype.insertAdjacentText = function (sWhere, sText) {  
  274.         this.insertAdjacentHTML(sWhere, convertTextToHTML(sText));  
  275.     };  
  276.   
  277. }  

 调用方法:

<script language="JavaScript" src="js/ieemu.js"></script>

<script language="javascript">
if(moz) {
    extendEventObject();
    extendElementModel();
    emulateAttachEvent();
}

</script>

相关文章
|
3月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
在masm32中获取IE版本的方法2
在masm32中获取IE版本的方法2
在masm32中获取并显示IE版本的方法1
在masm32中获取并显示IE版本的方法1
|
Web App开发
clearTimeout 方法在IE上的兼容问题
clearTimeout 方法在IE上的兼容问题
73 0
|
Web App开发 JavaScript
JS 获取当前浏览器类型(IE、Chrome、Edge、Firefox、Opera、UC、QQ)
JS 获取当前浏览器类型(IE、Chrome、Edge、Firefox、Opera、UC、QQ)
1191 0
|
Web App开发 前端开发
区分IE6,IE7,IE8,IE9,FireFox,Chrome浏览器的CSS hack
区分IE6,IE7,IE8,IE9,FireFox,Chrome浏览器的CSS hack
|
JavaScript 前端开发
关于 getBoundingClientRect 方法在360极速浏览器的 IE 兼容模式下获取 documentElement 宽度比在 IE 浏览器下面多 4px 的问题
关于 getBoundingClientRect 方法在360极速浏览器的 IE 兼容模式下获取 documentElement 宽度比在 IE 浏览器下面多 4px 的问题
92 0
关于 getBoundingClientRect 方法在360极速浏览器的 IE 兼容模式下获取 documentElement 宽度比在 IE 浏览器下面多 4px 的问题
|
Windows
el-input在ie浏览器下readonly属性出现光标
el-input在ie浏览器下readonly属性出现光标
201 0
|
Web App开发 安全
接口框架中WebDriver启动IE、Firefox和Chrome浏览器
接口框架中WebDriver启动IE、Firefox和Chrome浏览器
接口框架中WebDriver启动IE、Firefox和Chrome浏览器