1. /*
  2. 源码作者: 石不易(Louis Shi)
  3. 联系方式: http://www.shibuyi.net
  4. ===================================================================================================
  5. 程序名称: JavaScript 封装库 BETA 3.0 版
  6. 迭代版本: BETA 2.0
  7. 插件总数: 8 个
  8. 库方法数: 20 个
  9. 功能总数: 48 个
  10. 新增总数: 7 个
  11. 删除总数: 0 个
  12. 追加功能:
  13. 1. 新增“插件库”支持, 可自由扩展网页特效插件
  14. 2. 新增“元素节点选择器”, 元素节点操纵简便性大大提升, 可读性加强
  15. 3. 新增“HTML DOM 加载”, 节省外部文件加载耗时
  16. 4. 库方法: 新增“CSS 处理”, 分离调用代码可读性加强
  17. 5. 库方法: 新增“class 处理”, 分离调用代码可读性加强
  18. ...
  19. 优化功能:
  20. 1. 优化节点定位并删除了 name 方式定位, 遵循 W3C 原则
  21. 2. 优化节点事件绑定, 集中至“nodeEvent”方法同一调用, 可读性、扩展性、维护性大大加强
  22. 3. 库方法: 优化“清除空白节点”, 采用倒序遍历, 删除更加彻底简便
  23. 4. 库方法: 优化“清除注释节点”, 采用倒序遍历, 删除更加彻底简便
  24. ....
  25. 删除功能:

  26. */
  27.  
  28. // 实例化基础库
  29. $ = function () {
  30. return arguments.length == 0 ? new Base() : new Base(arguments);
  31. };
  32.  
  33. // 基础库构造方法
  34. var Base = function (nodes) {
  35. this.info = '无节点';
  36. this.elements = [];
  37. if (typeof nodes == 'object') {
  38. var elements = [], node = null;
  39. for (var i = 0; i < nodes.length; i ++) {
  40. node = nodes[i];
  41. if (typeof node == 'string') { // 元素节点选择器
  42. // 全局或局部
  43. if (this.elements.length == 0) this.elements.push(document);
  44. var patternSpace = /[\s\t ]+/;
  45. if (patternSpace.test(node)) { // 多层
  46. node = node.split(patternSpace);
  47. for (var j = 0; j < node.length; j ++) {
  48. if (j == (node.length - 1)) {
  49. elements.push(this.selector(node[j]).getNodes());
  50. } else {
  51. this.selector(node[j]);
  52. }
  53. }
  54. } else { // 单层
  55. elements.push(this.selector(node).getNodes());
  56. }
  57. this.elements = [];
  58. } else if (typeof node == 'object' && (node == window || typeof node.nodeType != 'undefined')) { // 节点对象
  59. this.elements.push(node);
  60. } else if (typeof node == 'function') { // HTML DOM 加载
  61. this.htmlLoaded(node);
  62. }
  63. }
  64. if (typeof elements != 'undefined') {
  65. for (var k = 0; k < elements.length; k ++) {
  66. if (elements[k] instanceof Array) { // 集群
  67. for (var l = 0; l < elements[k].length; l ++) {
  68. if (elements[k][l] != this.info) this.elements.push(elements[k][l]);
  69. }
  70. } else { // 单一
  71. if (elements[k] != this.info) this.elements.push(elements[k]);
  72. }
  73. }
  74. }
  75. }
  76. };
  77.  
  78. // 获取采集的所有节点
  79. Base.prototype.getNodes = function () {
  80. if (this.elements.length == 0) return this.info;
  81. if (this.elements.length == 1) return this.firstNode();
  82. return this.elements;
  83. };
  84.  
  85. // 获取采集的首位节点
  86. Base.prototype.firstNode = function () {
  87. if (this.elements.length == 0) return this.info;
  88. return this.elements[0];
  89. };
  90.  
  91. // 获取采集的末尾节点
  92. Base.prototype.lastNode = function () {
  93. if (this.elements.length == 0) return this.info;
  94. return this.elements[this.elements.length - 1];
  95. };
  96.  
  97. // 获取 id 元素节点
  98. Base.prototype.getId = function (ids, positioner) {
  99. if (ids instanceof Array) { // 集群
  100. for (var i = 0; i < ids.length; i ++) {
  101. this.getId(ids[i], positioner);
  102. }
  103. } else { // 单一
  104. var selector = null, node = null;
  105. if (typeof positioner != 'undefined') { // 局部
  106. if (typeof positioner == 'object' && typeof positioner.nodeType != 'undefined') {
  107. selector = positioner;
  108. } else {
  109. if (!(selector = Base.positioner(positioner))) return this;
  110. }
  111. } else { // 全局
  112. selector = document;
  113. }
  114. if (selector instanceof Array) { // 集群
  115. for (var j = 0; j < selector.length; j ++) {
  116. node = selector[j].getElementsByTagName('*');
  117. for (var k = 0; k < node.length; k ++) {
  118. if (node[k].id == ids) {
  119. for (var i = 0; i < this.elements.length; i ++) {
  120. if (this.elements[i] == node[k]) return this;
  121. }
  122. this.elements.push(node[k]);
  123. }
  124. }
  125. }
  126. } else { // 单一
  127. // 容错处理
  128. if (typeof selector.getElementById != 'undefined') {
  129. node = selector.getElementById(ids);
  130. if (node === null) return this;
  131. for (var i = 0; i < this.elements.length; i ++) {
  132. if (this.elements[i] == node) return this;
  133. }
  134. this.elements.push(node);
  135. } else {
  136. node = selector.getElementsByTagName('*');
  137. for (var j = 0; j < node.length; j ++) {
  138. if (node[j].id == ids) {
  139. for (var i = 0; i < this.elements.length; i ++) {
  140. if (this.elements[i] == node[j]) return this;
  141. }
  142. this.elements.push(node[j]);
  143. }
  144. }
  145. }
  146. }
  147. }
  148. return this;
  149. };
  150.  
  151. // 获取 tagName 元素节点
  152. Base.prototype.getTagName = function (tagName, positioner) {
  153. var selector = null, nodes = [];
  154. if (typeof positioner != 'undefined') { // 局部
  155. if (typeof positioner == 'object' && typeof positioner.nodeType != 'undefined') {
  156. selector = positioner;
  157. } else {
  158. if (!(selector = Base.positioner(positioner))) return this;
  159. }
  160. } else { // 全局
  161. selector = document;
  162. }
  163. if (selector instanceof Array) { // 集群
  164. for (var j = 0; j < selector.length; j ++) {
  165. nodes = selector[j].getElementsByTagName(tagName);
  166. for (var i = 0; i < nodes.length; i ++) {
  167. this.elements.push(nodes[i]);
  168. }
  169. }
  170. } else { // 单一
  171. nodes = selector.getElementsByTagName(tagName);
  172. for (var i = 0; i < nodes.length; i ++) {
  173. this.elements.push(nodes[i]);
  174. }
  175. }
  176. return this;
  177. };
  178.  
  179. // 获取 class 元素节点
  180. Base.prototype.getClass = function (className, positioner) {
  181. var selector = null, nodes = [];
  182. if (typeof positioner != 'undefined') { // 局部
  183. if (typeof positioner == 'object' && typeof positioner.nodeType != 'undefined') {
  184. selector = positioner;
  185. } else {
  186. if (!(selector = Base.positioner(positioner))) return this;
  187. }
  188. } else {// 全局
  189. selector = document;
  190. }
  191. if (selector instanceof Array) { // 集群
  192. for (var j = 0; j < selector.length; j ++) {
  193. nodes = selector[j].getElementsByTagName('*');
  194. for (var i = 0; i < nodes.length; i ++) {
  195. if (Base.hasClass(className, nodes[i])) this.elements.push(nodes[i]);
  196. }
  197. }
  198. } else { // 单一
  199. nodes = selector.getElementsByTagName('*');
  200. for (var i = 0; i < nodes.length; i ++) {
  201. if (Base.hasClass(className, nodes[i])) this.elements.push(nodes[i]);
  202. }
  203. }
  204. return this;
  205. };
  206.  
  207. // 获取 name 元素节点
  208. Base.prototype.getName = function (name, positioner) {
  209. var selector = null, nodes = [];
  210. if (typeof positioner != 'undefined') { // 局部
  211. if (typeof positioner == 'object' && typeof positioner.nodeType != 'undefined') {
  212. selector = positioner;
  213. } else {
  214. if (!(selector = Base.positioner(positioner))) return this;
  215. }
  216. } else { // 全局
  217. selector = document;
  218. }
  219. if (selector instanceof Array) { // 集群
  220. for (var j = 0; j < selector.length; j ++) {
  221. nodes = selector[j].getElementsByTagName('*');
  222. for (var i = 0; i < nodes.length; i ++) {
  223. if (nodes[i].name == name) this.elements.push(nodes[i]);
  224. }
  225. }
  226. } else { // 单一
  227. // 容错处理
  228. nodes = typeof selector.getElementsByName != 'undefined' ? selector.getElementsByName(name) : selector.getElementsByTagName('*');
  229. for (var i = 0; i < nodes.length; i ++) {
  230. if (nodes[i].name == name) this.elements.push(nodes[i]);
  231. }
  232. }
  233. return this;
  234. };
  235.  
  236. // 元素节点选择器
  237. Base.prototype.selector = function (node) {
  238. if (typeof node == 'string') {
  239. var nodes = [], elements = [];
  240. var patternId = /([a-z]+)#([\w\-]+)/i;
  241. var patternClass = /([a-z]+)\.([\w\-]+)/i;
  242. var tagName = '', id = '', className = '';
  243. for (var i = 0; i < this.elements.length; i ++) {
  244. switch (node.charAt(0)) {
  245. case '#' : // id
  246. if ((nodes = $().getId(node.substring(1, node.length), this.elements[i]).getNodes()) != this.info) {
  247. elements.push(nodes);
  248. }
  249. break;
  250. case '.' : // class
  251. if ((nodes = $().getClass(node.substring(1, node.length), this.elements[i]).getNodes()) != this.info) {
  252. if (nodes instanceof Array) { // 集群
  253. for (var j = 0; j < nodes.length; j ++) {
  254. elements.push(nodes[j]);
  255. }
  256. } else { // 单一
  257. elements.push(nodes);
  258. }
  259. }
  260. break;
  261. default :
  262. if (patternId.test(node)) { // tagName + id
  263. tagName = patternId.exec(node)[1];
  264. id = patternId.exec(node)[2];
  265. if ((nodes = $().getTagName(tagName, this.elements[i]).getNodes()) != this.info) {
  266. if (nodes instanceof Array) { // 集群
  267. for (var j = 0; j < nodes.length; j ++) {
  268. if (nodes[j].id == id) elements.push(nodes[j]);
  269. }
  270. } else { // 单一
  271. if (nodes.id == id) elements.push(nodes);
  272. }
  273. }
  274. } else if (patternClass.test(node)) { // tagName + class
  275. tagName = patternClass.exec(node)[1];
  276. className = patternClass.exec(node)[2];
  277. if ((nodes = $().getTagName(tagName, this.elements[i]).getNodes()) != this.info) {
  278. if (nodes instanceof Array) { // 集群
  279. for (var j = 0; j < nodes.length; j ++) {
  280. if (Base.hasClass(className, nodes[j])) elements.push(nodes[j]);
  281. }
  282. } else { // 单一
  283. if (Base.hasClass(className, nodes)) elements.push(nodes);
  284. }
  285. }
  286. } else { // tagName
  287. if ((nodes = $().getTagName(node, this.elements[i]).getNodes()) != this.info) {
  288. if (nodes instanceof Array) { // 集群
  289. for (var j = 0; j < nodes.length; j ++) {
  290. elements.push(nodes[j]);
  291. }
  292. } else { // 单一
  293. elements.push(nodes);
  294. }
  295. }
  296. }
  297. }
  298. }
  299. this.elements = elements;
  300. }
  301. return this;
  302. };
  303.  
  304. // 获取与设置元素内容
  305. Base.prototype.html = function (text) {
  306. var html = [];
  307. for (var i = 0; i < this.elements.length; i ++) {
  308. if (typeof text != 'undefined') { // 设置
  309. this.elements[i].innerHTML = text;
  310. } else { // 获取
  311. html.push(this.elements[i].innerHTML);
  312. }
  313. }
  314. switch (html.length) {
  315. case 0 :
  316. return this;
  317. break;
  318. case 1 :
  319. return html[0];
  320. break;
  321. default :
  322. return html;
  323. }
  324. };
  325.  
  326. // 获取与设置表单元素内容
  327. Base.prototype.value = function (text) {
  328. var value = [];
  329. for (var i = 0; i < this.elements.length; i ++) {
  330. if (typeof text != 'undefined') { // 设置
  331. if (typeof this.elements[i].value != 'undefined') this.elements[i].value = text;
  332. } else { // 获取
  333. if (typeof this.elements[i].value != 'undefined') value.push(this.elements[i].value);
  334. }
  335. }
  336. switch (value.length) {
  337. case 0 :
  338. return this;
  339. break;
  340. case 1 :
  341. return value[0];
  342. break;
  343. default :
  344. return value;
  345. }
  346. };
  347.  
  348. // 获取与设置 CSS
  349. Base.prototype.css = function (cssKey, cssValue) {
  350. if (typeof cssValue != 'undefined' || cssKey instanceof Array) { // 设置
  351. if (cssKey instanceof Array) { // 集群
  352. var patternStyle = /^([a-z]+)[\s\t ]*=[\s\t ]*([\w\(=,\s\.#\/\\\'\"\-\)]+)$/i;
  353. var key = '', value = '';
  354. for (var i = 0; i < cssKey.length; i ++) {
  355. if (patternStyle.test(cssKey[i])) {
  356. key = patternStyle.exec(cssKey[i])[1];
  357. value = patternStyle.exec(cssKey[i])[2];
  358. this.css(key, value);
  359. }
  360. }
  361. } else { // 单一
  362. for (var i = 0; i < this.elements.length; i ++) {
  363. if (typeof this.elements[i].style[cssKey] != 'undefined') {
  364. this.elements[i].style[cssKey] = cssValue;
  365. }
  366. }
  367. }
  368. } else { // 获取
  369. var css = [], style = '';
  370. for (var i = 0; i < this.elements.length; i ++) {
  371. if (typeof (style = Tool.getStyle(cssKey, this.elements[i])) != 'undefined') css.push(style);
  372. }
  373. switch (css.length) {
  374. case 0 :
  375. return this;
  376. break;
  377. case 1 :
  378. return css[0];
  379. break;
  380. default :
  381. return css;
  382. break;
  383. }
  384. }
  385. return this;
  386. };
  387.  
  388. // 添加 class 选择器
  389. Base.prototype.addClass = function (className) {
  390. if (className instanceof Array) { // 集群
  391. for (var i = 0; i < className.length; i ++) {
  392. this.addClass(className[i]);
  393. }
  394. } else { // 单一
  395. var space = '';
  396. for (var i = 0; i < this.elements.length; i ++) {
  397. space = this.elements[i].className != '' ? ' ' : space;
  398. if (!Base.hasClass(className, this.elements[i])) this.elements[i].className += space + className;
  399. }
  400. }
  401. return this;
  402. };
  403.  
  404. // 移除 class 选择器
  405. Base.prototype.removeClass = function (className) {
  406. if (className instanceof Array) { // 集群
  407. for (var i = 0; i < className.length; i ++) {
  408. this.removeClass(className[i]);
  409. }
  410. } else { // 单一
  411. var node = null;
  412. for (var i = 0; i < this.elements.length; i ++) {
  413. node = this.elements[i];
  414. if (Base.hasClass(className, node)) {
  415. node.className = node.className.replace(new RegExp('(^|\\s+)' + className + '(\\s+|$)'), ' ');
  416. node.className = Base.trim(node.className);
  417. }
  418. }
  419. }
  420. return this;
  421. };
  422.  
  423. // 添加样式规则
  424. Base.prototype.addRule = function (ruleName, ruleText, rulePosition, sheetIndex) {
  425. if (ruleName instanceof Array) { // 集群
  426. if (!(ruleText instanceof Array) || ruleName.length != ruleText.length) return this;
  427. for (var i = 0; i < ruleName.length; i ++) {
  428. if (ruleName[i] && ruleText[i]) this.addRule(ruleName[i], ruleText[i], rulePosition, sheetIndex);
  429. }
  430. } else { // 单一
  431. var rule = Base.checkRule(rulePosition, sheetIndex);
  432. if (typeof rule.sheet != 'undefined') {
  433. var nameTotal = Tool.ruleNameTotal(rule.sheet);
  434. for (var i = 0; i < nameTotal.length; i ++) {
  435. if (nameTotal[i] == ruleName) return this;
  436. }
  437. Tool.addRule(rule.sheet, ruleName, ruleText, rule.position);
  438. }
  439. }
  440. return this;
  441. };
  442.  
  443. // 移除样式规则
  444. Base.prototype.removeRule = function (rulePosition, ruleNumber, sheetIndex) {
  445. var rule = Base.checkRule(rulePosition, sheetIndex, ruleNumber);
  446. if (typeof rule.sheet != 'undefined') {
  447. for (var i = 0; i < rule.number; i ++) {
  448. Tool.removeRule(rule.sheet, rule.position);
  449. }
  450. }
  451. return this;
  452. };
  453.  
  454. // 节点事件绑定
  455. Base.prototype.nodeEvent = function (eventName, method, mode) {
  456. if (typeof eventName != 'string' || typeof method != 'function') return this;
  457. eventName = eventName.toLowerCase();
  458. if (eventName.indexOf('on') == 0) eventName = eventName.substring(2, eventName.length);
  459. if (typeof mode == 'undefined') mode = true;
  460. for (var i = 0; i < this.elements.length; i ++) {
  461. switch (eventName) {
  462. case 'mousewheel' :
  463. Tool.mousewheel(this.elements[i], method, mode);
  464. break;
  465. default :
  466. mode ? Tool.loginEvent(this.elements[i], eventName, method) : Tool.logoutEvent(this.elements[i], eventName, method);
  467. }
  468. }
  469. return this;
  470. };
  471.  
  472. // HTML DOM 加载
  473. Base.prototype.htmlLoaded = function (method) {
  474. if (typeof method == 'function') Tool.htmlLoaded(method);
  475. return this;
  476. };
  477.  
  478. // 加载特效插件
  479. Base.prototype.plugins = function (pluginName, pluginMethod) {
  480. if (pluginName instanceof Array) { // 集群
  481. if (!(pluginMethod instanceof Array) || pluginName.length != pluginMethod.length) return false;
  482. for (var i = 0; i < pluginName.length; i ++) {
  483. this.plugins(pluginName[i], pluginMethod[i]);
  484. }
  485. } else { // 单一
  486. if (typeof pluginName == 'string' && typeof pluginMethod == 'function') {
  487. Base.prototype[pluginName] = pluginMethod;
  488. }
  489. }
  490. return this;
  491. };
  492.  
  493. /*
  494. 库方法集合
  495. */
  496. // 库方法: 清除两边空格
  497. Base.trim = function (string) {
  498. if (typeof string != 'string') return string;
  499. var patternLeft = /^[\s\t ]+/;
  500. var patternRight = /[\s\t ]+$/;
  501. if (patternLeft.test(string)) string = string.replace(patternLeft, '');
  502. if (patternRight.test(string)) string = string.replace(patternRight, '');
  503. return string;
  504. };
  505.  
  506. // 库方法: 检测样式规则
  507. Base.checkRule = function (rulePosition, sheetIndex, ruleNumber) {
  508. if (typeof rulePosition != 'number') rulePosition = 0;
  509. if (typeof sheetIndex != 'number') sheetIndex = 0;
  510. if (typeof ruleNumber != 'number') ruleNumber = 1;
  511. var sheetObject = undefined;
  512. var sheetTotal = document.styleSheets.length;
  513. if (sheetTotal != 0 && sheetIndex <= (sheetTotal - 1)) { // 兼容 IE 6/7/8 防止 unknown
  514. sheetObject = document.styleSheets[sheetIndex];
  515. }
  516. if (typeof sheetObject != 'undefined') {
  517. var ruleTotal = Tool.ruleTotal(sheetObject);
  518. if (rulePosition > ruleTotal) rulePosition = ruleTotal;
  519. var maxNumber = ruleTotal - rulePosition;
  520. if (ruleNumber > maxNumber) ruleNumber -= ruleNumber - maxNumber;
  521. }
  522. return {
  523. position : rulePosition,
  524. sheet : sheetObject,
  525. number : ruleNumber
  526. }
  527. };
  528.  
  529. // 库方法: 检测 class
  530. Base.hasClass = function (className, elementNode) {
  531. return (new RegExp('(^|\\s+)' + className + '(\\s+|$)')).test(elementNode.className);
  532. }
  533.  
  534. // 库方法: 元素节点定位器(局部搜索)
  535. Base.positioner = function (positioner) {
  536. if (typeof positioner != 'string') return false;
  537. var nodes = [];
  538. var patternId = /^id\s*=\s*([\w\-]+)$/i;
  539. var patternTag = /^tag(Name)?\s*=\s*([a-z]+)$/i;
  540. var patternClass = /^class(Name)?\s*=\s*([\w\-]+)$/i;
  541. if (patternTag.test(positioner)) { // tagName
  542. positioner = patternTag.exec(positioner)[2];
  543. nodes = $().getTagName(positioner).getNodes();
  544. } else if (patternClass.test(positioner)) { // class
  545. positioner = patternClass.exec(positioner)[2];
  546. nodes = $().getClass(positioner).getNodes();
  547. } else if (patternId.test(positioner)) { // id
  548. positioner = patternId.exec(positioner)[1];
  549. nodes = $().getId(positioner).getNodes();
  550. } else { // id
  551. nodes = $().getId(positioner).getNodes();
  552. }
  553. if (nodes == $().info) return false;
  554. return nodes;
  555. };
  556.  
  557. // 库方法: 获取元素从属关系(直接从属)
  558. Base.hasChild = function (elementNode, targetNode) {
  559. var childs = targetNode.childNodes;
  560. for (var i = 0; i < childs.length; i ++) {
  561. if (childs[i].nodeType == 1 && childs[i] == elementNode) return true;
  562. }
  563. return false;
  564. };
  565.  
  566. // 库方法: 清除空白节点
  567. Base.clear = function (elementNode) {
  568. var childs = elementNode.childNodes;
  569. var length = childs.length;
  570. for (var i = (length - 1); i >= 0; i --) {
  571. if (childs[i].nodeType == 3 && /^[\s\t ]+$/.test(childs[i].nodeValue)) elementNode.removeChild(childs[i]);
  572. }
  573. return elementNode;
  574. };
  575.  
  576. // 库方法: 清除注释节点
  577. Base.comment = function (elementNode) {
  578. var childs = elementNode.childNodes;
  579. var length = childs.length;
  580. for (var i = (length - 1); i >= 0; i --) {
  581. if (childs[i].nodeType == 8) {
  582. elementNode.removeChild(childs[i]);
  583. }
  584. }
  585. return elementNode;
  586. };
  587.  
  588. // 库方法: 字符串删减
  589. Base.replace = function (string, index) {
  590. if (typeof string != 'string') return string;
  591. if (string.indexOf(index) != -1) string = string.replace(new RegExp(index, 'ig'), '');
  592. return string;
  593. };
  594.  
  595. // 库方法: 添加元素节点
  596. Base.addElement = function (elementName, attributes, html, targetNode) {
  597. var elementNode = document.createElement(elementName);
  598. if (typeof attributes == 'string' || attributes instanceof Array) this.addAttribute(attributes, elementNode);
  599. if (typeof html != 'undefined') $(elementNode).html(html);
  600. if (typeof targetNode != 'undefined') {
  601. if (!(typeof targetNode == 'object' || targetNode.nodeType == 1)) {
  602. if (!(targetNode = this.positioner(targetNode))) targetNode = document.body;
  603. }
  604. } else {
  605. targetNode = document.body;
  606. }
  607. if (targetNode instanceof Array) { // 集群
  608. for (var i = 0; i < targetNode.length; i ++) {
  609. targetNode[i].appendChild(elementNode.cloneNode(true));
  610. }
  611. } else { // 单一
  612. targetNode.appendChild(elementNode);
  613. }
  614. return elementNode;
  615. };
  616.  
  617. // 库方法: 添加属性节点
  618. Base.addAttribute = function (attributes, elementNode) {
  619. if (attributes instanceof Array) { // 集群
  620. for (var i = 0; i < attributes.length; i ++) {
  621. this.addAttribute(attributes[i], elementNode);
  622. }
  623. } else { // 单一
  624. if (typeof attributes != 'string') return false;
  625. var patternAttribute = /^([a-z]+)[\s\t ]*=[\s\t ]*([\w,\(#=:\s\.\/\\\'\";\-\)]+)$/i;
  626. var key = '', value = '';
  627. if (patternAttribute.test(attributes)) {
  628. key = patternAttribute.exec(attributes)[1];
  629. value = patternAttribute.exec(attributes)[2];
  630. var patternClass = /^class(Name)?$/i, className = [];
  631. if (key == 'style') { // CSS
  632. this.style(value, elementNode);
  633. } else if (patternClass.test(key)) { // class
  634. this.addClass(value, elementNode);
  635. } else {
  636. elementNode.setAttribute(key, value);
  637. }
  638. }
  639. }
  640. };
  641.  
  642. // 库方法: CSS 处理
  643. Base.style = function (css, elementNode) {
  644. var split = /;[\s\t ]*/i;
  645. if (split.test(css)) { // 集群
  646. css = css.split(split);
  647. for (var i = 0; i < css.length; i ++) {
  648. this.style(css[i], elementNode);
  649. }
  650. } else { // 单一
  651. var patternCSS = /^([a-z]+)[\s\t ]*:[\s\t ]*([\w\(=\s\.,\/\\\'#\"\-\)]+)$/i, cssKey = '', cssValue = '';
  652. if (patternCSS.test(css)) {
  653. cssKey = patternCSS.exec(css)[1];
  654. cssValue = patternCSS.exec(css)[2];
  655. $(elementNode).css(cssKey, cssValue);
  656. }
  657. }
  658. };
  659.  
  660. // 库方法: class 处理
  661. Base.addClass = function (className, elementNode) {
  662. var split = /[\s\t ]+/;
  663. if (split.test(className)) {
  664. className = className.split(split);
  665. for (var i = 0; i < className.length; i ++) {
  666. this.addClass(className[i], elementNode);
  667. }
  668. } else {
  669. $(elementNode).addClass(className);
  670. }
  671. };
  672.  
  673. // 库方法: 移除元素节点
  674. Base.removeElement = function (elementNode, targetNode) {
  675. if (!(typeof elementNode == 'object' || elementNode.nodeType == 1)) {
  676. if (!(elementNode = this.positioner(elementNode))) return false;
  677. }
  678. if (typeof targetNode == 'undefined' || !(typeof targetNode == 'object' || targetNode.nodeType == 1)) {
  679. if (!(targetNode = this.positioner(targetNode))) targetNode = document.body;
  680. }
  681. if (targetNode instanceof Array) { // 集群
  682. for (var i = 0; i < targetNode.length; i ++) {
  683. this.removeElement(elementNode, targetNode[i]);
  684. }
  685. } else { // 单一
  686. if (elementNode instanceof Array) { // 集群
  687. for (var i = 0; i < elementNode.length; i ++) {
  688. this.removeElement(elementNode[i], targetNode);
  689. }
  690. } else { // 单一
  691. if (this.hasChild(elementNode, targetNode)) targetNode.removeChild(elementNode);
  692. }
  693. }
  694. };
  695.  
  696. // 库方法: 初始化滚动条
  697. Base.initializationScroll = function () {
  698. Tool.scrollLeft(0);
  699. Tool.scrollTop(0);
  700. };
  701.  
  702. // 库方法: 设置与获取滚动条
  703. Base.scroll = function (x, y) {
  704. if (typeof x != 'number' && typeof y != 'number') { // 获取
  705. return {
  706. x : Tool.scrollLeft(),
  707. y : Tool.scrollTop()
  708. }
  709. }
  710. if (typeof x == 'number') { // 设置x轴
  711. Tool.scrollLeft(x);
  712. }
  713. if (typeof y == 'number') { // 设置y轴
  714. Tool.scrollTop(y);
  715. }
  716. };
  717.  
  718. // 库方法: 获取网页可视区尺寸
  719. Base.getWindowRectangle = function () {
  720. return {
  721. width : Tool.getWindowWidth(),
  722. height : Tool.getWindowHeight()
  723. }
  724. };
  725.  
  726. // 库方法: 获取元素尺寸
  727. Base.getInnerRectangle = function (elementNode) {
  728. var width = 0, height = 0, display = '', _this = null;
  729. _this = $(elementNode);
  730. display = _this.css('display');
  731. width = _this.css('width');
  732. height = _this.css('height');
  733. if (width == 'auto' || height == 'auto') { // IE 6/7/8
  734. if (display == 'none') _this.show();
  735. width = elementNode.offsetWidth;
  736. height = elementNode.offsetHeight;
  737. }
  738. width = this.replace(width, 'px');
  739. height = this.replace(height, 'px');
  740. return {
  741. width : width,
  742. height : height
  743. };
  744. };
  745.  
  746. // 库方法: 获取元素外边距尺寸
  747. Base.getOuterRectangle = function (elementNode) {
  748. this.absolute(elementNode);
  749. var left = 0, top = 0, display = '', _this = null;
  750. _this = $(elementNode);
  751. display = _this.css('display');
  752. left = _this.css('left');
  753. top = _this.css('top');
  754. if (left == 'auto' || top == 'auto') { // IE 6/7/8
  755. if (display == 'none') _this.show();
  756. left = elementNode.offsetLeft;
  757. top = elementNode.offsetTop;
  758. }
  759. left = this.replace(left, 'px');
  760. top = this.replace(top, 'px');
  761. return {
  762. left : left,
  763. top : top
  764. };
  765. };
  766.  
  767. // 库方法: 设置元素绝对定位
  768. Base.absolute = function (elementNode) {
  769. var _this = $(elementNode);
  770. if (_this.css('position') != 'absolute') _this.css(['position = absolute', 'left = 0', 'top = 0']);
  771. };
  772.  
  773. // 库方法: 固定锁屏区域(修正浏览器Bug)
  774. Base.fixed = function () {
  775. // IE Bug 修正
  776. var down = function () {
  777. var move = function (event) {
  778. event.preventDefault();
  779. };
  780. var up = function () {
  781. $('#screen').nodeEvent('mousemove', move, false);
  782. $('#screen').nodeEvent('mouseup', up, false);
  783. };
  784. $('#screen').nodeEvent('mousemove', move);
  785. $('#screen').nodeEvent('mouseup', up);
  786. };
  787. $('#screen').nodeEvent('mousedown', down);
  788. // Chrome Bug 修改
  789. $('#screen').nodeEvent('mousewheel', function (event) {
  790. event.preventDefault();
  791. });
  792. };
  1. /*
  2. 源码作者: 石不易(Louis Shi)
  3. 联系方式: http://www.shibuyi.net
  4. ===================================================================================================
  5. 程序名称: JavaScript 工具库(跨浏览器兼容) BETA 3.0 版
  6. 迭代版本: BETA 2.0
  7. 功能总数: 18 个
  8. 新增总数: 2 个
  9. 删除总数: 0 个
  10. 追加功能:
  11. 1. 新增“跨浏览器获取样式规则名称集合”
  12. 2. 新增“跨浏览器 HTML DOM 加载”
  13. 优化功能:
  14. 1. 优化跨浏览器滚动条设置与获取至“scrollLeft”和“scrollTop”方法中
  15. 删除功能:

  16. */
  17.  
  18. // 工具库
  19. var Tool = {
  20. // 数组排序
  21. sort : {
  22. minToMax : function (min, max) {
  23. if (min < max) {
  24. return -1;
  25. } else if (min > max) {
  26. return 1;
  27. } else {
  28. return 0;
  29. }
  30. },
  31. maxToMin : function (min, max) {
  32. if (min < max) {
  33. return 1;
  34. } else if (min > max) {
  35. return -1;
  36. } else {
  37. return 0;
  38. }
  39. }
  40. },
  41.  
  42. // 跨浏览器获取计算后的样式
  43. getStyle : function (cssKey, elementNode) {
  44. if (typeof window.getComputedStyle != 'undefined') { // W3C
  45. return window.getComputedStyle(elementNode, null)[cssKey];
  46. } else if (typeof elementNode.currentStyle != 'undefined') { // IE 6/7/8
  47. return elementNode.currentStyle[cssKey];
  48. }
  49. },
  50.  
  51. // 跨浏览器获取样式规则总数
  52. ruleTotal : function (sheetObject) {
  53. if (typeof sheetObject.cssRules != 'undefined') { // W3C
  54. return sheetObject.cssRules.length;
  55. } else if (typeof sheetObject.rules != 'undefined') { // IE 6/7/8
  56. return sheetObject.rules.length;
  57. }
  58. },
  59.  
  60. // 跨浏览器获取样式规则名称集合
  61. ruleNameTotal : function (sheetObject) {
  62. var nameTotal = [];
  63. if (typeof sheetObject.cssRules != 'undefined') { // W3C
  64. for (var i = 0; i < sheetObject.cssRules.length; i ++) {
  65. nameTotal.push(sheetObject.cssRules[i].selectorText);
  66. }
  67. } else if (typeof sheetObject.rules != 'undefined') { // IE 6/7/8
  68. for (var i = 0; i < sheetObject.rules.length; i ++) {
  69. nameTotal.push(sheetObject.rules[i].selectorText);
  70. }
  71. }
  72. return nameTotal;
  73. },
  74.  
  75. // 跨浏览器添加样式规则
  76. addRule : function (sheetObject, ruleName, ruleText, rulePosition) {
  77. if (typeof sheetObject.insertRule != 'undefined') { // W3C
  78. sheetObject.insertRule(ruleName + ' {' + ruleText + '}', rulePosition);
  79. } else if (typeof sheetObject.addRule != 'undefined') { // IE 6/7/8
  80. sheetObject.addRule(ruleName, ruleText, rulePosition);
  81. }
  82. },
  83.  
  84. // 跨浏览器移除样式规则
  85. removeRule : function (sheetObject, rulePosition) {
  86. if (typeof sheetObject.deleteRule != 'undefined') { // W3C
  87. sheetObject.deleteRule(rulePosition);
  88. } else if (typeof sheetObject.removeRule != 'undefined') { // IE 6/7/8
  89. sheetObject.removeRule(rulePosition);
  90. }
  91. },
  92.  
  93. // IE 6/7/8 事件对象匹配模式
  94. eventMatch : function (event) {
  95. event.target = event.srcElement;
  96. event.stopPropagation = function () {
  97. event.cancelBubble = true;
  98. };
  99. event.preventDefault = function () {
  100. event.returnValue = false;
  101. };
  102. return event;
  103. },
  104.  
  105. // 事件绑定唯一标识符
  106. eventId : 0,
  107.  
  108. // 跨浏览器现代事件绑定: 注册事件
  109. loginEvent : function (elementNode, eventName, method) {
  110. if (typeof elementNode.addEventListener != 'undefined') { // W3C
  111. elementNode.addEventListener(eventName, method, false);
  112. } else if (typeof elementNode.attachEvent != 'undefined') { // IE 6/7/8
  113. if (typeof elementNode.hashTable != 'object') elementNode.hashTable = {};
  114. if (typeof elementNode.hashTable[eventName] != 'object') elementNode.hashTable[eventName] = [];
  115. var events = elementNode.hashTable[eventName];
  116. for (var i = 0; i < events.length; i ++) {
  117. if (events[i] == method) return false;
  118. }
  119. events[this.eventId ++] = method;
  120. var _this = this;
  121. elementNode['on' + eventName] = function () {
  122. var event = _this.eventMatch(window.event);
  123. for (var i = 0; i < events.length; i ++) {
  124. if (typeof events[i] == 'function') events[i].call(this, event);
  125. }
  126. };
  127. }
  128. },
  129.  
  130. // 跨浏览器现代事件绑定: 注销事件
  131. logoutEvent : function (elementNode, eventName, method) {
  132. if (typeof elementNode.removeEventListener != 'undefined') { // W3C
  133. elementNode.removeEventListener(eventName, method, false);
  134. } else if (typeof elementNode.detachEvent != 'undefined') { // IE 6/7/8
  135. if (typeof elementNode.hashTable == 'object' && typeof elementNode.hashTable[eventName] == 'object') {
  136. var events = elementNode.hashTable[eventName];
  137. for (var i = 0; i < events.length; i ++) {
  138. if (events[i] == method) delete events[i];
  139. }
  140. }
  141. }
  142. },
  143.  
  144. // 跨浏览器鼠标滚轮事件
  145. mousewheel : function (elementNode, method, mode) {
  146. if (elementNode == window) elementNode = document; // IE 6/7/8
  147. if (typeof elementNode.onmousewheel != 'undefined') { // Not Firefox
  148. mode ? this.loginEvent(elementNode, 'mousewheel', method) : this.logoutEvent(elementNode, 'mousewheel', method);
  149. } else { // Firefox
  150. mode ? this.loginEvent(elementNode, 'DOMMouseScroll', method) : this.logoutEvent(elementNode, 'DOMMouseScroll', method);
  151. }
  152. },
  153.  
  154. // 跨浏览器 HTML DOM 加载
  155. htmlLoaded : function (method) {
  156. if ((browserDetect.opera && browserDetect.browser.version < 9)
  157. ||
  158. (browserDetect.firefox && browserDetect.browser.version < 3)
  159. ||
  160. (browserDetect.engine.name == 'WebKit' && browserDetect.engine.version < 525)) { // low version W3C
  161. var timer = setTimeout(function () {
  162. clearTimeout(timer);
  163. /interactive|loading|complete/i.test(document.readyState) ? method() : timer = setTimeout(arguments.callee, 1);
  164. }, 1);
  165. } else if (!browserDetect.ie || browserDetect.browser.version > 8) { // current W3C
  166. var _this = this;
  167. this.loginEvent(document, 'DOMContentLoaded', function () {
  168. _this.logoutEvent(document, 'DOMContentLoaded', arguments.callee);
  169. method();
  170. });
  171. } else if (browserDetect.ie && browserDetect.browser.version < 9) { // IE 6/7/8
  172. var timer = setTimeout(function () {
  173. try {
  174. clearTimeout(timer);
  175. document.documentElement.doScroll('top');
  176. method();
  177. } catch (error) {
  178. timer = setTimeout(arguments.callee, 1);
  179. }
  180. }, 1);
  181. }
  182. },
  183.  
  184. // 跨浏览器获取元素从属关系(间接从属+直接从属)
  185. getContains : function (elementNode, targetNode) {
  186. if (typeof targetNode.compareDocumentPosition != 'undefined') { // W3C
  187. return targetNode.compareDocumentPosition(elementNode) == 20;
  188. } else if (typeof targetNode.contains != 'undefined') { // IE 6/7/8
  189. return targetNode.contains(elementNode);
  190. }
  191. },
  192.  
  193. // 跨浏览器获取与设置滚动条x轴
  194. scrollLeft : function (x) {
  195. if (browserDetect.engine.name == 'WebKit') { // Chrome / Safari
  196. if (typeof x != 'undefined') { // 设置
  197. document.body.scrollLeft = x;
  198. } else { // 获取
  199. return document.body.scrollLeft;
  200. }
  201. } else { // Not Chrome / Safari
  202. if (typeof x != 'undefined') { // 设置
  203. document.documentElement.scrollLeft = x;
  204. } else { // 获取
  205. return document.documentElement.scrollLeft;
  206. }
  207. }
  208. },
  209.  
  210. // 跨浏览器获取与控制滚动条y轴
  211. scrollTop : function (y) {
  212. if (browserDetect.engine.name == 'WebKit') { // Chrome / Safari
  213. if (typeof y != 'undefined') { // 设置
  214. document.body.scrollTop = y;
  215. } else { // 获取
  216. return document.body.scrollTop;
  217. }
  218. } else { // Not Chrome / Safari
  219. if (typeof y != 'undefined') { // 设置
  220. document.documentElement.scrollTop = y;
  221. } else { // 获取
  222. return document.documentElement.scrollTop;
  223. }
  224. }
  225. },
  226.  
  227. // 跨浏览器获取网页x轴可视区域尺寸
  228. getWindowWidth : function () {
  229. if (typeof window.innerWidth != 'undefined') { // W3C
  230. return window.innerWidth;
  231. } else if (typeof document.documentElement.clientWidth != 'undefined') { // IE 6/7/8
  232. return document.documentElement.clientWidth;
  233. }
  234. },
  235.  
  236. // 跨浏览器获取网页y轴可视区域尺寸
  237. getWindowHeight : function () {
  238. if (typeof window.innerHeight != 'undefined') { // W3C
  239. return window.innerHeight;
  240. } else if (typeof document.documentElement.clientHeight) { // IE 6/7/8
  241. return document.documentElement.clientHeight;
  242. }
  243. },
  244.  
  245. // IE 专属: 浏览器外捕获鼠标按下
  246. setCaptureIE : function (elementNode) {
  247. if (typeof elementNode.setCapture != 'undefined') { // IE
  248. elementNode.setCapture();
  249. }
  250. },
  251.  
  252. // IE 专属: 浏览器外捕获鼠标弹起
  253. releaseCaptureIE : function (elementNode) {
  254. if (typeof elementNode.releaseCapture != 'undefined') { // IE
  255. elementNode.releaseCapture();
  256. }
  257. }
  258.  
  259. };
 /*
源码作者: 石不易(Louis Shi)
联系方式: http://www.shibuyi.net
===================================================================================================
程序名称: 浏览器嗅探器 BETA 3.0
版本迭代: 无
功能总数: 4 个
功能介绍:
1. 支持浏览器品牌嗅探
2. 支持浏览器名称/版本嗅探
3. 支持浏览器引擎名称/版本嗅探
4. 支持浏览器隶属平台名称/版本嗅探
*/
(function () {
window.browserDetect = {
ie : false,
firefox : false,
chrome : false,
safari : false,
opera : false,
other : false, browser : {
name : '',
version : ''
},
engine : {
name : '',
version : ''
},
system : {
name : '',
version : ''
}
}; var info = navigator.userAgent;
var system = navigator.platform; /*
Browser pattern
*/
// check IE
var patternIE = /MSIE\s([\d\.]+)/i;
var patternHighIE = /rv:([\d\.]+)/i;
// check Firefox
var patternFirefox = /Firefox\/([\d\.]+)/i;
// check Chrome
var patternChrome = /Chrome\/([\d\.]+)/i;
// check Safari
var patternSafari = /Safari\/([\d\.]+)/i;
// check Opera
var patternOpera = /Opera\/([\d\.]+)/i; /*
Engine pattern
*/
// check Trident
var patternTrident = /Trident\/([\d\.]+)/i;
// check Gecko
var patternGecko = /Gecko\/(\d+)/i;
// check WebKit
var patternWebKit = /AppleWebKit\/([\d\.]+)/i;
// check Presto
var patternPresto = /Presto\/([\d\.]+)/i; /*
System pattern
*/
// check Windows
var patternWindows = /Windows\sNT\s([\d\.]+)/i;
var patternWin = /Win/i;
// check Linux
var patternLinux = /Linux/i;
// check Unix
var patternUnix = /X11/i;
// check Mac
var patternMac = /Mac/i; /*
Check browser
*/
if ((low = patternIE.test(info)) || (high = patternTrident.test(info))) { // IE
browserDetect.ie = true;
browserDetect.browser.name = 'Internet Explorer';
browserDetect.engine.name = 'Trident';
if (low) { // IE 6 - 10
browserDetect.browser.version = parseFloat(patternIE.exec(info)[1]);
} else if (high) { // IE 11+
browserDetect.browser.version = parseFloat(patternHighIE.exec(info)[1]);
}
if (browserDetect.browser.version >= 6.0) {
switch (browserDetect.browser.version) { // engine version
case 6.0 :
browserDetect.engine.version = 2.0;
break;
case 7.0 :
browserDetect.engine.version = 3.0;
break;
default :
browserDetect.engine.version = parseFloat(patternTrident.exec(info)[1]);
}
} else {
browserDetect.engine.version = '2.0-';
}
} else if (patternFirefox.test(info)) { // Firefox
browserDetect.firefox = true;
browserDetect.browser.name = 'Firefox';
browserDetect.browser.version = parseFloat(patternFirefox.exec(info)[1]);
} else if (patternChrome.test(info)) { // Chrome
browserDetect.chrome = true;
browserDetect.browser.name = 'Chrome';
browserDetect.browser.version = parseFloat(patternChrome.exec(info)[1]);
} else if (patternSafari.test(info)) { // Safari
browserDetect.safari = true;
browserDetect.browser.name = 'Safari';
var patternVersion = /Version\/([\d\.]+)/i;
if (patternVersion.test(info)) { // high version
browserDetect.browser.version = parseFloat(patternVersion.exec(info)[1]);
} else { // low version
browserDetect.browser.version = parseFloat(patternSafari.exec(info)[1]);
}
} else if (patternOpera.test(info)) { // Opera
browserDetect.opera = true;
browserDetect.browser.name = 'Opera';
var patternVersion = /Version\/([\d\.]+)/i;
if (patternVersion.test(info)) { // high version
browserDetect.browser.version = parseFloat(patternVersion.exec(info)[1]);
} else { // low version
browserDetect.browser.version = parseFloat(patternOpera.exec(info)[1]);
}
} else { // Other
browserDetect.other = true;
browserDetect.browser.name = 'Other';
browserDetect.browser.version = 'Unknown';
} /*
Check Engine
*/
if (patternTrident.test(info)) { // Trident
browserDetect.engine.name = 'Trident';
browserDetect.engine.version = parseFloat(patternTrident.exec(info)[1]);
} else if (patternGecko.test(info)) { // Gecko
browserDetect.engine.name = 'Gecko';
var patternVersion = /rv:([\d\.]+)/i;
if (patternVersion.test(info)) { // high version
browserDetect.engine.version = parseFloat(patternVersion.exec(info)[1]);
} else { // low version
browserDetect.engine.version = parseFloat(patternGecko.exec(info)[1]);
}
} else if (patternWebKit.test(info)) { // WebKit
browserDetect.engine.name = 'WebKit';
browserDetect.engine.version = parseFloat(patternWebKit.exec(info)[1]);
} else if (patternPresto.test(info)) { // Presto
browserDetect.engine.name = 'Presto';
browserDetect.engine.version = parseFloat(patternPresto.exec(info)[1]);
} else { // Other
if (browserDetect.other) {
browserDetect.engine.name = 'Other';
browserDetect.engine.version = 'Unknown';
}
} /*
Check System
*/
if (patternWindows.test(info)) { // Windows
browserDetect.system.version = parseFloat(patternWindows.exec(info)[1]);
switch (browserDetect.system.version) {
case 5.0 :
browserDetect.system.name = 'Windows 2000';
break;
case 5.1 :
browserDetect.system.name = 'Windows XP';
break;
case 5.2 :
browserDetect.system.name = 'Windows Server 2003 / Windows Server 2003 R2';
break;
case 6.0 :
browserDetect.system.name = 'Windows Vista / Windows Server 2008';
break;
case 6.1 :
browserDetect.system.name = 'Windows 7 / Windows Server 2008 R2';
break;
case 6.2 :
browserDetect.system.name = 'Windows 8 / Windows Server 2012 / Windows Phone 8';
break
case 6.3 :
browserDetect.system.name = 'Windows 8.1 / Windows Server 2012 R2';
break;
default :
browserDetect.system.name = 'Windows';
}
} else if (patternWin.test(system)) { // Windows(low version browser)
browserDetect.system.name = 'Windows';
browserDetect.system.version = 'Unknown';
} else if (patternLinux.test(system)) { // Linux
browserDetect.system.name = 'Linux';
browserDetect.system.version = 'Unknown';
} else if (patternUnix.test(system)) { // Unix
browserDetect.system.name = 'Unix';
browserDetect.system.version = 'Unknown';
} else if (patternMac.test(system)) { // Mac
browserDetect.system.name = 'Mac';
browserDetect.system.version = 'Unknown';
} else { // Other
browserDetect.system.name = 'Other';
browserDetect.system.version = 'Unknown';
} })();
 /*
源码作者: 石不易(Louis Shi)
联系方式: http://www.shibuyi.net
===================================================================================================
特效插件: 元素隐藏
特效插件: 元素显示
特效插件: 鼠标移入移出(下拉菜单)
*/
$().plugins(['hide', 'show', 'hover'], [function () {
this.css('display', 'none');
return this;
}, function () {
this.css('display', 'block');
return this;
}, function (overMethod, outMethod) {
this.nodeEvent('mouseover', overMethod);
this.nodeEvent('mouseout', outMethod);
return this;
}]);
 /*
源码作者: 石不易(Louis Shi)
联系方式: http://www.shibuyi.net
===================================================================================================
特效插件: 元素居中
*/
$().plugins('center', function () {
var windowRectangle = Base.getWindowRectangle();
var scroll = Base.scroll();
var innerRectangle = null, x = 0, y = 0;
for (var i = 0; i < this.elements.length; i ++) {
Base.absolute(this.elements[i]);
innerRectangle = Base.getInnerRectangle(this.elements[i]);
x = (windowRectangle.width - innerRectangle.width) / 2;
y = (windowRectangle.height - innerRectangle.height) / 2;
if (x < 0) x = 0;
if (y < 0) y = 0;
$(this.elements[i]).css(['left = ' + (x + scroll.x) + 'px', 'top = ' + (y + scroll.y) + 'px']);
}
return this;
});
 /*
源码作者: 石不易(Louis Shi)
联系方式: http://www.shibuyi.net
===================================================================================================
特效插件: 遮罩锁屏
特效插件: 清除遮罩
*/
$().plugins(['lock', 'unlock'], [function () {
var screen = null;
if ((screen = $('#screen').firstNode()) != this.info) {
if (Base.trim($(Base.comment(screen)).html()) != '') {
Base.removeElement(screen);
screen = Base.addElement('div', 'id = screen');
}
} else {
screen = Base.addElement('div', 'id = screen');
}
var scroll = Base.scroll();
$('html').css('overflow', 'hidden');
Base.scroll(scroll.x, scroll.y);
var windowRectangle = Base.getWindowRectangle();
Base.absolute(screen);
$(screen).css([
'width = ' + windowRectangle.width + 'px',
'height = ' + windowRectangle.height + 'px',
'left = ' + scroll.x + 'px',
'top = ' + scroll.y + 'px',
'backgroundColor = black',
'zIndex = 9998',
'opacity = 0.4', // W3C
'filter = alpha(opacity = 40)' // IE 6/7/8
]).show();
Base.fixed(); // 修正 Bug
return this;
}, function () {
var screen = null;
if ((screen = $('#screen').firstNode()) == this.info) return this;
var scroll = Base.scroll();
$('html').css('overflow', 'auto');
Base.scroll(scroll.x, scroll.y);
$(screen).hide();
return this;
}]);
 /*
源码作者: 石不易(Louis Shi)
联系方式: http://www.shibuyi.net
===================================================================================================
特效插件: 元素拖拽
*/
$().plugins('drag', function () {
var selector = null, childs = [];
for (var j = 0; j < this.elements.length; j ++) {
if (arguments.length != 0) {
for (var i = 0; i < arguments.length; i ++) {
if ((selector = $(this.elements[j]).selector(arguments[i]).getNodes()) == this.info) continue;
childs.push(selector);
}
}
if (childs.length == 0) childs.push(this.elements[j]);
var targetNode = this.elements[j];
Base.absolute(targetNode);
var down = function (event) {
var scroll = Base.scroll();
var outerRectangle = Base.getOuterRectangle(targetNode);
var fixedX = (event.clientX + scroll.x) - outerRectangle.left;
var fixedY = (event.clientY + scroll.y) - outerRectangle.top;
var windowRectangle = Base.getWindowRectangle();
var innerRectangle = Base.getInnerRectangle(targetNode);
Tool.setCaptureIE(targetNode); // 兼容 IE Bug
var move = function (event) {
var x = (event.clientX + scroll.x) - fixedX;
var y = (event.clientY + scroll.y) - fixedY;
var minX = scroll.x, minY = scroll.y, maxX = 0, maxY = 0;
maxX = (windowRectangle.width + scroll.x) - innerRectangle.width;
maxY = (windowRectangle.height + scroll.y) - innerRectangle.height;
if (x < minX) x = minX; else if (x > maxX) x = maxX;
if (y < minY) y = minY; else if (y > maxY) y = maxY;
$(targetNode).css(['left = ' + x + 'px', 'top = ' + y + 'px']);
};
var up = function () {
Tool.releaseCaptureIE(targetNode); // 兼容 IE Bug
$(document).nodeEvent('mousemove', move, false);
$(document).nodeEvent('mouseup', up, false);
};
$(document).nodeEvent('mousemove', move);
$(document).nodeEvent('mouseup', up);
};
for (var k = 0; k < childs.length; k ++) {
if (childs[k] instanceof Array) { // 集群
for (var l = 0; l < childs[k].length; l ++) {
$(childs[k][l]).nodeEvent('mousedown', down);
}
} else { // 单一
$(childs[k]).nodeEvent('mousedown', down);
}
}
}
return this;
});
 /*
源码作者: 石不易(Louis Shi)
联系方式: http://www.shibuyi.net
===================================================================================================
特效插件: 禁止元素溢出可视区
*/
$().plugins('overflow', function () {
var windowRectangle = Base.getWindowRectangle();
var scroll = Base.scroll();
var minX = scroll.x, minY = scroll.y, maxX = 0, maxY = 0, x = 0, y = 0;
var innerRectangle = null, outerRectangle = null;
for (var i = 0; i < this.elements.length; i ++) {
Base.absolute(this.elements[i]);
innerRectangle = Base.getInnerRectangle(this.elements[i]);
outerRectangle = Base.getOuterRectangle(this.elements[i]);
x = outerRectangle.left;
y = outerRectangle.top;
maxX = (windowRectangle.width + scroll.x) - innerRectangle.width;
maxY = (windowRectangle.height + scroll.y) - innerRectangle.height;
if (x < minX) x = minX; else if (x > maxX) x = maxX;
if (y < minY) y = minY; else if (y > maxY) y = maxY;
$(this.elements[i]).css(['left = ' + x + 'px', 'top = ' + y + 'px']);
}
return this;
});

关于 BETA 3.0 原型版核心源码与实例演示的获取请移动至官网下载!

 

感谢大家积极评测给予意见!

官网地址:http://www.shibuyi.net

CNBlogs 博客:http://www.cnblogs.com/shibuyi/

CSDN 博客:http://blog.csdn.net/louis_shi/

ITeye 博客:http://shibuyi.iteye.com/

【JavaScript 封装库】BETA 3.0 测试版发布!的更多相关文章

  1. 【JavaScript 封装库】BETA 4.0 测试版发布!

    /* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...

  2. 【JavaScript 封装库】BETA 2.0 测试版发布!

    /* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...

  3. 【JavaScript 封装库】BETA 1.0 测试版发布!

    /* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...

  4. 【JavaScript 封装库】BETA 5.0 测试版发布!

    JavaScript 前端框架(封装库) BETA 5.0 已于10月10日正式发布,今天开始提供 BETA 5.0 的 API 参考文献.相较于之前 5 个版本的发布都是草草的提供源代码,并没有很多 ...

  5. 【JavaScript 封装库】Prototype 原型版发布!

    /* 源码作者: 石不易(Louis Shi) 联系方式: http://www.shibuyi.net =============================================== ...

  6. Android Q Beta 6 终极测试版发布!

    前言 当今手机市场可谓是百花齐放,但手机系统却屈指可数,其中Android和iOS就占据了整个手机系统市场的99%,单单Android就占据了整个手机系统市场的86%,可谓是占据绝对优势.     其 ...

  7. Cocos3.0测试版发布(中文)

    最新的cocos2d-x 3.0版本,我们的目标不仅是改进渲染机制,增加对2.5D的支持,基于组件的系统功能,和更好的Label功能.同时 我们希望能够进一步优化引擎,并且使用更友好的C++ API ...

  8. MongoDB 可视化管理工具 MongoCola-1.1.0 测试版发布

    首先,感谢大家对于本工具的支持. 经过一周的努力,最新版的工具测试版出炉了,这个版本是一个很重要的版本. 为什么说这个版本重要?以前的工具,只支持一个视图窗口,也就是说了,一次只能看一个数据集的数据. ...

  9. 第一百三十节,JavaScript,封装库--连缀

    JavaScript,封装库--连缀 学习要点: 1.连缀介绍 2.改写库对象 本章我们重点来介绍,在调用库的时候,我们需要能够在前台调用的时候可以同时设置多个操作,比如设置CSS,设置innerHT ...

随机推荐

  1. sql函数将1,2,3转换为表

    /****** Object: UserDefinedFunction [dbo].[splitstring_to_table] Script Date: 2017/7/11 9:35:58 **** ...

  2. 事务背书 ACID, CAP, BASE

    A atomicity 原子性 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成, C consistency 一致性 在事务开始之前和事务结束以后,数据库的完整性没有被破 ...

  3. java——删除HashMap中所有的键值对

    第一种:❌(报错) import java.util.HashMap; import java.util.Set; public class T{ public static void main(St ...

  4. python_案例综合:教材记录管理

    class Book(): def __init__(self,ISBN,Ftile,Author,Publisher): self.ISBN = ISBN self.Ftile = Ftile se ...

  5. 表单注册及自定义validate手机验证码验证实例

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  6. Engineer Assignment HDU - 6006 状压dp

    http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表 ...

  7. [转]显示农历日期的JS

    本文转自:http://blog.sina.com.cn/s/blog_47377e77010009xc.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD ...

  8. Neutron命令测试1

    Refer: http://wenku.baidu.com/link?url=DtrbhO0A393hg8kOWKX0XYuZtSC8Iu0occn8NF1pYcUwNzlaSq5qXCQoNEBDM ...

  9. [PHP]对象数组和普通数组总结

    1.碰到前台将JSON格式数据传递到服务器后台,经php的json_decode函数转换成的数组由于为对象数组,php程序无法对数据进行正常处理的情况,为此需要开发一个PHP回调函数(objarray ...

  10. Devexpress Xtrareport 打印报表

    需要引用 Using Devexpress.Xtrareport.UI: Using Devexpress.XtraPrinting.Localiztion 实例化报表,xtrareport my=n ...