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 原型版核心源码与实例演示的获取请移动至官网下载!
感谢大家积极评测给予意见!
CNBlogs 博客:http://www.cnblogs.com/shibuyi/
CSDN 博客:http://blog.csdn.net/louis_shi/
ITeye 博客:http://shibuyi.iteye.com/