首页 > 代码库 > 【JavaScript 封装库】BETA 3.0 测试版发布!
【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 ‘.‘ : // class252 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 + id264 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 + class276 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 { // tagName288 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 = http://www.mamicode.com/function (text) {329 var value =http://www.mamicode.com/ [];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 =http://www.mamicode.com/ 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 // 获取与设置 CSS350 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 = http://www.mamicode.com/‘‘;355 for (var i = 0; i < cssKey.length; i ++) {356 if (patternStyle.test(cssKey[i])) {357 key = patternStyle.exec(cssKey[i])[1];358 value = http://www.mamicode.com/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 : ruleNumber527 }528 };529 530 // 库方法: 检测 class531 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)) { // tagName543 positioner = patternTag.exec(positioner)[2];544 nodes = $().getTagName(positioner).getNodes();545 } else if (patternClass.test(positioner)) { // class546 positioner = patternClass.exec(positioner)[2];547 nodes = $().getClass(positioner).getNodes();548 } else if (patternId.test(positioner)) { // id549 positioner = patternId.exec(positioner)[1];550 nodes = $().getId(positioner).getNodes();551 } else { // id552 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 = http://www.mamicode.com/‘‘;628 if (patternAttribute.test(attributes)) {629 key = patternAttribute.exec(attributes)[1];630 value = http://www.mamicode.com/patternAttribute.exec(attributes)[2];631 var patternClass = /^class(Name)?$/i, className = [];632 if (key == ‘style‘) { // CSS633 this.style(value, elementNode);634 } else if (patternClass.test(key)) { // class635 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 = http://www.mamicode.com/‘‘;653 if (patternCSS.test(css)) {654 cssKey = patternCSS.exec(css)[1];655 cssValue = http://www.mamicode.com/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/8735 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 : height744 };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/8756 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 : top765 };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 = http://www.mamicode.com/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‘) { // W3C112 elementNode.addEventListener(eventName, method, false);113 } else if (typeof elementNode.attachEvent != ‘undefined‘) { // IE 6/7/8114 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‘) { // W3C134 elementNode.removeEventListener(eventName, method, false);135 } else if (typeof elementNode.detachEvent != ‘undefined‘) { // IE 6/7/8136 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/8148 if (typeof elementNode.onmousewheel != ‘undefined‘) { // Not Firefox149 mode ? this.loginEvent(elementNode, ‘mousewheel‘, method) : this.logoutEvent(elementNode, ‘mousewheel‘, method);150 } else { // Firefox151 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 W3C162 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 W3C167 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/8173 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‘) { // W3C188 return targetNode.compareDocumentPosition(elementNode) == 20;189 } else if (typeof targetNode.contains != ‘undefined‘) { // IE 6/7/8190 return targetNode.contains(elementNode);191 }192 },193 194 // 跨浏览器获取与设置滚动条x轴195 scrollLeft : function (x) {196 if (browserDetect.engine.name == ‘WebKit‘) { // Chrome / Safari197 if (typeof x != ‘undefined‘) { // 设置198 document.body.scrollLeft = x;199 } else { // 获取200 return document.body.scrollLeft;201 }202 } else { // Not Chrome / Safari203 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 / Safari214 if (typeof y != ‘undefined‘) { // 设置215 document.body.scrollTop = y;216 } else { // 获取217 return document.body.scrollTop;218 }219 } else { // Not Chrome / Safari220 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‘) { // W3C231 return window.innerWidth;232 } else if (typeof document.documentElement.clientWidth != ‘undefined‘) { // IE 6/7/8233 return document.documentElement.clientWidth;234 }235 },236 237 // 跨浏览器获取网页y轴可视区域尺寸238 getWindowHeight : function () {239 if (typeof window.innerHeight != ‘undefined‘) { // W3C240 return window.innerHeight;241 } else if (typeof document.documentElement.clientHeight) { // IE 6/7/8242 return document.documentElement.clientHeight;243 }244 },245 246 // IE 专属: 浏览器外捕获鼠标按下247 setCaptureIE : function (elementNode) {248 if (typeof elementNode.setCapture != ‘undefined‘) { // IE249 elementNode.setCapture();250 }251 },252 253 // IE 专属: 浏览器外捕获鼠标弹起254 releaseCaptureIE : function (elementNode) {255 if (typeof elementNode.releaseCapture != ‘undefined‘) { // IE256 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)) { // Firefox107 browserDetect.firefox = true;108 browserDetect.browser.name = ‘Firefox‘;109 browserDetect.browser.version = parseFloat(patternFirefox.exec(info)[1]);110 } else if (patternChrome.test(info)) { // Chrome111 browserDetect.chrome = true;112 browserDetect.browser.name = ‘Chrome‘;113 browserDetect.browser.version = parseFloat(patternChrome.exec(info)[1]);114 } else if (patternSafari.test(info)) { // Safari115 browserDetect.safari = true;116 browserDetect.browser.name = ‘Safari‘;117 var patternVersion = /Version\/([\d\.]+)/i;118 if (patternVersion.test(info)) { // high version119 browserDetect.browser.version = parseFloat(patternVersion.exec(info)[1]);120 } else { // low version121 browserDetect.browser.version = parseFloat(patternSafari.exec(info)[1]);122 }123 } else if (patternOpera.test(info)) { // Opera124 browserDetect.opera = true;125 browserDetect.browser.name = ‘Opera‘;126 var patternVersion = /Version\/([\d\.]+)/i;127 if (patternVersion.test(info)) { // high version128 browserDetect.browser.version = parseFloat(patternVersion.exec(info)[1]);129 } else { // low version130 browserDetect.browser.version = parseFloat(patternOpera.exec(info)[1]);131 }132 } else { // Other133 browserDetect.other = true;134 browserDetect.browser.name = ‘Other‘;135 browserDetect.browser.version = ‘Unknown‘;136 }137 138 /*139 Check Engine140 */141 if (patternTrident.test(info)) { // Trident142 browserDetect.engine.name = ‘Trident‘;143 browserDetect.engine.version = parseFloat(patternTrident.exec(info)[1]);144 } else if (patternGecko.test(info)) { // Gecko145 browserDetect.engine.name = ‘Gecko‘;146 var patternVersion = /rv:([\d\.]+)/i;147 if (patternVersion.test(info)) { // high version148 browserDetect.engine.version = parseFloat(patternVersion.exec(info)[1]);149 } else { // low version150 browserDetect.engine.version = parseFloat(patternGecko.exec(info)[1]);151 }152 } else if (patternWebKit.test(info)) { // WebKit153 browserDetect.engine.name = ‘WebKit‘;154 browserDetect.engine.version = parseFloat(patternWebKit.exec(info)[1]);155 } else if (patternPresto.test(info)) { // Presto156 browserDetect.engine.name = ‘Presto‘;157 browserDetect.engine.version = parseFloat(patternPresto.exec(info)[1]);158 } else { // Other159 if (browserDetect.other) {160 browserDetect.engine.name = ‘Other‘;161 browserDetect.engine.version = ‘Unknown‘;162 }163 }164 165 /*166 Check System167 */168 if (patternWindows.test(info)) { // Windows169 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 break189 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)) { // Linux199 browserDetect.system.name = ‘Linux‘;200 browserDetect.system.version = ‘Unknown‘;201 } else if (patternUnix.test(system)) { // Unix202 browserDetect.system.name = ‘Unix‘;203 browserDetect.system.version = ‘Unknown‘;204 } else if (patternMac.test(system)) { // Mac205 browserDetect.system.name = ‘Mac‘;206 browserDetect.system.version = ‘Unknown‘;207 } else { // Other208 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‘, // W3C31 ‘filter = alpha(opacity = 40)‘ // IE 6/7/832 ]).show();33 Base.fixed(); // 修正 Bug34 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 Bug27 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 Bug39 $(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 2.0 原型版核心源码与实例演示的获取请移动至官网下载!
感谢大家积极评测给予意见!
官网地址:http://www.shibuyi.net
CNBlogs 博客:http://www.cnblogs.com/shibuyi/
CSDN 博客:http://blog.csdn.net/louis_shi/
ITeye 博客:http://shibuyi.iteye.com/
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。