【JavaScript 封装库】BETA 3.0 测试版发布!

  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 // 实例化基础库

 30 $ = function () {

 31     return arguments.length == 0 ? new Base() : new Base(arguments);

 32 };

 33 

 34 // 基础库构造方法

 35 var Base = function (nodes) {

 36     this.info = '无节点';

 37     this.elements = [];

 38     if (typeof nodes == 'object') {

 39         var elements = [], node = null;

 40         for (var i = 0; i < nodes.length; i ++) {

 41             node = nodes[i];

 42             if (typeof node == 'string') { // 元素节点选择器

 43                 // 全局或局部

 44                 if (this.elements.length == 0) this.elements.push(document);

 45                 var patternSpace = /[\s\t ]+/;

 46                 if (patternSpace.test(node)) { // 多层

 47                     node = node.split(patternSpace);

 48                     for (var j = 0; j < node.length; j ++) {

 49                         if (j == (node.length - 1)) {

 50                             elements.push(this.selector(node[j]).getNodes());

 51                         } else {

 52                             this.selector(node[j]);

 53                         }

 54                     }

 55                 } else { // 单层

 56                     elements.push(this.selector(node).getNodes());

 57                 }

 58                 this.elements = [];

 59             } else if (typeof node == 'object' && (node == window || typeof node.nodeType != 'undefined')) { // 节点对象

 60                 this.elements.push(node);

 61             } else if (typeof node == 'function') { // HTML DOM 加载

 62                 this.htmlLoaded(node);

 63             }

 64         }

 65         if (typeof elements != 'undefined') {

 66             for (var k = 0; k < elements.length; k ++) {

 67                 if (elements[k] instanceof Array) { // 集群

 68                     for (var l = 0; l < elements[k].length; l ++) {

 69                         if (elements[k][l] != this.info) this.elements.push(elements[k][l]);

 70                     }

 71                 } else { // 单一

 72                     if (elements[k] != this.info) this.elements.push(elements[k]);

 73                 }

 74             }

 75         }

 76     }

 77 };

 78 

 79 // 获取采集的所有节点

 80 Base.prototype.getNodes = function () {

 81     if (this.elements.length == 0) return this.info;

 82     if (this.elements.length == 1) return this.firstNode();

 83     return this.elements;

 84 };

 85 

 86 // 获取采集的首位节点

 87 Base.prototype.firstNode = function () {

 88     if (this.elements.length == 0) return this.info;

 89     return this.elements[0];

 90 };

 91 

 92 // 获取采集的末尾节点

 93 Base.prototype.lastNode = function () {

 94     if (this.elements.length == 0) return this.info;

 95     return this.elements[this.elements.length - 1];

 96 };

 97 

 98 // 获取 id 元素节点

 99 Base.prototype.getId = function (ids, positioner) {

100     if (ids instanceof Array) { // 集群

101         for (var i = 0; i < ids.length; i ++) {

102             this.getId(ids[i], positioner);

103         }

104     } else { // 单一

105         var selector = null, node = null;

106         if (typeof positioner != 'undefined') { // 局部

107             if (typeof positioner == 'object' && typeof positioner.nodeType != 'undefined') {

108                 selector = positioner;

109             } else {

110                 if (!(selector = Base.positioner(positioner))) return this;

111             }

112         } else { // 全局

113             selector = document;

114         }

115         if (selector instanceof Array) { // 集群

116             for (var j = 0; j < selector.length; j ++) {

117                 node = selector[j].getElementsByTagName('*');

118                 for (var k = 0; k < node.length; k ++) {

119                     if (node[k].id == ids) {

120                         for (var i = 0; i < this.elements.length; i ++) {

121                             if (this.elements[i] == node[k]) return this;

122                         }

123                         this.elements.push(node[k]);

124                     }

125                 }

126             }

127         } else { // 单一

128             // 容错处理

129             if (typeof selector.getElementById != 'undefined') {

130                 node = selector.getElementById(ids);

131                 if (node === null) return this;

132                 for (var i = 0; i < this.elements.length; i ++) {

133                     if (this.elements[i] == node) return this;

134                 }

135                 this.elements.push(node);

136             } else {

137                 node = selector.getElementsByTagName('*');

138                 for (var j = 0; j < node.length; j ++) {

139                     if (node[j].id == ids) {

140                         for (var i = 0; i < this.elements.length; i ++) {

141                             if (this.elements[i] == node[j]) return this;

142                         }

143                         this.elements.push(node[j]);

144                     }

145                 }

146             }

147         }

148     }

149     return this;

150 };

151 

152 // 获取 tagName 元素节点

153 Base.prototype.getTagName = function (tagName, positioner) {

154     var selector = null, nodes = [];

155     if (typeof positioner != 'undefined') { // 局部

156         if (typeof positioner == 'object' && typeof positioner.nodeType != 'undefined') {

157             selector = positioner;

158         } else { 

159             if (!(selector = Base.positioner(positioner))) return this;

160         }

161     } else { // 全局

162         selector  = document;

163     }

164     if (selector instanceof Array) { // 集群

165         for (var j = 0; j < selector.length; j ++) {

166             nodes = selector[j].getElementsByTagName(tagName);

167             for (var i = 0; i < nodes.length; i ++) {

168                 this.elements.push(nodes[i]);

169             }

170         }

171     } else { // 单一

172         nodes = selector.getElementsByTagName(tagName);

173         for (var i = 0; i < nodes.length; i ++) {

174             this.elements.push(nodes[i]);

175         }

176     }

177     return this;

178 };

179 

180 // 获取 class 元素节点

181 Base.prototype.getClass = function (className, positioner) {

182     var selector = null, nodes = [];

183     if (typeof positioner != 'undefined') { // 局部

184         if (typeof positioner == 'object' && typeof positioner.nodeType != 'undefined') {

185             selector = positioner;

186         } else {

187             if (!(selector = Base.positioner(positioner))) return this;

188         }

189     } else {// 全局

190         selector = document;

191     }

192     if (selector instanceof Array) { // 集群

193         for (var j = 0; j < selector.length; j ++) {

194             nodes = selector[j].getElementsByTagName('*');

195             for (var i = 0; i < nodes.length; i ++) {

196                 if (Base.hasClass(className, nodes[i])) this.elements.push(nodes[i]);

197             }

198         }

199     } else { // 单一

200         nodes = selector.getElementsByTagName('*');

201         for (var i = 0; i < nodes.length; i ++) {

202             if (Base.hasClass(className, nodes[i])) this.elements.push(nodes[i]);

203         }

204     }

205     return this;

206 };

207 

208 // 获取 name 元素节点

209 Base.prototype.getName = function (name, positioner) {

210     var selector = null, nodes = [];

211     if (typeof positioner != 'undefined') { // 局部

212         if (typeof positioner == 'object' && typeof positioner.nodeType != 'undefined') {

213             selector = positioner;

214         } else {

215             if (!(selector = Base.positioner(positioner))) return this;

216         }

217     } else { // 全局

218         selector = document;

219     }

220     if (selector instanceof Array) { // 集群

221         for (var j = 0; j < selector.length; j ++) {

222             nodes = selector[j].getElementsByTagName('*');

223             for (var i = 0; i < nodes.length; i ++) {

224                 if (nodes[i].name == name) this.elements.push(nodes[i]);

225             }

226         }

227     } else { // 单一

228         // 容错处理

229         nodes = typeof selector.getElementsByName != 'undefined' ? selector.getElementsByName(name) : selector.getElementsByTagName('*');

230         for (var i = 0; i < nodes.length; i ++) {

231             if (nodes[i].name == name) this.elements.push(nodes[i]);

232         }

233     }

234     return this;

235 };

236 

237 // 元素节点选择器

238 Base.prototype.selector = function (node) {

239     if (typeof node == 'string') {

240         var nodes = [], elements = [];

241         var patternId = /([a-z]+)#([\w\-]+)/i;

242         var patternClass = /([a-z]+)\.([\w\-]+)/i;

243         var tagName = '', id = '', className = '';

244         for (var i = 0; i < this.elements.length; i ++) {

245             switch (node.charAt(0)) {

246                 case '#' : // id 

247                     if ((nodes = $().getId(node.substring(1, node.length), this.elements[i]).getNodes()) != this.info) {

248                         elements.push(nodes);

249                     }

250                     break;

251                 case '.' : // class

252                     if ((nodes = $().getClass(node.substring(1, node.length), this.elements[i]).getNodes()) != this.info) {

253                         if (nodes instanceof Array) { // 集群

254                             for (var j = 0; j < nodes.length; j ++) {

255                                 elements.push(nodes[j]);

256                             }

257                         } else { // 单一

258                             elements.push(nodes);

259                         }

260                     }

261                     break;

262                 default : 

263                     if (patternId.test(node)) { // tagName + id

264                         tagName = patternId.exec(node)[1];

265                         id = patternId.exec(node)[2];

266                         if ((nodes = $().getTagName(tagName, this.elements[i]).getNodes()) != this.info) {

267                             if (nodes instanceof Array) { // 集群

268                                 for (var j = 0; j < nodes.length; j ++) {

269                                     if (nodes[j].id == id) elements.push(nodes[j]);

270                                 }

271                             } else { // 单一

272                                 if (nodes.id == id) elements.push(nodes);

273                             }

274                         }

275                     } else if (patternClass.test(node)) { // tagName + class

276                         tagName = patternClass.exec(node)[1];

277                         className = patternClass.exec(node)[2];

278                         if ((nodes = $().getTagName(tagName, this.elements[i]).getNodes()) != this.info) {

279                             if (nodes instanceof Array) { // 集群

280                                 for (var j = 0; j < nodes.length; j ++) {

281                                     if (Base.hasClass(className, nodes[j])) elements.push(nodes[j]);

282                                 }

283                             } else { // 单一

284                                 if (Base.hasClass(className, nodes)) elements.push(nodes);

285                             }

286                         }

287                     } else { // tagName

288                         if ((nodes = $().getTagName(node, this.elements[i]).getNodes()) != this.info) {

289                             if (nodes instanceof Array) { // 集群

290                                 for (var j = 0; j < nodes.length; j ++) {

291                                     elements.push(nodes[j]);

292                                 }

293                             } else { // 单一

294                                 elements.push(nodes);

295                             }

296                         }

297                     }

298             }

299         }

300         this.elements = elements;

301     }

302     return this;

303 };

304 

305 // 获取与设置元素内容

306 Base.prototype.html = function (text) {

307     var html = [];

308     for (var i = 0; i < this.elements.length; i ++) {

309         if (typeof text != 'undefined') { // 设置

310             this.elements[i].innerHTML = text;

311         } else { // 获取

312             html.push(this.elements[i].innerHTML);

313         }

314     }

315     switch (html.length) {

316         case 0 :

317             return this;

318             break;

319         case 1 :

320             return html[0];

321             break;

322         default : 

323             return html;

324     }

325 };

326 

327 // 获取与设置表单元素内容

328 Base.prototype.value = function (text) {

329     var value = [];

330     for (var i = 0; i < this.elements.length; i ++) {

331         if (typeof text != 'undefined') { // 设置

332             if (typeof this.elements[i].value != 'undefined') this.elements[i].value = text;

333         } else { // 获取

334             if (typeof this.elements[i].value != 'undefined') value.push(this.elements[i].value);

335         }

336     }

337     switch (value.length) {

338         case 0 :

339             return this;

340             break;

341         case 1 : 

342             return value[0];

343             break;

344         default : 

345             return value;

346     }

347 };

348 

349 // 获取与设置 CSS

350 Base.prototype.css = function (cssKey, cssValue) {

351     if (typeof cssValue != 'undefined' || cssKey instanceof Array) { // 设置

352         if (cssKey instanceof Array) { // 集群

353             var patternStyle = /^([a-z]+)[\s\t ]*=[\s\t ]*([\w\(=,\s\.#\/\\\'\"\-\)]+)$/i;

354             var key = '', value = '';

355             for (var i = 0; i < cssKey.length; i ++) {

356                 if (patternStyle.test(cssKey[i])) {

357                     key = patternStyle.exec(cssKey[i])[1];

358                     value = patternStyle.exec(cssKey[i])[2];

359                     this.css(key, value);

360                 }

361             }

362         } else { // 单一

363             for (var i = 0; i < this.elements.length; i ++) {

364                 if (typeof this.elements[i].style[cssKey] != 'undefined') {

365                     this.elements[i].style[cssKey] = cssValue;

366                 }

367             }

368         }

369     } else { // 获取

370         var css = [], style = '';

371         for (var i = 0; i < this.elements.length; i ++) {

372             if (typeof (style = Tool.getStyle(cssKey, this.elements[i])) != 'undefined') css.push(style);

373         }

374         switch (css.length) {

375             case 0 : 

376                 return this;

377                 break;

378             case 1 : 

379                 return css[0];

380                 break;

381             default : 

382                 return css;

383                 break;

384         }

385     }

386     return this;

387 };

388 

389 // 添加 class 选择器

390 Base.prototype.addClass = function (className) {

391     if (className instanceof Array) { // 集群

392         for (var i = 0; i < className.length; i ++) {

393             this.addClass(className[i]);

394         }

395     } else { // 单一

396         var space = '';

397         for (var i = 0; i < this.elements.length; i ++) {

398             space = this.elements[i].className != '' ? ' ' : space;

399             if (!Base.hasClass(className, this.elements[i])) this.elements[i].className += space + className;

400         }

401     }

402     return this;

403 };

404 

405 // 移除 class 选择器

406 Base.prototype.removeClass = function (className) {

407     if (className instanceof Array) { // 集群

408         for (var i = 0; i < className.length; i ++) {

409             this.removeClass(className[i]);

410         }

411     } else { // 单一

412         var node = null;

413         for (var i = 0; i < this.elements.length; i ++) {

414             node = this.elements[i];

415             if (Base.hasClass(className, node)) {

416                 node.className = node.className.replace(new RegExp('(^|\\s+)' + className + '(\\s+|$)'), ' ');

417                 node.className = Base.trim(node.className);

418             }

419         }

420     }

421     return this;

422 };

423 

424 // 添加样式规则

425 Base.prototype.addRule = function (ruleName, ruleText, rulePosition, sheetIndex) {

426     if (ruleName instanceof Array) { // 集群

427         if (!(ruleText instanceof Array) || ruleName.length != ruleText.length) return this;

428         for (var i = 0; i < ruleName.length; i ++) {

429             if (ruleName[i] && ruleText[i]) this.addRule(ruleName[i], ruleText[i], rulePosition, sheetIndex);

430         }

431     } else { // 单一

432         var rule = Base.checkRule(rulePosition, sheetIndex);

433         if (typeof rule.sheet != 'undefined') {

434             var nameTotal = Tool.ruleNameTotal(rule.sheet);

435             for (var i = 0; i < nameTotal.length; i ++) {

436                 if (nameTotal[i] == ruleName) return this;

437             }

438             Tool.addRule(rule.sheet, ruleName, ruleText, rule.position);

439         }

440     }

441     return this;

442 };

443 

444 // 移除样式规则

445 Base.prototype.removeRule = function (rulePosition, ruleNumber, sheetIndex) {

446     var rule = Base.checkRule(rulePosition, sheetIndex, ruleNumber);

447     if (typeof rule.sheet != 'undefined') {

448         for (var i = 0; i < rule.number; i ++) {

449             Tool.removeRule(rule.sheet, rule.position);

450         }

451     }

452     return this;

453 };

454 

455 // 节点事件绑定

456 Base.prototype.nodeEvent = function (eventName, method, mode) {

457     if (typeof eventName != 'string' || typeof method != 'function') return this;

458     eventName = eventName.toLowerCase();

459     if (eventName.indexOf('on') == 0) eventName = eventName.substring(2, eventName.length);

460     if (typeof mode == 'undefined') mode = true;

461     for (var i = 0; i < this.elements.length; i ++) {

462         switch (eventName) {

463             case 'mousewheel' :

464                 Tool.mousewheel(this.elements[i], method, mode);

465                 break;

466             default : 

467                 mode ? Tool.loginEvent(this.elements[i], eventName, method) : Tool.logoutEvent(this.elements[i], eventName, method);

468         }

469     }

470     return this;

471 };

472 

473 // HTML DOM 加载

474 Base.prototype.htmlLoaded = function (method) {

475     if (typeof method == 'function') Tool.htmlLoaded(method);

476     return this;

477 };

478 

479 // 加载特效插件

480 Base.prototype.plugins = function (pluginName, pluginMethod) {

481     if (pluginName instanceof Array) { // 集群

482         if (!(pluginMethod instanceof Array) || pluginName.length != pluginMethod.length) return false;

483         for (var i = 0; i < pluginName.length; i ++) {

484             this.plugins(pluginName[i], pluginMethod[i]);

485         }

486     } else { // 单一

487         if (typeof pluginName == 'string' && typeof pluginMethod == 'function') {

488             Base.prototype[pluginName] = pluginMethod;

489         } 

490     }

491     return this;

492 };

493 

494 /*

495     库方法集合

496 */

497 // 库方法: 清除两边空格

498 Base.trim = function (string) {

499     if (typeof string != 'string') return string;

500     var patternLeft = /^[\s\t ]+/;

501     var patternRight = /[\s\t ]+$/;

502     if (patternLeft.test(string)) string = string.replace(patternLeft, '');

503     if (patternRight.test(string)) string = string.replace(patternRight, '');

504     return string;

505 };

506 

507 // 库方法: 检测样式规则

508 Base.checkRule = function (rulePosition, sheetIndex, ruleNumber) {

509     if (typeof rulePosition != 'number') rulePosition = 0;

510     if (typeof sheetIndex != 'number') sheetIndex = 0;

511     if (typeof ruleNumber != 'number') ruleNumber = 1;

512     var sheetObject = undefined;

513     var sheetTotal = document.styleSheets.length;

514     if (sheetTotal != 0 && sheetIndex <= (sheetTotal - 1)) { // 兼容 IE 6/7/8 防止 unknown 

515         sheetObject = document.styleSheets[sheetIndex];

516     }

517     if (typeof sheetObject != 'undefined') {

518         var ruleTotal = Tool.ruleTotal(sheetObject);

519         if (rulePosition > ruleTotal) rulePosition = ruleTotal;

520         var maxNumber = ruleTotal - rulePosition;

521         if (ruleNumber > maxNumber) ruleNumber -= ruleNumber - maxNumber;

522     }

523     return {

524         position : rulePosition,

525         sheet : sheetObject,

526         number : ruleNumber

527     }

528 };

529 

530 // 库方法: 检测 class

531 Base.hasClass = function (className, elementNode) {

532     return (new RegExp('(^|\\s+)' + className + '(\\s+|$)')).test(elementNode.className);

533 }

534 

535 // 库方法: 元素节点定位器(局部搜索)

536 Base.positioner = function (positioner) {

537     if (typeof positioner != 'string') return false;

538     var nodes = [];

539     var patternId = /^id\s*=\s*([\w\-]+)$/i;

540     var patternTag = /^tag(Name)?\s*=\s*([a-z]+)$/i;

541     var patternClass = /^class(Name)?\s*=\s*([\w\-]+)$/i;

542     if (patternTag.test(positioner)) { // tagName

543         positioner = patternTag.exec(positioner)[2];

544         nodes = $().getTagName(positioner).getNodes();

545     } else if (patternClass.test(positioner)) { // class

546         positioner = patternClass.exec(positioner)[2];

547         nodes = $().getClass(positioner).getNodes();

548     } else if (patternId.test(positioner)) { // id

549         positioner = patternId.exec(positioner)[1];

550         nodes = $().getId(positioner).getNodes();

551     } else { // id

552         nodes = $().getId(positioner).getNodes();

553     }

554     if (nodes == $().info) return false;

555     return nodes;

556 };

557 

558 // 库方法: 获取元素从属关系(直接从属)

559 Base.hasChild = function (elementNode, targetNode) {

560     var childs = targetNode.childNodes;

561     for (var i = 0; i < childs.length; i ++) {

562         if (childs[i].nodeType == 1 && childs[i] == elementNode) return true;

563     }

564     return false;

565 };

566 

567 // 库方法: 清除空白节点

568 Base.clear = function (elementNode) {

569     var childs = elementNode.childNodes;

570     var length = childs.length;

571     for (var i = (length - 1); i >= 0; i --) {

572         if (childs[i].nodeType == 3 && /^[\s\t ]+$/.test(childs[i].nodeValue)) elementNode.removeChild(childs[i]);

573     }

574     return elementNode;

575 };

576 

577 // 库方法: 清除注释节点

578 Base.comment = function (elementNode) {

579     var childs = elementNode.childNodes;

580     var length = childs.length;

581     for (var i = (length - 1); i >= 0; i --) {

582         if (childs[i].nodeType == 8) {

583             elementNode.removeChild(childs[i]);

584         }

585     }

586     return elementNode;

587 };

588 

589 // 库方法: 字符串删减

590 Base.replace = function (string, index) {

591     if (typeof string != 'string') return string;

592     if (string.indexOf(index) != -1) string = string.replace(new RegExp(index, 'ig'), '');

593     return string;

594 };

595 

596 // 库方法: 添加元素节点

597 Base.addElement = function (elementName, attributes, html, targetNode) {

598     var elementNode = document.createElement(elementName);

599     if (typeof attributes == 'string' || attributes instanceof Array) this.addAttribute(attributes, elementNode);

600     if (typeof html != 'undefined') $(elementNode).html(html);

601     if (typeof targetNode != 'undefined') {

602         if (!(typeof targetNode == 'object' || targetNode.nodeType == 1)) {

603             if (!(targetNode = this.positioner(targetNode))) targetNode = document.body;

604         } 

605     } else {

606         targetNode = document.body;

607     }

608     if (targetNode instanceof Array) { // 集群

609         for (var i = 0; i < targetNode.length; i ++) {

610             targetNode[i].appendChild(elementNode.cloneNode(true));

611         }

612     } else { // 单一

613         targetNode.appendChild(elementNode);

614     }

615     return elementNode;

616 };

617 

618 // 库方法: 添加属性节点

619 Base.addAttribute = function (attributes, elementNode) {

620     if (attributes instanceof Array) { // 集群

621         for (var i = 0; i < attributes.length; i ++) {

622             this.addAttribute(attributes[i], elementNode);

623         }

624     } else { // 单一

625         if (typeof attributes != 'string') return false;

626         var patternAttribute = /^([a-z]+)[\s\t ]*=[\s\t ]*([\w,\(#=:\s\.\/\\\'\";\-\)]+)$/i;

627         var key = '', value = '';

628         if (patternAttribute.test(attributes)) {

629             key = patternAttribute.exec(attributes)[1];

630             value = patternAttribute.exec(attributes)[2];

631             var patternClass = /^class(Name)?$/i, className = [];

632             if (key == 'style') { // CSS

633                 this.style(value, elementNode);

634             } else if (patternClass.test(key)) { // class

635                 this.addClass(value, elementNode);

636             } else {

637                 elementNode.setAttribute(key, value);

638             }

639         }

640     }

641 };

642 

643 // 库方法: CSS 处理

644 Base.style = function (css, elementNode) {

645     var split = /;[\s\t ]*/i;

646     if (split.test(css)) { // 集群

647         css = css.split(split);

648         for (var i = 0; i < css.length; i ++) {

649             this.style(css[i], elementNode);

650         }

651     } else { // 单一

652         var patternCSS = /^([a-z]+)[\s\t ]*:[\s\t ]*([\w\(=\s\.,\/\\\'#\"\-\)]+)$/i, cssKey = '', cssValue = '';

653         if (patternCSS.test(css)) {

654             cssKey = patternCSS.exec(css)[1];

655             cssValue = patternCSS.exec(css)[2];

656             $(elementNode).css(cssKey, cssValue);

657         }

658     }

659 };

660 

661 // 库方法: class 处理

662 Base.addClass = function (className, elementNode) {

663     var split = /[\s\t ]+/;

664     if (split.test(className)) {

665         className = className.split(split);

666         for (var i = 0; i < className.length; i ++) {

667             this.addClass(className[i], elementNode);

668         }

669     } else {

670         $(elementNode).addClass(className);

671     }

672 };

673 

674 // 库方法: 移除元素节点

675 Base.removeElement = function (elementNode, targetNode) {

676     if (!(typeof elementNode == 'object' || elementNode.nodeType == 1)) {

677         if (!(elementNode = this.positioner(elementNode))) return false;

678     }

679     if (typeof targetNode == 'undefined' || !(typeof targetNode == 'object' || targetNode.nodeType == 1)) {

680         if (!(targetNode = this.positioner(targetNode))) targetNode = document.body;

681     }

682     if (targetNode instanceof Array) { // 集群

683         for (var i = 0; i < targetNode.length; i ++) {

684             this.removeElement(elementNode, targetNode[i]);

685         }

686     } else { // 单一

687         if (elementNode instanceof Array) { // 集群

688             for (var i = 0; i < elementNode.length; i ++) {

689                 this.removeElement(elementNode[i], targetNode);

690             }

691         } else { // 单一

692             if (this.hasChild(elementNode, targetNode)) targetNode.removeChild(elementNode);

693         }

694     }

695 };

696 

697 // 库方法: 初始化滚动条

698 Base.initializationScroll = function () {

699     Tool.scrollLeft(0);

700     Tool.scrollTop(0);

701 };

702 

703 // 库方法: 设置与获取滚动条

704 Base.scroll = function (x, y) {

705     if (typeof x != 'number' && typeof y != 'number') { // 获取

706         return {

707             x : Tool.scrollLeft(),

708             y : Tool.scrollTop()

709         }

710     }

711     if (typeof x == 'number') { // 设置x轴

712         Tool.scrollLeft(x);

713     }

714     if (typeof y == 'number') { // 设置y轴

715         Tool.scrollTop(y);

716     }

717 };

718 

719 // 库方法: 获取网页可视区尺寸

720 Base.getWindowRectangle = function () {

721     return {

722         width : Tool.getWindowWidth(),

723         height : Tool.getWindowHeight()

724     }

725 };

726 

727 // 库方法: 获取元素尺寸

728 Base.getInnerRectangle = function (elementNode) {

729     var width = 0, height = 0, display = '', _this = null;

730     _this = $(elementNode);

731     display = _this.css('display');

732     width = _this.css('width');

733     height = _this.css('height');

734     if (width == 'auto' || height == 'auto') { // IE 6/7/8

735         if (display == 'none') _this.show();

736         width = elementNode.offsetWidth;

737         height = elementNode.offsetHeight;

738     }

739     width = this.replace(width, 'px');

740     height = this.replace(height, 'px');

741     return {

742         width : width,

743         height : height

744     };

745 };

746 

747 // 库方法: 获取元素外边距尺寸

748 Base.getOuterRectangle = function (elementNode) {

749     this.absolute(elementNode);

750     var left = 0, top = 0, display = '', _this = null;

751     _this = $(elementNode);

752     display = _this.css('display');

753     left = _this.css('left');

754     top = _this.css('top');

755     if (left == 'auto' || top == 'auto') { // IE 6/7/8

756         if (display == 'none') _this.show();

757         left = elementNode.offsetLeft;

758         top = elementNode.offsetTop;

759     }

760     left = this.replace(left, 'px');

761     top = this.replace(top, 'px');

762     return {

763         left : left,

764         top : top

765     };

766 };

767 

768 // 库方法: 设置元素绝对定位

769 Base.absolute = function (elementNode) {

770     var _this = $(elementNode);

771     if (_this.css('position') != 'absolute') _this.css(['position = absolute', 'left = 0', 'top = 0']);

772 };

773 

774 // 库方法: 固定锁屏区域(修正浏览器Bug)

775 Base.fixed = function () {

776     // IE Bug 修正

777     var down = function () {

778         var move = function (event) {

779             event.preventDefault();

780         };

781         var up = function () {

782             $('#screen').nodeEvent('mousemove', move, false);

783             $('#screen').nodeEvent('mouseup', up, false);

784         };

785         $('#screen').nodeEvent('mousemove', move);

786         $('#screen').nodeEvent('mouseup', up);

787     };

788     $('#screen').nodeEvent('mousedown', down);

789     // Chrome Bug 修改

790     $('#screen').nodeEvent('mousewheel', function (event) {

791         event.preventDefault();

792     });

793 };
  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 // 工具库

 20 var Tool = {

 21     // 数组排序

 22     sort : {

 23         minToMax : function (min, max) {

 24             if (min < max) {

 25                 return -1;

 26             } else if (min > max) {

 27                 return 1;

 28             } else {

 29                 return 0;

 30             }

 31         },

 32         maxToMin : function (min, max) {

 33             if (min < max) {

 34                 return 1;

 35             } else if (min > max) {

 36                 return -1;

 37             } else {

 38                 return 0;

 39             }

 40         }

 41     },

 42     

 43     // 跨浏览器获取计算后的样式

 44     getStyle : function (cssKey, elementNode) {

 45         if (typeof window.getComputedStyle != 'undefined') { // W3C

 46             return window.getComputedStyle(elementNode, null)[cssKey];

 47         } else if (typeof elementNode.currentStyle != 'undefined') { // IE 6/7/8

 48             return elementNode.currentStyle[cssKey];

 49         }

 50     },

 51     

 52     // 跨浏览器获取样式规则总数

 53     ruleTotal : function (sheetObject) {

 54         if (typeof sheetObject.cssRules != 'undefined') { // W3C

 55             return sheetObject.cssRules.length;

 56         } else if (typeof sheetObject.rules != 'undefined') { // IE 6/7/8

 57             return sheetObject.rules.length;

 58         }

 59     },

 60     

 61     // 跨浏览器获取样式规则名称集合

 62     ruleNameTotal : function (sheetObject) {

 63         var nameTotal = [];

 64         if (typeof sheetObject.cssRules != 'undefined') { // W3C

 65             for (var i = 0; i < sheetObject.cssRules.length; i ++) {

 66                 nameTotal.push(sheetObject.cssRules[i].selectorText);

 67             }

 68         } else if (typeof sheetObject.rules != 'undefined') { // IE 6/7/8

 69             for (var i = 0; i < sheetObject.rules.length; i ++) {

 70                 nameTotal.push(sheetObject.rules[i].selectorText);

 71             }

 72         }

 73         return nameTotal;

 74     },

 75     

 76     // 跨浏览器添加样式规则

 77     addRule : function (sheetObject, ruleName, ruleText, rulePosition) {

 78         if (typeof sheetObject.insertRule != 'undefined') { // W3C

 79             sheetObject.insertRule(ruleName + ' {' + ruleText + '}', rulePosition);

 80         } else if (typeof sheetObject.addRule != 'undefined') { // IE 6/7/8

 81             sheetObject.addRule(ruleName, ruleText, rulePosition);

 82         }

 83     },

 84     

 85     // 跨浏览器移除样式规则

 86     removeRule : function (sheetObject, rulePosition) {

 87         if (typeof sheetObject.deleteRule != 'undefined') { // W3C

 88             sheetObject.deleteRule(rulePosition);

 89         } else if (typeof sheetObject.removeRule != 'undefined') { // IE 6/7/8

 90             sheetObject.removeRule(rulePosition);

 91         }

 92     },

 93     

 94     // IE 6/7/8 事件对象匹配模式

 95     eventMatch : function (event) {

 96         event.target = event.srcElement;

 97         event.stopPropagation = function () {

 98             event.cancelBubble = true;

 99         };

100         event.preventDefault = function () {

101             event.returnValue = false;

102         };

103         return event;

104     },

105     

106     // 事件绑定唯一标识符

107     eventId : 0,

108     

109     // 跨浏览器现代事件绑定: 注册事件

110     loginEvent : function (elementNode, eventName, method) {

111         if (typeof elementNode.addEventListener != 'undefined') { // W3C

112             elementNode.addEventListener(eventName, method, false);

113         } else if (typeof elementNode.attachEvent != 'undefined') { // IE 6/7/8

114             if (typeof elementNode.hashTable != 'object') elementNode.hashTable = {};

115             if (typeof elementNode.hashTable[eventName] != 'object') elementNode.hashTable[eventName] = [];

116             var events = elementNode.hashTable[eventName];

117             for (var i = 0; i < events.length; i ++) {

118                 if (events[i] == method) return false;

119             }

120             events[this.eventId ++] = method;

121             var _this = this;

122             elementNode['on' + eventName] = function () {

123                 var event = _this.eventMatch(window.event);

124                 for (var i = 0; i < events.length; i ++) {

125                     if (typeof events[i] == 'function') events[i].call(this, event);

126                 }

127             };

128         }

129     },

130     

131     // 跨浏览器现代事件绑定: 注销事件

132     logoutEvent : function (elementNode, eventName, method) {

133         if (typeof elementNode.removeEventListener != 'undefined') { // W3C

134             elementNode.removeEventListener(eventName, method, false);

135         } else if (typeof elementNode.detachEvent != 'undefined') { // IE 6/7/8

136             if (typeof elementNode.hashTable == 'object' && typeof elementNode.hashTable[eventName] == 'object') {

137                 var events = elementNode.hashTable[eventName];

138                 for (var i = 0; i < events.length; i ++) {

139                     if (events[i] == method) delete events[i];

140                 }

141             }

142         }

143     },

144     

145     // 跨浏览器鼠标滚轮事件

146     mousewheel : function (elementNode, method, mode) {

147         if (elementNode == window) elementNode = document; // IE 6/7/8

148         if (typeof elementNode.onmousewheel != 'undefined') { // Not Firefox

149             mode ? this.loginEvent(elementNode, 'mousewheel', method) : this.logoutEvent(elementNode, 'mousewheel', method);

150         } else { // Firefox

151             mode ? this.loginEvent(elementNode, 'DOMMouseScroll', method) : this.logoutEvent(elementNode, 'DOMMouseScroll', method);

152         }

153     },

154     

155     // 跨浏览器 HTML DOM 加载

156     htmlLoaded : function (method) {

157         if ((browserDetect.opera && browserDetect.browser.version < 9)

158         || 

159             (browserDetect.firefox && browserDetect.browser.version < 3) 

160         || 

161             (browserDetect.engine.name == 'WebKit' && browserDetect.engine.version < 525)) { // low version W3C

162             var timer = setTimeout(function () {

163                 clearTimeout(timer);

164                 /interactive|loading|complete/i.test(document.readyState) ? method() : timer = setTimeout(arguments.callee, 1);

165             }, 1);

166         } else if (!browserDetect.ie || browserDetect.browser.version > 8) { // current W3C

167             var _this = this;

168             this.loginEvent(document, 'DOMContentLoaded', function () {

169                 _this.logoutEvent(document, 'DOMContentLoaded', arguments.callee);

170                 method();

171             });

172         } else if (browserDetect.ie && browserDetect.browser.version < 9) { // IE 6/7/8

173             var timer = setTimeout(function () {

174                 try {

175                     clearTimeout(timer);

176                     document.documentElement.doScroll('top');

177                     method();

178                 } catch (error) {

179                     timer = setTimeout(arguments.callee, 1);

180                 }

181             }, 1);

182         }

183     },

184     

185     // 跨浏览器获取元素从属关系(间接从属+直接从属)

186     getContains : function (elementNode, targetNode) {

187         if (typeof targetNode.compareDocumentPosition != 'undefined') { // W3C

188             return targetNode.compareDocumentPosition(elementNode) == 20;

189         } else if (typeof targetNode.contains != 'undefined') { // IE 6/7/8

190             return targetNode.contains(elementNode);

191         }

192     },

193     

194     // 跨浏览器获取与设置滚动条x轴

195     scrollLeft : function (x) {

196         if (browserDetect.engine.name == 'WebKit') { // Chrome / Safari

197             if (typeof x != 'undefined') { // 设置

198                 document.body.scrollLeft = x;

199             } else { // 获取

200                 return document.body.scrollLeft;

201             }

202         } else { // Not Chrome / Safari

203             if (typeof x != 'undefined') { // 设置

204                 document.documentElement.scrollLeft = x;

205             } else { // 获取

206                 return document.documentElement.scrollLeft;

207             }

208         }

209     },

210     

211     // 跨浏览器获取与控制滚动条y轴

212     scrollTop : function (y) {

213         if (browserDetect.engine.name == 'WebKit') { // Chrome / Safari

214             if (typeof y != 'undefined') { // 设置

215                 document.body.scrollTop = y;

216             } else { // 获取

217                 return document.body.scrollTop;

218             }

219         } else { // Not Chrome / Safari

220             if (typeof y != 'undefined') { // 设置

221                 document.documentElement.scrollTop = y;

222             } else { // 获取

223                 return document.documentElement.scrollTop; 

224             }

225         }

226     },

227     

228     // 跨浏览器获取网页x轴可视区域尺寸

229     getWindowWidth : function () {

230         if (typeof window.innerWidth != 'undefined') { // W3C

231             return window.innerWidth;

232         } else if (typeof document.documentElement.clientWidth != 'undefined') { // IE 6/7/8

233             return document.documentElement.clientWidth;

234         }

235     },

236     

237     // 跨浏览器获取网页y轴可视区域尺寸

238     getWindowHeight : function () {

239         if (typeof window.innerHeight != 'undefined') { // W3C

240             return window.innerHeight;

241         } else if (typeof document.documentElement.clientHeight) { // IE 6/7/8

242             return document.documentElement.clientHeight;

243         }

244     },

245     

246     // IE 专属: 浏览器外捕获鼠标按下

247     setCaptureIE : function (elementNode) {

248         if (typeof elementNode.setCapture != 'undefined') { // IE

249             elementNode.setCapture();

250         }

251     },

252     

253     // IE 专属: 浏览器外捕获鼠标弹起

254     releaseCaptureIE : function (elementNode) {

255         if (typeof elementNode.releaseCapture != 'undefined') { // IE

256             elementNode.releaseCapture();

257         }

258     }

259     

260 };
  1 /*

  2     源码作者: 石不易(Louis Shi)

  3     联系方式: http://www.shibuyi.net

  4     ===================================================================================================

  5     程序名称: 浏览器嗅探器 BETA 3.0

  6     版本迭代: 无

  7     功能总数: 4 个

  8     功能介绍: 

  9         1. 支持浏览器品牌嗅探

 10         2. 支持浏览器名称/版本嗅探

 11         3. 支持浏览器引擎名称/版本嗅探

 12         4. 支持浏览器隶属平台名称/版本嗅探

 13 */

 14 (function () {

 15     window.browserDetect = {

 16         ie : false,

 17         firefox : false,

 18         chrome : false,

 19         safari : false,

 20         opera : false,

 21         other : false,

 22         

 23         browser : {

 24             name : '',

 25             version : ''

 26         },

 27         engine : {

 28             name : '',

 29             version : ''

 30         },

 31         system : {

 32             name : '',

 33             version : ''

 34         }

 35     };

 36     

 37     var info = navigator.userAgent;

 38     var system = navigator.platform;

 39     

 40     /*

 41         Browser pattern

 42     */ 

 43     // check IE

 44     var patternIE = /MSIE\s([\d\.]+)/i;

 45     var patternHighIE = /rv:([\d\.]+)/i;

 46     // check Firefox

 47     var patternFirefox = /Firefox\/([\d\.]+)/i;

 48     // check Chrome

 49     var patternChrome = /Chrome\/([\d\.]+)/i;

 50     // check Safari

 51     var patternSafari = /Safari\/([\d\.]+)/i;

 52     // check Opera

 53     var patternOpera = /Opera\/([\d\.]+)/i;

 54     

 55     /*

 56         Engine pattern

 57     */

 58     // check Trident

 59     var patternTrident = /Trident\/([\d\.]+)/i;

 60     // check Gecko

 61     var patternGecko = /Gecko\/(\d+)/i;

 62     // check WebKit

 63     var patternWebKit = /AppleWebKit\/([\d\.]+)/i;

 64     // check Presto

 65     var patternPresto = /Presto\/([\d\.]+)/i;

 66     

 67     /*

 68         System pattern

 69     */

 70     // check Windows

 71     var patternWindows = /Windows\sNT\s([\d\.]+)/i;

 72     var patternWin = /Win/i;

 73     // check Linux

 74     var patternLinux = /Linux/i;

 75     // check Unix

 76     var patternUnix = /X11/i;

 77     // check Mac

 78     var patternMac = /Mac/i;

 79     

 80     /*

 81         Check browser

 82     */

 83     if ((low = patternIE.test(info)) || (high = patternTrident.test(info))) { // IE

 84         browserDetect.ie = true;

 85         browserDetect.browser.name = 'Internet Explorer';

 86         browserDetect.engine.name = 'Trident';

 87         if (low) { // IE 6 - 10

 88             browserDetect.browser.version = parseFloat(patternIE.exec(info)[1]);

 89         } else if (high) { // IE 11+

 90             browserDetect.browser.version = parseFloat(patternHighIE.exec(info)[1]);

 91         }

 92         if (browserDetect.browser.version >= 6.0) {

 93             switch (browserDetect.browser.version) { // engine version

 94                 case 6.0 : 

 95                     browserDetect.engine.version = 2.0;

 96                     break;

 97                 case 7.0 :

 98                     browserDetect.engine.version = 3.0;

 99                     break;

100                 default : 

101                     browserDetect.engine.version = parseFloat(patternTrident.exec(info)[1]);

102             }

103         } else {

104             browserDetect.engine.version = '2.0-';

105         }

106     } else if (patternFirefox.test(info)) { // Firefox

107         browserDetect.firefox = true;

108         browserDetect.browser.name = 'Firefox';

109         browserDetect.browser.version = parseFloat(patternFirefox.exec(info)[1]);

110     } else if (patternChrome.test(info)) { // Chrome

111         browserDetect.chrome = true;

112         browserDetect.browser.name = 'Chrome';

113         browserDetect.browser.version = parseFloat(patternChrome.exec(info)[1]);

114     } else if (patternSafari.test(info)) { // Safari

115         browserDetect.safari = true;

116         browserDetect.browser.name = 'Safari';

117         var patternVersion = /Version\/([\d\.]+)/i;

118         if (patternVersion.test(info)) { // high version

119             browserDetect.browser.version = parseFloat(patternVersion.exec(info)[1]);

120         } else { // low version

121             browserDetect.browser.version = parseFloat(patternSafari.exec(info)[1]);

122         }

123     } else if (patternOpera.test(info)) { // Opera

124         browserDetect.opera = true;

125         browserDetect.browser.name = 'Opera';

126         var patternVersion = /Version\/([\d\.]+)/i;

127         if (patternVersion.test(info)) { // high version

128             browserDetect.browser.version = parseFloat(patternVersion.exec(info)[1]);

129         } else { // low version

130             browserDetect.browser.version = parseFloat(patternOpera.exec(info)[1]);

131         }

132     } else { // Other

133         browserDetect.other = true;

134         browserDetect.browser.name = 'Other';

135         browserDetect.browser.version = 'Unknown';

136     }

137     

138     /*

139         Check Engine

140     */

141     if (patternTrident.test(info)) { // Trident

142         browserDetect.engine.name = 'Trident';

143         browserDetect.engine.version = parseFloat(patternTrident.exec(info)[1]);

144     } else if (patternGecko.test(info)) { // Gecko

145         browserDetect.engine.name = 'Gecko';

146         var patternVersion = /rv:([\d\.]+)/i;

147         if (patternVersion.test(info)) { // high version

148             browserDetect.engine.version = parseFloat(patternVersion.exec(info)[1]);

149         } else { // low version

150             browserDetect.engine.version = parseFloat(patternGecko.exec(info)[1]);

151         }

152     } else if (patternWebKit.test(info)) { // WebKit

153         browserDetect.engine.name = 'WebKit';

154         browserDetect.engine.version = parseFloat(patternWebKit.exec(info)[1]);

155     } else if (patternPresto.test(info)) { // Presto

156         browserDetect.engine.name = 'Presto';

157         browserDetect.engine.version = parseFloat(patternPresto.exec(info)[1]);

158     } else { // Other

159         if (browserDetect.other) {

160             browserDetect.engine.name = 'Other';

161             browserDetect.engine.version = 'Unknown';

162         }

163     }

164     

165     /*

166         Check System

167     */

168     if (patternWindows.test(info)) { // Windows

169         browserDetect.system.version = parseFloat(patternWindows.exec(info)[1]);

170         switch (browserDetect.system.version) {

171             case 5.0 :

172                 browserDetect.system.name = 'Windows 2000';

173                 break;

174             case 5.1 :

175                 browserDetect.system.name = 'Windows XP';

176                 break;

177             case 5.2 : 

178                 browserDetect.system.name = 'Windows Server 2003 / Windows Server 2003 R2';

179                 break;

180             case 6.0 :

181                 browserDetect.system.name = 'Windows Vista / Windows Server 2008';

182                 break;

183             case 6.1 : 

184                 browserDetect.system.name = 'Windows 7 / Windows Server 2008 R2';

185                 break;

186             case 6.2 : 

187                 browserDetect.system.name = 'Windows 8 / Windows Server 2012 / Windows Phone 8';

188                 break

189             case 6.3 :

190                 browserDetect.system.name = 'Windows 8.1 / Windows Server 2012 R2';

191                 break;

192             default :

193                 browserDetect.system.name = 'Windows';

194         }

195     } else if (patternWin.test(system)) { // Windows(low version browser)

196         browserDetect.system.name = 'Windows';

197         browserDetect.system.version = 'Unknown';

198     } else if (patternLinux.test(system)) { // Linux

199         browserDetect.system.name = 'Linux';

200         browserDetect.system.version = 'Unknown';

201     } else if (patternUnix.test(system)) { // Unix

202         browserDetect.system.name = 'Unix';

203         browserDetect.system.version = 'Unknown';

204     } else if (patternMac.test(system)) { // Mac

205         browserDetect.system.name = 'Mac';

206         browserDetect.system.version = 'Unknown';

207     } else { // Other

208         browserDetect.system.name = 'Other';

209         browserDetect.system.version = 'Unknown';

210     }

211     

212 })();
 1 /*

 2     源码作者: 石不易(Louis Shi)

 3     联系方式: http://www.shibuyi.net

 4     ===================================================================================================

 5     特效插件: 元素隐藏

 6     特效插件: 元素显示

 7     特效插件: 鼠标移入移出(下拉菜单)

 8 */

 9 $().plugins(['hide', 'show', 'hover'], [function () {

10     this.css('display', 'none');

11     return this;

12 }, function () {

13     this.css('display', 'block');

14     return this;

15 }, function (overMethod, outMethod) {

16     this.nodeEvent('mouseover', overMethod);

17     this.nodeEvent('mouseout', outMethod);

18     return this;

19 }]);
 1 /*

 2     源码作者: 石不易(Louis Shi)

 3     联系方式: http://www.shibuyi.net

 4     ===================================================================================================

 5     特效插件: 元素居中

 6 */

 7 $().plugins('center', function () {

 8     var windowRectangle = Base.getWindowRectangle();

 9     var scroll = Base.scroll();

10     var innerRectangle = null, x = 0, y = 0;

11     for (var i = 0; i < this.elements.length; i ++) {

12         Base.absolute(this.elements[i]);

13         innerRectangle = Base.getInnerRectangle(this.elements[i]);

14         x = (windowRectangle.width - innerRectangle.width) / 2;

15         y = (windowRectangle.height - innerRectangle.height) / 2;

16         if (x < 0) x = 0;

17         if (y < 0) y = 0;

18         $(this.elements[i]).css(['left = ' + (x + scroll.x) + 'px', 'top = ' + (y + scroll.y) + 'px']);

19     }

20     return this;

21 });
 1 /*

 2     源码作者: 石不易(Louis Shi)

 3     联系方式: http://www.shibuyi.net

 4     ===================================================================================================

 5     特效插件: 遮罩锁屏

 6     特效插件: 清除遮罩

 7 */

 8 $().plugins(['lock', 'unlock'], [function () {

 9     var screen = null;

10     if ((screen = $('#screen').firstNode()) != this.info) {

11         if (Base.trim($(Base.comment(screen)).html()) != '') {

12             Base.removeElement(screen);

13             screen = Base.addElement('div', 'id = screen');

14         }

15     } else {

16         screen = Base.addElement('div', 'id = screen');

17     }

18     var scroll = Base.scroll();

19     $('html').css('overflow', 'hidden');

20     Base.scroll(scroll.x, scroll.y);

21     var windowRectangle = Base.getWindowRectangle();

22     Base.absolute(screen);

23     $(screen).css([

24                                 'width = ' + windowRectangle.width + 'px', 

25                                 'height = ' + windowRectangle.height + 'px', 

26                                 'left = ' + scroll.x + 'px',

27                                 'top = ' + scroll.y + 'px',

28                                 'backgroundColor = black', 

29                                 'zIndex = 9998', 

30                                 'opacity = 0.4', // W3C

31                                 'filter = alpha(opacity = 40)' // IE 6/7/8

32                             ]).show();

33     Base.fixed(); // 修正 Bug

34     return this;

35 }, function () {

36     var screen = null;

37     if ((screen = $('#screen').firstNode()) == this.info) return this;

38     var scroll = Base.scroll();

39     $('html').css('overflow', 'auto');

40     Base.scroll(scroll.x, scroll.y);

41     $(screen).hide();

42     return this;

43 }]);
 1 /*

 2     源码作者: 石不易(Louis Shi)

 3     联系方式: http://www.shibuyi.net

 4     ===================================================================================================

 5     特效插件: 元素拖拽

 6 */

 7 $().plugins('drag', function () {

 8     var selector = null, childs = [];

 9     for (var j = 0; j < this.elements.length; j ++) {

10         if (arguments.length != 0) {

11             for (var i = 0; i < arguments.length; i ++) {

12                 if ((selector = $(this.elements[j]).selector(arguments[i]).getNodes()) == this.info) continue;

13                 childs.push(selector);

14             }

15         }

16         if (childs.length == 0) childs.push(this.elements[j]);

17         var targetNode = this.elements[j];

18         Base.absolute(targetNode);

19         var down = function (event) {

20             var scroll = Base.scroll();

21             var outerRectangle = Base.getOuterRectangle(targetNode);

22             var fixedX = (event.clientX + scroll.x) - outerRectangle.left;

23             var fixedY = (event.clientY + scroll.y) - outerRectangle.top;

24             var windowRectangle = Base.getWindowRectangle();

25             var innerRectangle = Base.getInnerRectangle(targetNode);

26             Tool.setCaptureIE(targetNode); // 兼容 IE Bug

27             var move = function (event) {

28                 var x = (event.clientX + scroll.x) - fixedX;

29                 var y = (event.clientY + scroll.y) - fixedY;

30                 var minX = scroll.x, minY = scroll.y, maxX = 0, maxY = 0;

31                 maxX = (windowRectangle.width + scroll.x) - innerRectangle.width;

32                 maxY = (windowRectangle.height + scroll.y) - innerRectangle.height;

33                 if (x < minX) x = minX; else if (x > maxX) x = maxX;

34                 if (y < minY) y = minY; else if (y > maxY) y = maxY;

35                 $(targetNode).css(['left = ' + x + 'px', 'top = ' + y + 'px']);

36             };

37             var up = function () {

38                 Tool.releaseCaptureIE(targetNode); // 兼容 IE Bug

39                 $(document).nodeEvent('mousemove', move, false);

40                 $(document).nodeEvent('mouseup', up, false);

41             };

42             $(document).nodeEvent('mousemove', move);

43             $(document).nodeEvent('mouseup', up);

44         };

45         for (var k = 0; k < childs.length; k ++) {

46             if (childs[k] instanceof Array) { // 集群

47                 for (var l = 0; l < childs[k].length; l ++) {

48                     $(childs[k][l]).nodeEvent('mousedown', down);

49                 }

50             } else { // 单一

51                 $(childs[k]).nodeEvent('mousedown', down);

52             }

53         }

54     }

55     return this;

56 });
 1 /*

 2     源码作者: 石不易(Louis Shi)

 3     联系方式: http://www.shibuyi.net

 4     ===================================================================================================

 5     特效插件: 禁止元素溢出可视区

 6 */

 7 $().plugins('overflow', function () {

 8     var windowRectangle = Base.getWindowRectangle();

 9     var scroll = Base.scroll();

10     var minX = scroll.x, minY = scroll.y, maxX = 0, maxY = 0, x = 0, y = 0;

11     var innerRectangle = null, outerRectangle = null;

12     for (var i = 0; i < this.elements.length; i ++) {

13         Base.absolute(this.elements[i]);

14         innerRectangle = Base.getInnerRectangle(this.elements[i]);

15         outerRectangle = Base.getOuterRectangle(this.elements[i]);

16         x = outerRectangle.left;

17         y = outerRectangle.top;

18         maxX = (windowRectangle.width + scroll.x) - innerRectangle.width;

19         maxY = (windowRectangle.height + scroll.y) - innerRectangle.height;

20         if (x < minX) x = minX; else if (x > maxX) x = maxX;

21         if (y < minY) y = minY; else if (y > maxY) y = maxY;

22         $(this.elements[i]).css(['left = ' + x + 'px', 'top = ' + y + 'px']);

23     }

24     return this;

25 });

 

关于 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)