ieemu.js
上传用户:yfdli66
上传日期:2010-02-20
资源大小:47k
文件大小:8k
源码类别:

JavaScript

开发平台:

JavaScript

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