zoukankan      html  css  js  c++  java
  • base库

      1 /*
      2  * 跨浏览器基础库===============================================
      3  * */
      4 
      5 //浏览器检测
      6 (function () {
      7     window.sys = {};
      8     var ua = navigator.userAgent.toLowerCase();
      9     var s;
     10     (s = ua.match(/msie ([d.]+)/)) ? sys.ie = s[1] :
     11         (s = ua.match(/firefox/([d.]+)/)) ? sys.firefox = s[1] :
     12             (s = ua.match(/chrome/([d.]+)/)) ? sys.chrome = s[1] :
     13                 (s = ua.match(/opera/.*version/([d.]+)/)) ? sys.opera = s[1] :
     14                     (s = ua.match(/version/([d.]+).*safari/)) ? sys.safari = s[1] : 0;
     15 
     16     if (/webkit/.test(ua)) sys.webkit = ua.match(/webkit/([d.]+)/)[1];
     17 })();
     18 
     19 //DOM加载
     20 function addDomLoaded(fn) {
     21     var isReady = false;
     22     var timer = null;
     23     function doReady() {
     24         if (timer) clearInterval(timer);
     25         if (isReady) return;
     26         isReady = true;
     27         fn();
     28     }
     29 
     30     if ((sys.opera && sys.opera < 9) || (sys.firefox && sys.firefox < 3) || (sys.webkit && sys.webkit < 525)) {
     31         //无论采用哪种,基本上用不着了
     32         /*timer = setInterval(function () {
     33          if (/loaded|complete/.test(document.readyState)) {     //loaded是部分加载,有可能只是DOM加载完毕,complete是完全加载,类似于onload
     34          doReady();
     35          }
     36          }, 1);*/
     37 
     38         timer = setInterval(function () {
     39             if (document && document.getElementById && document.getElementsByTagName && document.body) {
     40                 doReady();
     41             }
     42         }, 1);
     43     } else if (document.addEventListener) {//W3C
     44         addEvent(document, 'DOMContentLoaded', function () {
     45             fn();
     46             removeEvent(document, 'DOMContentLoaded', arguments.callee);
     47         });
     48     } else if (sys.ie && sys.ie < 9){
     49         var timer = null;
     50         timer = setInterval(function () {
     51             try {
     52                 document.documentElement.doScroll('left');
     53                 doReady();
     54             } catch (e) {};
     55         }, 1);
     56     }
     57 }
     58 
     59 //跨浏览器添加事件绑定
     60 function addEvent(obj, type, fn) {
     61     if (typeof obj.addEventListener != 'undefined') {
     62         obj.addEventListener(type, fn, false);
     63     } else {
     64         //创建一个存放事件的哈希表(散列表)
     65         if (!obj.events) obj.events = {};
     66         //第一次执行时执行
     67         if (!obj.events[type]) {
     68             //创建一个存放事件处理函数的数组
     69             obj.events[type] = [];
     70             //把第一次的事件处理函数先储存到第一个位置上
     71             if (obj['on' + type]) obj.events[type][0] = fn;
     72         } else {
     73             //同一个注册函数进行屏蔽,不添加到计数器中
     74             if (addEvent.equal(obj.events[type], fn)) return false;
     75         }
     76         //从第二次开始我们用事件计数器来存储
     77         obj.events[type][addEvent.ID++] = fn;
     78         //执行事件处理函数
     79         obj['on' + type] = addEvent.exec;
     80     }
     81 }
     82 
     83 //为每个事件分配一个计数器
     84 addEvent.ID = 1;
     85 
     86 //执行事件处理函数
     87 addEvent.exec = function (event) {
     88     var e = event || addEvent.fixEvent(window.event);
     89     var es = this.events[e.type];
     90     for (var i in es) {
     91         es[i].call(this, e);
     92     }
     93 };
     94 
     95 //同一个注册函数进行屏蔽
     96 addEvent.equal = function (es, fn) {
     97     for (var i in es) {
     98         if (es[i] == fn) return true;
     99     }
    100     return false;
    101 }
    102 
    103 //把IE常用的Event对象配对到W3C中去
    104 addEvent.fixEvent = function (event) {
    105     event.preventDefault = addEvent.fixEvent.preventDefault;
    106     event.stopPropagation = addEvent.fixEvent.stopPropagation;
    107     event.target = event.srcElement;
    108     return event;
    109 };
    110 
    111 //IE阻止默认行为
    112 addEvent.fixEvent.preventDefault = function () {
    113     this.returnValue = false;
    114 };
    115 
    116 //IE取消冒泡
    117 addEvent.fixEvent.stopPropagation = function () {
    118     this.cancelBubble = true;
    119 };
    120 
    121 
    122 //跨浏览器删除事件
    123 function removeEvent(obj, type, fn) {
    124     if (typeof obj.removeEventListener != 'undefined') {
    125         obj.removeEventListener(type, fn, false);
    126     } else {
    127         if (obj.events) {
    128             for (var i in obj.events[type]) {
    129                 if (obj.events[type][i] == fn) {
    130                     delete obj.events[type][i];
    131                 }
    132             }
    133         }
    134     }
    135 }
    136 
    137 
    138 //跨浏览器获取视口大小
    139 function getInner() {
    140     if (typeof window.innerWidth != 'undefined') {
    141         return {
    142             width : window.innerWidth,
    143             height : window.innerHeight
    144         }
    145     } else {
    146         return {
    147             width : document.documentElement.clientWidth,
    148             height : document.documentElement.clientHeight
    149         }
    150     }
    151 }
    152 
    153 //跨浏览器获取滚动条位置
    154 function getScroll() {
    155     return {
    156         top : document.documentElement.scrollTop || document.body.scrollTop,
    157         left : document.documentElement.scrollLeft || document.body.scrollLeft
    158     }
    159 }
    160 
    161 
    162 //跨浏览器获取Style
    163 function getStyle(element, attr) {
    164     var value;
    165     if (typeof window.getComputedStyle != 'undefined') {//W3C
    166         value = window.getComputedStyle(element, null)[attr];
    167     } else if (typeof element.currentStyle != 'undeinfed') {//IE
    168         value = element.currentStyle[attr];
    169     }
    170     return value;
    171 }
    172 
    173 
    174 //判断class是否存在
    175 function hasClass(element, className) {
    176     return element.className.match(new RegExp('(\s|^)' +className +'(\s|$)'));
    177 }
    178 
    179 
    180 //跨浏览器添加link规则
    181 function insertRule(sheet, selectorText, cssText, position) {
    182     if (typeof sheet.insertRule != 'undefined') {//W3C
    183         sheet.insertRule(selectorText + '{' + cssText + '}', position);
    184     } else if (typeof sheet.addRule != 'undefined') {//IE
    185         sheet.addRule(selectorText, cssText, position);
    186     }
    187 }
    188 
    189 //跨浏览器移出link规则
    190 function deleteRule(sheet, index) {
    191     if (typeof sheet.deleteRule != 'undefined') {//W3C
    192         sheet.deleteRule(index);
    193     } else if (typeof sheet.removeRule != 'undefined') {//IE
    194         sheet.removeRule(index);
    195     }
    196 }
    197 
    198 //跨浏览器获取innerText
    199 function getInnerText(element) {
    200     return (typeof element.textContent == 'string') ? element.textContent : element.innerText;
    201 }
    202 
    203 //跨浏览器设置innerText
    204 function setInnerText(elememt, text) {
    205     if (typeof element.textContent == 'string') {
    206         element.textContent = text;
    207     } else {
    208         element.innerText = text;
    209     }
    210 }
    211 
    212 //获取某一个元素到最外层顶点的位置
    213 function offsetTop(element) {
    214     var top = element.offsetTop;
    215     var parent = element.offsetParent;
    216     while (parent != null) {
    217         top += parent.offsetTop;
    218         parent = parent.offsetParent;
    219     }
    220     return top;
    221 }
    222 
    223 //删除左后空格
    224 function trim(str) {
    225     return str.replace(/(^s*)|(s*$)/g, '');
    226 }
    227 
    228 //某一个值是否存在某一个数组中
    229 function inArray(array, value) {
    230     for (var i in array) {
    231         if (array[i] === value) return true;
    232     }
    233     return false;
    234 }
    235 
    236 //获取某一个节点的上一个节点的索引
    237 function prevIndex(current, parent) {
    238     var currentNum  = parseInt(current);
    239     var length = parent.children.length;
    240     if (currentNum == 0) return length - 1;
    241     return currentNum - 1;
    242 }
    243 
    244 //获取某一个节点的下一个节点的索引
    245 function nextIndex(current, parent) {
    246     var currentNum  = parseInt(current);
    247     var length = parent.children.length;
    248     if (currentNum == length - 1) return 0;
    249     return currentNum + 1;
    250 }
    251 //滚动条固定
    252 function fixedScroll() {
    253     window.scrollTo(fixedScroll.left, fixedScroll.top);
    254 }
    255 
    256 //阻止默认行为
    257 function predef(e) {
    258     e.preventDefault();
    259 }
    260 
    261 /*
    262  * 跨浏览器基础库 end===============================================
    263  * */
    264 /*
    265  * 功能库===============================================
    266  * */
    267 
    268 
    269 
    270 //前台调用
    271 var $ = function (args) {
    272     return new Base(args);
    273 }
    274 
    275 //基础库
    276 function Base(args) {
    277     //创建一个数组,来保存获取的节点和节点数组
    278     this.elements = [];
    279 
    280     if (typeof args == 'string') {
    281         //css模拟
    282         if (args.indexOf(' ') != -1) {
    283             var elements = args.split(' ');            //把节点拆开分别保存到数组里
    284             var childElements = [];                    //存放临时节点对象的数组,解决被覆盖的问题
    285             var node = [];                                //用来存放父节点用的
    286             for (var i = 0; i < elements.length; i ++) {
    287                 if (node.length == 0) node.push(document);        //如果默认没有父节点,就把document放入
    288                 switch (elements[i].charAt(0)) {
    289                     case '#' :
    290                         childElements = [];                //清理掉临时节点,以便父节点失效,子节点有效
    291                         childElements.push(this.getId(elements[i].substring(1)));
    292                         node = childElements;        //保存父节点,因为childElements要清理,所以需要创建node数组
    293                         break;
    294                     case '.' :
    295                         childElements = [];
    296                         for (var j = 0; j < node.length; j ++) {
    297                             var temps = this.getClass(elements[i].substring(1), node[j]);
    298                             for (var k = 0; k < temps.length; k ++) {
    299                                 childElements.push(temps[k]);
    300                             }
    301                         }
    302                         node = childElements;
    303                         break;
    304                     default :
    305                         childElements = [];
    306                         for (var j = 0; j < node.length; j ++) {
    307                             var temps = this.getTagName(elements[i], node[j]);
    308                             for (var k = 0; k < temps.length; k ++) {
    309                                 childElements.push(temps[k]);
    310                             }
    311                         }
    312                         node = childElements;
    313                 }
    314             }
    315             this.elements = childElements;
    316         } else {
    317             //find模拟
    318             switch (args.charAt(0)) {
    319                 case '#' :
    320                     this.elements.push(this.getId(args.substring(1)));
    321                     break;
    322                 case '.' :
    323                     this.elements = this.getClass(args.substring(1));
    324                     break;
    325                 default :
    326                     this.elements = this.getTagName(args);
    327             }
    328         }
    329     } else if (typeof args == 'object') {
    330         if (args != undefined) {    //_this是一个对象,undefined也是一个对象,区别与typeof返回的带单引号的'undefined'
    331             this.elements[0] = args;
    332         }
    333     } else if (typeof args == 'function') {
    334         this.ready(args);
    335     }
    336 }
    337 
    338 //addDomLoaded
    339 Base.prototype.ready = function (fn) {
    340     addDomLoaded(fn);
    341 };
    342 
    343 //获取ID节点
    344 Base.prototype.getId = function (id) {
    345     return document.getElementById(id)
    346 };
    347 
    348 //获取元素节点数组
    349 Base.prototype.getTagName = function (tag, parentNode) {
    350     var node = null;
    351     var temps = [];
    352     if (parentNode != undefined) {
    353         node = parentNode;
    354     } else {
    355         node = document;
    356     }
    357     var tags = node.getElementsByTagName(tag);
    358     for (var i = 0; i < tags.length; i ++) {
    359         temps.push(tags[i]);
    360     }
    361     return temps;
    362 };
    363 
    364 //获取CLASS节点数组
    365 Base.prototype.getClass = function (className, parentNode) {
    366     var node = null;
    367     var temps = [];
    368     if (parentNode != undefined) {
    369         node = parentNode;
    370     } else {
    371         node = document;
    372     }
    373     var all = node.getElementsByTagName('*');
    374     for (var i = 0; i < all.length; i ++) {
    375         if ((new RegExp('(\s|^)' +className +'(\s|$)')).test(all[i].className)) {
    376             temps.push(all[i]);
    377         }
    378     }
    379     return temps;
    380 }
    381 
    382 //设置CSS选择器子节点
    383 Base.prototype.find = function (str) {
    384     var childElements = [];
    385     for (var i = 0; i < this.elements.length; i ++) {
    386         switch (str.charAt(0)) {
    387             case '#' :
    388                 childElements.push(this.getId(str.substring(1)));
    389                 break;
    390             case '.' :
    391                 var temps = this.getClass(str.substring(1), this.elements[i]);
    392                 for (var j = 0; j < temps.length; j ++) {
    393                     childElements.push(temps[j]);
    394                 }
    395                 break;
    396             default :
    397                 var temps = this.getTagName(str, this.elements[i]);
    398                 for (var j = 0; j < temps.length; j ++) {
    399                     childElements.push(temps[j]);
    400                 }
    401         }
    402     }
    403     this.elements = childElements;
    404     return this;
    405 }
    406 
    407 //获取某一个节点,并返回这个节点对象
    408 Base.prototype.ge = function (num) {
    409     return this.elements[num];
    410 };
    411 
    412 //获取首个节点,并返回这个节点对象
    413 Base.prototype.first = function () {
    414     return this.elements[0];
    415 };
    416 
    417 //获取末个节点,并返回这个节点对象
    418 Base.prototype.last = function () {
    419     return this.elements[this.elements.length - 1];
    420 };
    421 
    422 //获取某组节点的数量
    423 Base.prototype.length = function () {
    424     return this.elements.length;
    425 };
    426 
    427 //获取某一个节点的属性
    428 Base.prototype.attr = function (attr, value) {
    429     for (var i = 0; i < this.elements.length; i ++) {
    430         if (arguments.length == 1) {
    431             return this.elements[i].getAttribute(attr);
    432         } else if (arguments.length == 2) {
    433             this.elements[i].setAttribute(attr, value);
    434         }
    435     }
    436     return this;
    437 };
    438 
    439 //获取某一个节点在整个节点组中是第几个索引
    440 Base.prototype.index = function () {
    441     var children = this.elements[0].parentNode.children;
    442     for (var i = 0; i < children.length; i ++) {
    443         if (this.elements[0] == children[i]) return i;
    444     }
    445 };
    446 
    447 //设置某一个节点的透明度
    448 Base.prototype.opacity = function (num) {
    449     for (var i = 0; i < this.elements.length; i ++) {
    450         this.elements[i].style.opacity = num / 100;
    451         this.elements[i].style.filter = 'alpha(opacity=' + num + ')';
    452     }
    453     return this;
    454 };
    455 
    456 //获取某一个节点,并且Base对象
    457 Base.prototype.eq = function (num) {
    458     var element = this.elements[num];
    459     this.elements = [];
    460     this.elements[0] = element;
    461     return this;
    462 };
    463 
    464 //获取当前节点的下一个元素节点
    465 Base.prototype.next = function () {
    466     for (var i = 0; i < this.elements.length; i ++) {
    467         this.elements[i] = this.elements[i].nextSibling;
    468         if (this.elements[i] == null) throw new Error('找不到下一个同级元素节点!');
    469         if (this.elements[i].nodeType == 3) this.next();
    470     }
    471     return this;
    472 };
    473 
    474 //获取当前节点的上一个元素节点
    475 Base.prototype.prev = function () {
    476     for (var i = 0; i < this.elements.length; i ++) {
    477         this.elements[i] = this.elements[i].previousSibling;
    478         if (this.elements[i] == null) throw new Error('找不到上一个同级元素节点!');
    479         if (this.elements[i].nodeType == 3) this.prev();
    480     }
    481     return this;
    482 };
    483 
    484 //设置CSS
    485 Base.prototype.css = function (attr, value) {
    486     for (var i = 0; i < this.elements.length; i ++) {
    487         if (arguments.length == 1) {
    488             return getStyle(this.elements[i], attr);
    489         }
    490         this.elements[i].style[attr] = value;
    491     }
    492     return this;
    493 }
    494 
    495 //添加Class
    496 Base.prototype.addClass = function (className) {
    497     for (var i = 0; i < this.elements.length; i ++) {
    498         if (!hasClass(this.elements[i], className)) {
    499             this.elements[i].className += ' ' + className;
    500         }
    501     }
    502     return this;
    503 }
    504 
    505 //移除Class
    506 Base.prototype.removeClass = function (className) {
    507     for (var i = 0; i < this.elements.length; i ++) {
    508         if (hasClass(this.elements[i], className)) {
    509             this.elements[i].className = this.elements[i].className.replace(new RegExp('(\s|^)' +className +'(\s|$)'), ' ');
    510         }
    511     }
    512     return this;
    513 }
    514 
    515 //添加link或style的CSS规则
    516 Base.prototype.addRule = function (num, selectorText, cssText, position) {
    517     var sheet = document.styleSheets[num];
    518     insertRule(sheet, selectorText, cssText, position);
    519     return this;
    520 }
    521 
    522 //移除link或style的CSS规则
    523 Base.prototype.removeRule = function (num, index) {
    524     var sheet = document.styleSheets[num];
    525     deleteRule(sheet, index);
    526     return this;
    527 }
    528 
    529 //设置表单字段元素
    530 Base.prototype.form = function (name) {
    531     for (var i = 0; i < this.elements.length; i ++) {
    532         this.elements[i] = this.elements[i][name];
    533     }
    534     return this;
    535 };
    536 
    537 //设置表单字段内容获取
    538 Base.prototype.value = function (str) {
    539     for (var i = 0; i < this.elements.length; i ++) {
    540         if (arguments.length == 0) {
    541             return this.elements[i].value;
    542         }
    543         this.elements[i].value = str;
    544     }
    545     return this;
    546 }
    547 
    548 //设置innerHTML
    549 Base.prototype.html = function (str) {
    550     for (var i = 0; i < this.elements.length; i ++) {
    551         if (arguments.length == 0) {
    552             return this.elements[i].innerHTML;
    553         }
    554         this.elements[i].innerHTML = str;
    555     }
    556     return this;
    557 }
    558 
    559 //设置innerText
    560 Base.prototype.text = function (str) {
    561     for (var i = 0; i < this.elements.length; i ++) {
    562         if (arguments.length == 0) {
    563             return getInnerText(this.elements[i]);
    564         }
    565         setInnerText(this.elements[i], text);
    566     }
    567     return this;
    568 }
    569 
    570 //设置事件发生器
    571 Base.prototype.bind = function (event, fn) {
    572     for (var i = 0; i < this.elements.length; i ++) {
    573         addEvent(this.elements[i], event, fn);
    574     }
    575     return this;
    576 };
    577 
    578 //设置鼠标移入移出方法
    579 Base.prototype.hover = function (over, out) {
    580     for (var i = 0; i < this.elements.length; i ++) {
    581         addEvent(this.elements[i], 'mouseover', over);
    582         addEvent(this.elements[i], 'mouseout', out);
    583     }
    584     return this;
    585 };
    586 
    587 //设置点击切换方法
    588 Base.prototype.toggle = function () {
    589     for (var i = 0; i < this.elements.length; i ++) {
    590         (function (element, args) {
    591             var count = 0;
    592             addEvent(element, 'click', function () {
    593                 args[count++ % args.length].call(this);
    594             });
    595         })(this.elements[i], arguments);
    596     }
    597     return this;
    598 };
    599 
    600 //设置显示
    601 Base.prototype.show = function () {
    602     for (var i = 0; i < this.elements.length; i ++) {
    603         this.elements[i].style.display = 'block';
    604     }
    605     return this;
    606 };
    607 
    608 //设置隐藏
    609 Base.prototype.hide = function () {
    610     for (var i = 0; i < this.elements.length; i ++) {
    611         this.elements[i].style.display = 'none';
    612     }
    613     return this;
    614 };
    615 
    616 //设置物体居中
    617 Base.prototype.center = function (width, height) {
    618     var top = (getInner().height - height) / 2 + getScroll().top;
    619     var left = (getInner().width - width) / 2 + getScroll().left;
    620     for (var i = 0; i < this.elements.length; i ++) {
    621         this.elements[i].style.top = top + 'px';
    622         this.elements[i].style.left = left + 'px';
    623     }
    624     return this;
    625 };
    626 
    627 //锁屏功能
    628 Base.prototype.lock = function () {
    629     for (var i = 0; i < this.elements.length; i ++) {
    630         fixedScroll.top = getScroll().top;
    631         fixedScroll.left = getScroll().left;
    632         this.elements[i].style.width = getInner().width + getScroll().left + 'px';
    633         this.elements[i].style.height = getInner().height + getScroll().top + 'px';
    634         this.elements[i].style.display = 'block';
    635         parseFloat(sys.firefox) < 4 ? document.body.style.overflow = 'hidden' : document.documentElement.style.overflow = 'hidden';
    636         addEvent(this.elements[i], 'mousedown', predef);
    637         addEvent(this.elements[i], 'mouseup', predef);
    638         addEvent(this.elements[i], 'selectstart', predef);
    639         addEvent(window, 'scroll', fixedScroll);
    640     }
    641     return this;
    642 };
    643 
    644 Base.prototype.unlock = function () {
    645     for (var i = 0; i < this.elements.length; i ++) {
    646         this.elements[i].style.display = 'none';
    647         parseFloat(sys.firefox) < 4 ? document.body.style.overflow = 'auto' : document.documentElement.style.overflow = 'auto';
    648         removeEvent(this.elements[i], 'mousedown', predef);
    649         removeEvent(this.elements[i], 'mouseup', predef);
    650         removeEvent(this.elements[i], 'selectstart', predef);
    651         removeEvent(window, 'scroll', fixedScroll);
    652     }
    653     return this;
    654 };
    655 
    656 //触发点击事件
    657 Base.prototype.click = function (fn) {
    658     for (var i = 0; i < this.elements.length; i ++) {
    659         this.elements[i].onclick = fn;
    660     }
    661     return this;
    662 };
    663 
    664 //触发浏览器窗口事件
    665 Base.prototype.resize = function (fn) {
    666     for (var i = 0; i < this.elements.length; i ++) {
    667         var element = this.elements[i];
    668         addEvent(window, 'resize', function () {
    669             fn();
    670             if (element.offsetLeft > getInner().width + getScroll().left - element.offsetWidth) {
    671                 element.style.left = getInner().width + getScroll().left - element.offsetWidth + 'px';
    672                 if (element.offsetLeft <= 0 + getScroll().left) {
    673                     element.style.left = 0 + getScroll().left + 'px';
    674                 }
    675             }
    676             if(element.offsetTop > getInner().height + getScroll().top - element.offsetHeight) {
    677                 element.style.top = getInner().height + getScroll().top - element.offsetHeight + 'px';
    678                 if (element.offsetTop <= 0 + getScroll().top) {
    679                     element.style.top = 0 + getScroll().top + 'px';
    680                 }
    681             }
    682         });
    683     }
    684     return this;
    685 };
    686 
    687 //设置动画
    688 Base.prototype.animate = function (obj) {
    689     for (var i = 0; i < this.elements.length; i ++) {
    690         var element = this.elements[i];
    691         var attr = obj['attr'] == 'x' ? 'left' : obj['attr'] == 'y' ? 'top' :
    692                 obj['attr'] == 'w' ? 'width' : obj['attr'] == 'h' ? 'height' :
    693                 obj['attr'] == 'o' ? 'opacity' : obj['attr'] != undefined ? obj['attr'] : 'left';
    694 
    695 
    696         var start = obj['start'] != undefined ? obj['start'] :
    697                 attr == 'opacity' ? parseFloat(getStyle(element, attr)) * 100 :
    698             parseInt(getStyle(element, attr));
    699 
    700         var t = obj['t'] != undefined ? obj['t'] : 10;                                                //可选,默认10毫秒执行一次
    701         var step = obj['step'] != undefined ? obj['step'] : 20;                                //可选,每次运行10像素
    702 
    703         var alter = obj['alter'];
    704         var target = obj['target'];
    705         var mul = obj['mul'];
    706 
    707         var speed = obj['speed'] != undefined ? obj['speed'] : 6;                            //可选,默认缓冲速度为6
    708         var type = obj['type'] == 0 ? 'constant' : obj['type'] == 1 ? 'buffer' : 'buffer';        //可选,0表示匀速,1表示缓冲,默认缓冲
    709 
    710 
    711         if (alter != undefined && target == undefined) {
    712             target = alter + start;
    713         } else if (alter == undefined && target == undefined && mul == undefined) {
    714             throw new Error('alter增量或target目标量必须传一个!');
    715         }
    716 
    717 
    718 
    719         if (start > target) step = -step;
    720 
    721         if (attr == 'opacity') {
    722             element.style.opacity = parseInt(start) / 100;
    723             element.style.filter = 'alpha(opacity=' + parseInt(start) +')';
    724         } else {
    725             //element.style[attr] = start + 'px';
    726         }
    727 
    728 
    729         if (mul == undefined) {
    730             mul = {};
    731             mul[attr] = target;
    732         }
    733 
    734 
    735         clearInterval(element.timer);
    736         element.timer = setInterval(function () {
    737 
    738             /*
    739              问题1:多个动画执行了多个列队动画,我们要求不管多少个动画只执行一个列队动画
    740              问题2:多个动画数值差别太大,导致动画无法执行到目标值,原因是定时器提前清理掉了
    741 
    742              解决1:不管多少个动画,只提供一次列队动画的机会
    743              解决2:多个动画按最后一个分动画执行完毕后再清理即可
    744              */
    745 
    746             //创建一个布尔值,这个值可以了解多个动画是否全部执行完毕
    747             var flag = true; //表示都执行完毕了
    748 
    749 
    750             for (var i in mul) {
    751                 attr = i == 'x' ? 'left' : i == 'y' ? 'top' : i == 'w' ? 'width' : i == 'h' ? 'height' : i == 'o' ? 'opacity' : i != undefined ? i : 'left';
    752                 target = mul[i];
    753 
    754 
    755                 if (type == 'buffer') {
    756                     step = attr == 'opacity' ? (target - parseFloat(getStyle(element, attr)) * 100) / speed :
    757                         (target - parseInt(getStyle(element, attr))) / speed;
    758                     step = step > 0 ? Math.ceil(step) : Math.floor(step);
    759                 }
    760 
    761 
    762 
    763                 if (attr == 'opacity') {
    764                     if (step == 0) {
    765                         setOpacity();
    766                     } else if (step > 0 && Math.abs(parseFloat(getStyle(element, attr)) * 100 - target) <= step) {
    767                         setOpacity();
    768                     } else if (step < 0 && (parseFloat(getStyle(element, attr)) * 100 - target) <= Math.abs(step)) {
    769                         setOpacity();
    770                     } else {
    771                         var temp = parseFloat(getStyle(element, attr)) * 100;
    772                         element.style.opacity = parseInt(temp + step) / 100;
    773                         element.style.filter = 'alpha(opacity=' + parseInt(temp + step) + ')';
    774                     }
    775 
    776                     if (parseInt(target) != parseInt(parseFloat(getStyle(element, attr)) * 100)) flag = false;
    777 
    778                 } else {
    779                     if (step == 0) {
    780                         setTarget();
    781                     } else if (step > 0 && Math.abs(parseInt(getStyle(element, attr)) - target) <= step) {
    782                         setTarget();
    783                     } else if (step < 0 && (parseInt(getStyle(element, attr)) - target) <= Math.abs(step)) {
    784                         setTarget();
    785                     } else {
    786                         element.style[attr] = parseInt(getStyle(element, attr)) + step + 'px';
    787                     }
    788 
    789                     if (parseInt(target) != parseInt(getStyle(element, attr))) flag = false;
    790                 }
    791 
    792                 //document.getElementById('test').innerHTML += i + '--' + parseInt(target) + '--' + parseInt(getStyle(element, attr)) + '--' + flag + '<br />';
    793 
    794             }
    795 
    796             if (flag) {
    797                 clearInterval(element.timer);
    798                 if (obj.fn != undefined) obj.fn();
    799             }
    800 
    801         }, t);
    802 
    803         function setTarget() {
    804             element.style[attr] = target + 'px';
    805         }
    806 
    807         function setOpacity() {
    808             element.style.opacity = parseInt(target) / 100;
    809             element.style.filter = 'alpha(opacity=' + parseInt(target) + ')';
    810         }
    811     }
    812     return this;
    813 };
    814 
    815 //插件入口
    816 Base.prototype.extend = function (name, fn) {
    817     Base.prototype[name] = fn;
    818 };
  • 相关阅读:
    git
    ComfortColor.xcs
    使用Jackson时转换JSON时,日期格式设置
    json和jsonp
    powerdesigner 将表中name列值复制到comment列 (保留原有comment)
    下滑线驼峰互转
    Tomcat
    git stash
    gitignore
    例题:大图轮播
  • 原文地址:https://www.cnblogs.com/wanqiu/p/4456317.html
Copyright © 2011-2022 走看看