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

  1 /*
  2     源码作者: 石不易(Louis Shi)
  3     联系方式: http://www.shibuyi.net
  4     ===================================================================================================
  5     程序名称: JavaScript 工具库(跨浏览器兼容) BETA 2.0 版
  6     迭代版本: BETA 1.0
  7     功能总数: 18 个
  8     新增总数: 3 个
  9     删除总数: 2 个
 10     追加功能:
 11         1. 跨浏览器检测元素从属关系(直接从属+间接从属)
 12         2. 跨浏览器获取与设置滚动条(x轴+y轴)
 13         ...
 14     优化功能:
 15         1. 跨浏览器现代事件绑定(注册事件+注销事件)
 16         2. 跨浏览器配备事件对象(IE 6/7/8 专属)
 17         ...
 18     删除功能:
 19         1. 跨浏览器取消事件冒泡
 20         2. 跨浏览器取消事件默认行为
 21         ...
 22 */
 23 // 工具库
 24 var Tool = {
 25
 26         // 数组排序
 27         sort : function () {
 28             return {
 29                 minToMax : function (min, max) { // 正序: 从小到大
 30                     if (min < max) {
 31                         return -1;
 32                     } else if (min > max) {
 33                         return 1;
 34                     } else {
 35                         return 0;
 36                     }
 37                 },
 38                 maxToMin : function (min, max) { // 倒序: 从大到小
 39                     if (min < max) {
 40                         return 1;
 41                     } else if (min > max) {
 42                         return -1;
 43                     } else {
 44                         return 0;
 45                     }
 46                 }
 47             }
 48         },
 49
 50         // 跨浏览器获取计算后的 CSS 样式
 51         getStyle : function (elementNode, cssKey) {
 52             if (typeof window.getComputedStyle != 'undefined') { // W3C
 53                 return window.getComputedStyle(elementNode, null)[cssKey];
 54             } else if (typeof elementNode.currentStyle != 'undefined') { // IE 6/7/8
 55                 return elementNode.currentStyle[cssKey];
 56             }
 57         },
 58
 59         // 跨浏览器添加样式规则
 60         addRule : function (sheet, ruleName, ruleText, rulePosition) {
 61             if (typeof sheet.insertRule != 'undefined') { // W3C
 62                 sheet.insertRule(ruleName + ' {' + ruleText + '}', rulePosition);
 63             } else if (typeof sheet.addRule != 'undefined') { // IE 6/7/8
 64                 sheet.addRule(ruleName, ruleText, rulePosition);
 65             }
 66         },
 67
 68         // 跨浏览器移除样式规则
 69         removeRule : function (sheet, rulePosition) {
 70             if (typeof sheet.deleteRule != 'undefined') { // W3C
 71                 sheet.deleteRule(rulePosition);
 72             } else if (typeof sheet.removeRule != 'undefined') { // IE 6/7/8
 73                 sheet.removeRule(rulePosition);
 74             }
 75         },
 76
 77         // 跨浏览器获取样式规则总数
 78         getRules : function (sheet) {
 79             if (typeof sheet.cssRules != 'undefined') { // W3C
 80                 return sheet.cssRules.length;
 81             } else if (typeof sheet.rules != 'undefined') { // IE 6/7/8
 82                 return sheet.rules.length;
 83             }
 84         },
 85
 86         // 事件绑定计数器
 87         eventId : 0,
 88
 89         // 跨浏览器现代事件绑定: 注册事件
 90         loginEvent : function (elementNode, eventName, method) {
 91             if (eventName.indexOf('on') == 0) eventName = eventName.substring(2, eventName.length);
 92             if (typeof elementNode.addEventListener != 'undefined') { // W3C
 93                 elementNode.addEventListener(eventName, method, false);
 94             } else if (typeof elementNode.attachEvent != 'undefined') { // IE 6/7/8
 95                 // 创建哈希表,存储事件数组
 96                 if (typeof elementNode.hashTable != 'object') elementNode.hashTable = {};
 97                 // 创建事件数组,储存事件方法
 98                 if (typeof elementNode.hashTable[eventName] != 'object') elementNode.hashTable[eventName] = [];
 99                 // 获取事件数组
100                 var events = elementNode.hashTable[eventName];
101                 // 检测同一节点、同一事件是否方法重复
102                 for (var i = 0; i < events.length; i ++) {
103                     if (events[i] == method) return false;
104                 }
105                 // 储存事件方法
106                 events[this.eventId ++] = method;
107                 var _this = this;
108                 // 执行事件方法
109                 elementNode['on' + eventName] = function () {
110                     var event = _this.eventIE(window.event);
111                     for (var i = 0; i < events.length; i ++) {
112                         if (typeof events[i] != 'undefined') events[i].call(this, event);
113                     }
114                 };
115
116             }
117         },
118
119         // 跨浏览器现代事件绑定: 注销事件
120         logoutEvent : function (elementNode, eventName, method) {
121             if (eventName.indexOf('on') == 0) eventName = eventName.substring(2, eventName.length);
122             if (typeof elementNode.removeEventListener != 'undefined') { // W3C
123                 elementNode.removeEventListener(eventName, method, false);
124             } else if (typeof elementNode.detachEvent != 'undefined') { // IE 6/7/8
125                 if (typeof elementNode.hashTable != 'undefined' && typeof elementNode.hashTable[eventName] != 'undefined') {
126                     var events = elementNode.hashTable[eventName];
127                     for (var i = 0; i < events.length; i ++) {
128                         if (events[i] == method) delete events[i];
129                     }
130                 }
131             }
132         },
133
134         // 跨浏览器配备事件对象(IE 6/7/8 专属)
135         eventIE : function (event) {
136             // 配备取消事件冒泡
137             event.stopPropagation = function () {
138                 event.cancelBubble = true;
139             };
140
141             // 配备取消事件默认行为
142             event.preventDefault = function () {
143                 event.returnValue = false;
144             };
145
146             // 配备获取事件绑定对象
147             event.target = event.srcElement;
148
149             return event;
150         },
151
152         // 跨浏览器鼠标滚轮(中键)事件
153         mousewheel : function (elementNode, method, mode) {
154             if (typeof elementNode.onmousewheel != 'undefined') { // 非 Firefox
155                 mode ? this.loginEvent(elementNode, 'mousewheel', method) : this.logoutEvent(elementNode, 'mousewheel', method);
156             } else { // Firefox
157                 mode ? this.loginEvent(elementNode, 'DOMMouseScroll', method) : this.logoutEvent(elementNode, 'DOMMouseScroll', method);
158             }
159         },
160
161         // 跨浏览器检测元素从属关系(直接从属+间接从属)
162         hasChildNode : function (parentElement, elementNode) {
163             if (typeof parentElement.contains != 'undefined') { // W3C
164                 return parentElement.contains(elementNode);
165             } else if (typeof parentElement.compareDocumentPosition != 'undefined') { // 低版本浏览器
166                 return parentElement.compareDocumentPosition(elementNode) == 20;
167             }
168             return false;
169         },
170
171         // 跨浏览器获取网页可视区宽度尺寸
172         getInnerWidth : function () {
173             if (typeof window.innerWidth != 'undefined') { // W3C
174                 return window.innerWidth;
175             } else { // IE 6/7/8
176                 return document.documentElement.clientWidth;
177             }
178         },
179
180         // 跨浏览器获取网页可视区高度尺寸
181         getInnerHeight : function () {
182             if (typeof window.innerHeight != 'undefined') { // W3C
183                 return window.innerHeight;
184             } else { // IE 6/7/8
185                 return document.documentElement.clientHeight;
186             }
187         },
188
189         // 跨浏览器重置横向窗体滚动条
190         scrollInitializationX : function () {
191             this.scrollX(0);
192         },
193
194         // 跨浏览器重置纵向窗体滚动条
195         scrollInitializationY : function () {
196             this.scrollY(0);
197         },
198
199         // 跨浏览器获取与设置滚动条X轴
200         scrollX : function (x) {
201             if (typeof x != 'undefined') { // 设置
202                 document.documentElement.scrollLeft = x; // 非 Chrome / Safari
203                 document.body.scrollLeft = x; // Chrome / Safari
204             } else { // 获取
205                 return document.documentElement.scrollLeft == 0 ? document.body.scrollLeft : document.documentElement.scrollLeft;
206             }
207         },
208
209         // 跨浏览器获取与设置滚动条Y轴
210         scrollY : function (y) {
211             if (typeof y != 'undefined') { // 设置
212                 document.documentElement.scrollTop = y;
213                 document.body.scrollTop = y;
214             } else { // 获取
215                 return document.documentElement.scrollTop == 0 ? document.body.scrollTop : document.documentElement.scrollTop;
216             }
217         },
218
219         // IE 专属事件: 浏览器外捕获鼠标按下
220         setCaptureIE : function (elementNode) {
221             if (typeof elementNode.setCapture != 'undefined') { // IE
222                 elementNode.setCapture();
223             }
224         },
225
226         // IE 专属事件: 浏览器外捕获鼠标弹起
227         releaseCaptureIE : function (elementNode) {
228             if (typeof elementNode.releaseCapture != 'undefined') { // IE
229                 elementNode.releaseCapture();
230             }
231         }
232 };

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

转载于:https://www.cnblogs.com/shibuyi/p/3874607.html

【JavaScript 封装库】BETA 2.0 测试版发布!相关推荐

  1. 微信 for Mac 3.1.0 测试版发布(附安装包),新增「发朋友圈」功能

    今年 3 月份,微信 for Mac 3.0 发布,上线了「朋友圈」功能,但当时还只能「刷朋友圈」,而不能「发朋友圈」. 近日,微信 for Mac 3.1.0 测试版发布,此版本新增了「发朋友圈」和 ...

  2. 雨林木风Ylmf OS 3.0测试版发布

    雨林木风Ylmf OS 3.0测试版发布啦,上图! 下面的股票软件本人更推荐 转载于:https://blog.51cto.com/kpjack/316595

  3. python爬取微信群聊天信息_微信 Windows 3.1.0 测试版发布:群聊设置备注,聊天列表不显示某个聊天...

    新酷产品第一时间免费试玩,还有众多优质达人分享独到生活经验,快来新浪众测,体验各领域最前沿.最有趣.最好玩的产品吧~!下载客户端还能获得专享福利哦! 原标题:微信 Windows 3.1.0 测试版发 ...

  4. 路过秋天版博客 V2.0 测试版发布 公测一周[支持多语言、多用户、多数据库、目录级URL]...

    路过秋天版博客发布历史回顾: 1:2010年11月08日---支持多语言.多用户.多数据库.目录级URL之路过秋天版博客发布[绝对有杀伤力的博客] 2:2010年11月10日---基础却容易被忽略的那 ...

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

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

  6. Ylmf OS 3.0 测试版发布

    雨林木风开源操作系统一直受到全球关注,有更多的资深使用者加入到协助完善里来,提出来很多有关用户体验的建议,对雨林木风开发团队启发极大,希望 Linux 老用户用着更顺手,新用户入门更容易. 我们坚信, ...

  7. VS终结者即Breeze's Terminator V1.0 测试版发布【紧急修复】

    ☆ 修复说明 ☆ * 修复工具在win7系统下引起VS异常结束的问题,感谢[耗啊游]提供反馈信息! ☆ 功能 ☆ * 终结VS平台反作弊模块,使用该工具破解VS后,可在VS平台运行任何魔兽外挂(请大家 ...

  8. Linux下USB小工具usbmanager 1.0测试版发布

    最近因为需要调试一些USB设备驱动,需要频繁的在Linux下查看USB设备信息,发现Linux下USB设备管理起来非常不方便.lsusb 显示连接在系统上的USB设备信息,显示的信息比较乱,查看起来不 ...

  9. Excel 批量打印合集1.0测试版发布

    版本已更新,请到 这里查看 (此版本比较稳定,能够批量打印工作簿,批量打印工作表,批量加密,批量解密,批量转换格式) 能够打印指定的一批工作簿.工作表,对表格指定位置依次填充指定的数据然后打印.附加于 ...

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

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

最新文章

  1. 信息哲学给哲学带来根本性革命了吗
  2. Linux shell条件判断if中的-a到-z的意思
  3. JDBC批量操作批量增加批量修改
  4. 这个行业人才紧缺,就业率超高!未来大有可为!
  5. cmd怎么进入linux系统时间,Linux怎么更改命令提示符信息
  6. tp5命令行基础介绍
  7. wh计算公式_“笔记本”电池里的mAh和Wh有啥区别
  8. Android中ProgressDialog的应用
  9. Node.js+windows
  10. 研究理解lanproxy实现内网穿透
  11. db4o_8.0对象数据库官方文档翻译_学习笔记四
  12. win7电脑误删鼠标键盘驱动_电脑usb驱动误删鼠标键盘怎么解决?
  13. R语言实例:根据中国省份简称绘制着色图
  14. 微信小程序tabbar消失_微信小程序tabBar 返回tabBar不刷新页面
  15. 在抖音追剧要付费了,微短剧能成字节新财富密码吗?
  16. 互联网赚钱要有自己的核心思想,我为自己的分秒挣赚软件网创事业代言
  17. 分叉币的发展史及价值|ETH、BCH、BSV 2020-03-08
  18. A Comparative Analysis of Deep Learning Approaches for Network Intrusion Detection Systems (N-IDSs)
  19. 搭建LDAP服务器详细流程
  20. 盘点互联网大佬背后的女人,最后一个你肯定认识

热门文章

  1. SQL Server 2008入门系列之设置数据库服务器的访问权限
  2. 企业网络管理员如何有效封杀QQ
  3. 中国武术和泰拳的对抗史
  4. Ubuntu 右键打开终端
  5. 一线大厂都在跑的微服务,真有这么香吗?
  6. 腾讯等技术大佬分享的高可用架构干货,全在这里了
  7. 阿里架构师必学的2019最新资料!首次公布
  8. 阿里巴巴为什么要禁用Executors创建线程池?
  9. Linux 系统故障修复和修复技巧
  10. 推荐两个有意思的公号