国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

248 lines
7.3KB

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