style.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:14k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.html.style");
  9. dojo.require("dojo.html.common");
  10. dojo.require("dojo.uri.Uri");
  11. dojo.html.getClass = function (node) {
  12. node = dojo.byId(node);
  13. if (!node) {
  14. return "";
  15. }
  16. var cs = "";
  17. if (node.className) {
  18. cs = node.className;
  19. } else {
  20. if (dojo.html.hasAttribute(node, "class")) {
  21. cs = dojo.html.getAttribute(node, "class");
  22. }
  23. }
  24. return cs.replace(/^s+|s+$/g, "");
  25. };
  26. dojo.html.getClasses = function (node) {
  27. var c = dojo.html.getClass(node);
  28. return (c == "") ? [] : c.split(/s+/g);
  29. };
  30. dojo.html.hasClass = function (node, classname) {
  31. return (new RegExp("(^|\s+)" + classname + "(\s+|$)")).test(dojo.html.getClass(node));
  32. };
  33. dojo.html.prependClass = function (node, classStr) {
  34. classStr += " " + dojo.html.getClass(node);
  35. return dojo.html.setClass(node, classStr);
  36. };
  37. dojo.html.addClass = function (node, classStr) {
  38. if (dojo.html.hasClass(node, classStr)) {
  39. return false;
  40. }
  41. classStr = (dojo.html.getClass(node) + " " + classStr).replace(/^s+|s+$/g, "");
  42. return dojo.html.setClass(node, classStr);
  43. };
  44. dojo.html.setClass = function (node, classStr) {
  45. node = dojo.byId(node);
  46. var cs = new String(classStr);
  47. try {
  48. if (typeof node.className == "string") {
  49. node.className = cs;
  50. } else {
  51. if (node.setAttribute) {
  52. node.setAttribute("class", classStr);
  53. node.className = cs;
  54. } else {
  55. return false;
  56. }
  57. }
  58. }
  59. catch (e) {
  60. dojo.debug("dojo.html.setClass() failed", e);
  61. }
  62. return true;
  63. };
  64. dojo.html.removeClass = function (node, classStr, allowPartialMatches) {
  65. try {
  66. if (!allowPartialMatches) {
  67. var newcs = dojo.html.getClass(node).replace(new RegExp("(^|\s+)" + classStr + "(\s+|$)"), "$1$2");
  68. } else {
  69. var newcs = dojo.html.getClass(node).replace(classStr, "");
  70. }
  71. dojo.html.setClass(node, newcs);
  72. }
  73. catch (e) {
  74. dojo.debug("dojo.html.removeClass() failed", e);
  75. }
  76. return true;
  77. };
  78. dojo.html.replaceClass = function (node, newClass, oldClass) {
  79. dojo.html.removeClass(node, oldClass);
  80. dojo.html.addClass(node, newClass);
  81. };
  82. dojo.html.classMatchType = {ContainsAll:0, ContainsAny:1, IsOnly:2};
  83. dojo.html.getElementsByClass = function (classStr, parent, nodeType, classMatchType, useNonXpath) {
  84. useNonXpath = false;
  85. var _document = dojo.doc();
  86. parent = dojo.byId(parent) || _document;
  87. var classes = classStr.split(/s+/g);
  88. var nodes = [];
  89. if (classMatchType != 1 && classMatchType != 2) {
  90. classMatchType = 0;
  91. }
  92. var reClass = new RegExp("(\s|^)((" + classes.join(")|(") + "))(\s|$)");
  93. var srtLength = classes.join(" ").length;
  94. var candidateNodes = [];
  95. if (!useNonXpath && _document.evaluate) {
  96. var xpath = ".//" + (nodeType || "*") + "[contains(";
  97. if (classMatchType != dojo.html.classMatchType.ContainsAny) {
  98. xpath += "concat(' ',@class,' '), ' " + classes.join(" ') and contains(concat(' ',@class,' '), ' ") + " ')";
  99. if (classMatchType == 2) {
  100. xpath += " and string-length(@class)=" + srtLength + "]";
  101. } else {
  102. xpath += "]";
  103. }
  104. } else {
  105. xpath += "concat(' ',@class,' '), ' " + classes.join(" ') or contains(concat(' ',@class,' '), ' ") + " ')]";
  106. }
  107. var xpathResult = _document.evaluate(xpath, parent, null, XPathResult.ANY_TYPE, null);
  108. var result = xpathResult.iterateNext();
  109. while (result) {
  110. try {
  111. candidateNodes.push(result);
  112. result = xpathResult.iterateNext();
  113. }
  114. catch (e) {
  115. break;
  116. }
  117. }
  118. return candidateNodes;
  119. } else {
  120. if (!nodeType) {
  121. nodeType = "*";
  122. }
  123. candidateNodes = parent.getElementsByTagName(nodeType);
  124. var node, i = 0;
  125. outer:
  126. while (node = candidateNodes[i++]) {
  127. var nodeClasses = dojo.html.getClasses(node);
  128. if (nodeClasses.length == 0) {
  129. continue outer;
  130. }
  131. var matches = 0;
  132. for (var j = 0; j < nodeClasses.length; j++) {
  133. if (reClass.test(nodeClasses[j])) {
  134. if (classMatchType == dojo.html.classMatchType.ContainsAny) {
  135. nodes.push(node);
  136. continue outer;
  137. } else {
  138. matches++;
  139. }
  140. } else {
  141. if (classMatchType == dojo.html.classMatchType.IsOnly) {
  142. continue outer;
  143. }
  144. }
  145. }
  146. if (matches == classes.length) {
  147. if ((classMatchType == dojo.html.classMatchType.IsOnly) && (matches == nodeClasses.length)) {
  148. nodes.push(node);
  149. } else {
  150. if (classMatchType == dojo.html.classMatchType.ContainsAll) {
  151. nodes.push(node);
  152. }
  153. }
  154. }
  155. }
  156. return nodes;
  157. }
  158. };
  159. dojo.html.getElementsByClassName = dojo.html.getElementsByClass;
  160. dojo.html.toCamelCase = function (selector) {
  161. var arr = selector.split("-"), cc = arr[0];
  162. for (var i = 1; i < arr.length; i++) {
  163. cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
  164. }
  165. return cc;
  166. };
  167. dojo.html.toSelectorCase = function (selector) {
  168. return selector.replace(/([A-Z])/g, "-$1").toLowerCase();
  169. };
  170. if (dojo.render.html.ie) {
  171. dojo.html.getComputedStyle = function (node, property, value) {
  172. node = dojo.byId(node);
  173. if (!node || !node.currentStyle) {
  174. return value;
  175. }
  176. return node.currentStyle[dojo.html.toCamelCase(property)];
  177. };
  178. dojo.html.getComputedStyles = function (node) {
  179. return node.currentStyle;
  180. };
  181. } else {
  182. dojo.html.getComputedStyle = function (node, property, value) {
  183. node = dojo.byId(node);
  184. if (!node || !node.style) {
  185. return value;
  186. }
  187. var s = document.defaultView.getComputedStyle(node, null);
  188. return (s && s[dojo.html.toCamelCase(property)]) || "";
  189. };
  190. dojo.html.getComputedStyles = function (node) {
  191. return document.defaultView.getComputedStyle(node, null);
  192. };
  193. }
  194. dojo.html.getStyleProperty = function (node, cssSelector) {
  195. node = dojo.byId(node);
  196. return (node && node.style ? node.style[dojo.html.toCamelCase(cssSelector)] : undefined);
  197. };
  198. dojo.html.getStyle = function (node, cssSelector) {
  199. var value = dojo.html.getStyleProperty(node, cssSelector);
  200. return (value ? value : dojo.html.getComputedStyle(node, cssSelector));
  201. };
  202. dojo.html.setStyle = function (node, cssSelector, value) {
  203. node = dojo.byId(node);
  204. if (node && node.style) {
  205. var camelCased = dojo.html.toCamelCase(cssSelector);
  206. node.style[camelCased] = value;
  207. }
  208. };
  209. dojo.html.setStyleText = function (target, text) {
  210. try {
  211. target.style.cssText = text;
  212. }
  213. catch (e) {
  214. target.setAttribute("style", text);
  215. }
  216. };
  217. dojo.html.copyStyle = function (target, source) {
  218. if (!source.style.cssText) {
  219. target.setAttribute("style", source.getAttribute("style"));
  220. } else {
  221. target.style.cssText = source.style.cssText;
  222. }
  223. dojo.html.addClass(target, dojo.html.getClass(source));
  224. };
  225. dojo.html.getUnitValue = function (node, cssSelector, autoIsZero) {
  226. var s = dojo.html.getComputedStyle(node, cssSelector);
  227. if ((!s) || ((s == "auto") && (autoIsZero))) {
  228. return {value:0, units:"px"};
  229. }
  230. var match = s.match(/(-?[d.]+)([a-z%]*)/i);
  231. if (!match) {
  232. return dojo.html.getUnitValue.bad;
  233. }
  234. return {value:Number(match[1]), units:match[2].toLowerCase()};
  235. };
  236. dojo.html.getUnitValue.bad = {value:NaN, units:""};
  237. if (dojo.render.html.ie) {
  238. dojo.html.toPixelValue = function (element, styleValue) {
  239. if (!styleValue) {
  240. return 0;
  241. }
  242. if (styleValue.slice(-2) == "px") {
  243. return parseFloat(styleValue);
  244. }
  245. var pixelValue = 0;
  246. with (element) {
  247. var sLeft = style.left;
  248. var rsLeft = runtimeStyle.left;
  249. runtimeStyle.left = currentStyle.left;
  250. try {
  251. style.left = styleValue || 0;
  252. pixelValue = style.pixelLeft;
  253. style.left = sLeft;
  254. runtimeStyle.left = rsLeft;
  255. }
  256. catch (e) {
  257. }
  258. }
  259. return pixelValue;
  260. };
  261. } else {
  262. dojo.html.toPixelValue = function (element, styleValue) {
  263. return (styleValue && (styleValue.slice(-2) == "px") ? parseFloat(styleValue) : 0);
  264. };
  265. }
  266. dojo.html.getPixelValue = function (node, styleProperty, autoIsZero) {
  267. return dojo.html.toPixelValue(node, dojo.html.getComputedStyle(node, styleProperty));
  268. };
  269. dojo.html.setPositivePixelValue = function (node, selector, value) {
  270. if (isNaN(value)) {
  271. return false;
  272. }
  273. node.style[selector] = Math.max(0, value) + "px";
  274. return true;
  275. };
  276. dojo.html.styleSheet = null;
  277. dojo.html.insertCssRule = function (selector, declaration, index) {
  278. if (!dojo.html.styleSheet) {
  279. if (document.createStyleSheet) {
  280. dojo.html.styleSheet = document.createStyleSheet();
  281. } else {
  282. if (document.styleSheets[0]) {
  283. dojo.html.styleSheet = document.styleSheets[0];
  284. } else {
  285. return null;
  286. }
  287. }
  288. }
  289. if (arguments.length < 3) {
  290. if (dojo.html.styleSheet.cssRules) {
  291. index = dojo.html.styleSheet.cssRules.length;
  292. } else {
  293. if (dojo.html.styleSheet.rules) {
  294. index = dojo.html.styleSheet.rules.length;
  295. } else {
  296. return null;
  297. }
  298. }
  299. }
  300. if (dojo.html.styleSheet.insertRule) {
  301. var rule = selector + " { " + declaration + " }";
  302. return dojo.html.styleSheet.insertRule(rule, index);
  303. } else {
  304. if (dojo.html.styleSheet.addRule) {
  305. return dojo.html.styleSheet.addRule(selector, declaration, index);
  306. } else {
  307. return null;
  308. }
  309. }
  310. };
  311. dojo.html.removeCssRule = function (index) {
  312. if (!dojo.html.styleSheet) {
  313. dojo.debug("no stylesheet defined for removing rules");
  314. return false;
  315. }
  316. if (dojo.render.html.ie) {
  317. if (!index) {
  318. index = dojo.html.styleSheet.rules.length;
  319. dojo.html.styleSheet.removeRule(index);
  320. }
  321. } else {
  322. if (document.styleSheets[0]) {
  323. if (!index) {
  324. index = dojo.html.styleSheet.cssRules.length;
  325. }
  326. dojo.html.styleSheet.deleteRule(index);
  327. }
  328. }
  329. return true;
  330. };
  331. dojo.html._insertedCssFiles = [];
  332. dojo.html.insertCssFile = function (URI, doc, checkDuplicates, fail_ok) {
  333. if (!URI) {
  334. return;
  335. }
  336. if (!doc) {
  337. doc = document;
  338. }
  339. var cssStr = dojo.hostenv.getText(URI, false, fail_ok);
  340. if (cssStr === null) {
  341. return;
  342. }
  343. cssStr = dojo.html.fixPathsInCssText(cssStr, URI);
  344. if (checkDuplicates) {
  345. var idx = -1, node, ent = dojo.html._insertedCssFiles;
  346. for (var i = 0; i < ent.length; i++) {
  347. if ((ent[i].doc == doc) && (ent[i].cssText == cssStr)) {
  348. idx = i;
  349. node = ent[i].nodeRef;
  350. break;
  351. }
  352. }
  353. if (node) {
  354. var styles = doc.getElementsByTagName("style");
  355. for (var i = 0; i < styles.length; i++) {
  356. if (styles[i] == node) {
  357. return;
  358. }
  359. }
  360. dojo.html._insertedCssFiles.shift(idx, 1);
  361. }
  362. }
  363. var style = dojo.html.insertCssText(cssStr, doc);
  364. dojo.html._insertedCssFiles.push({"doc":doc, "cssText":cssStr, "nodeRef":style});
  365. if (style && djConfig.isDebug) {
  366. style.setAttribute("dbgHref", URI);
  367. }
  368. return style;
  369. };
  370. dojo.html.insertCssText = function (cssStr, doc, URI) {
  371. if (!cssStr) {
  372. return;
  373. }
  374. if (!doc) {
  375. doc = document;
  376. }
  377. if (URI) {
  378. cssStr = dojo.html.fixPathsInCssText(cssStr, URI);
  379. }
  380. var style = doc.createElement("style");
  381. style.setAttribute("type", "text/css");
  382. var head = doc.getElementsByTagName("head")[0];
  383. if (!head) {
  384. dojo.debug("No head tag in document, aborting styles");
  385. return;
  386. } else {
  387. head.appendChild(style);
  388. }
  389. if (style.styleSheet) {
  390. var setFunc = function () {
  391. try {
  392. style.styleSheet.cssText = cssStr;
  393. }
  394. catch (e) {
  395. dojo.debug(e);
  396. }
  397. };
  398. if (style.styleSheet.disabled) {
  399. setTimeout(setFunc, 10);
  400. } else {
  401. setFunc();
  402. }
  403. } else {
  404. var cssText = doc.createTextNode(cssStr);
  405. style.appendChild(cssText);
  406. }
  407. return style;
  408. };
  409. dojo.html.fixPathsInCssText = function (cssStr, URI) {
  410. if (!cssStr || !URI) {
  411. return;
  412. }
  413. var match, str = "", url = "", urlChrs = "[\t\s\w\(\)\/\.\\'"-:#=&?~]+";
  414. var regex = new RegExp("url\(\s*(" + urlChrs + ")\s*\)");
  415. var regexProtocol = /(file|https?|ftps?):///;
  416. regexTrim = new RegExp("^[\s]*(['"]?)(" + urlChrs + ")\1[\s]*?$");
  417. if (dojo.render.html.ie55 || dojo.render.html.ie60) {
  418. var regexIe = new RegExp("AlphaImageLoader\((.*)src=['"](" + urlChrs + ")['"]");
  419. while (match = regexIe.exec(cssStr)) {
  420. url = match[2].replace(regexTrim, "$2");
  421. if (!regexProtocol.exec(url)) {
  422. url = (new dojo.uri.Uri(URI, url).toString());
  423. }
  424. str += cssStr.substring(0, match.index) + "AlphaImageLoader(" + match[1] + "src='" + url + "'";
  425. cssStr = cssStr.substr(match.index + match[0].length);
  426. }
  427. cssStr = str + cssStr;
  428. str = "";
  429. }
  430. while (match = regex.exec(cssStr)) {
  431. url = match[1].replace(regexTrim, "$2");
  432. if (!regexProtocol.exec(url)) {
  433. url = (new dojo.uri.Uri(URI, url).toString());
  434. }
  435. str += cssStr.substring(0, match.index) + "url(" + url + ")";
  436. cssStr = cssStr.substr(match.index + match[0].length);
  437. }
  438. return str + cssStr;
  439. };
  440. dojo.html.setActiveStyleSheet = function (title) {
  441. var i = 0, a, els = dojo.doc().getElementsByTagName("link");
  442. while (a = els[i++]) {
  443. if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
  444. a.disabled = true;
  445. if (a.getAttribute("title") == title) {
  446. a.disabled = false;
  447. }
  448. }
  449. }
  450. };
  451. dojo.html.getActiveStyleSheet = function () {
  452. var i = 0, a, els = dojo.doc().getElementsByTagName("link");
  453. while (a = els[i++]) {
  454. if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) {
  455. return a.getAttribute("title");
  456. }
  457. }
  458. return null;
  459. };
  460. dojo.html.getPreferredStyleSheet = function () {
  461. var i = 0, a, els = dojo.doc().getElementsByTagName("link");
  462. while (a = els[i++]) {
  463. if (a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("rel").indexOf("alt") == -1 && a.getAttribute("title")) {
  464. return a.getAttribute("title");
  465. }
  466. }
  467. return null;
  468. };
  469. dojo.html.applyBrowserClass = function (node) {
  470. var drh = dojo.render.html;
  471. var classes = {dj_ie:drh.ie, dj_ie55:drh.ie55, dj_ie6:drh.ie60, dj_ie7:drh.ie70, dj_iequirks:drh.ie && drh.quirks, dj_opera:drh.opera, dj_opera8:drh.opera && (Math.floor(dojo.render.version) == 8), dj_opera9:drh.opera && (Math.floor(dojo.render.version) == 9), dj_khtml:drh.khtml, dj_safari:drh.safari, dj_gecko:drh.mozilla};
  472. for (var p in classes) {
  473. if (classes[p]) {
  474. dojo.html.addClass(node, p);
  475. }
  476. }
  477. };