簡單系統時間

var nowTime = new Date();//typeof object
下面出來的都數字類型:number
nowTime.getFullYear() //年
nowTime.getMonth() + 1 //月 從0開始算,所以需加1
nowTime.getDate() //日
nowTime.getDay() //星期
nowTime.getHours() //時
nowTime.getMinutes() //分
nowTime.getSeconds() //秒

Time()
setInterval(Time, 1000)
function Time() {
  var nowTime = new Date(); //typeof object
  var _year = nowTime.getFullYear();
  var _month = nowTime.getMonth() + 1;
  var _date = nowTime.getDate();
  var _week = nowTime.getDay();
  var _hours = nowTime.getHours()
  var _minutes = nowTime.getMinutes();
  var _seconds = nowTime.getSeconds();
    switch (_week){
        case 0:_week='星期日';break;
        case 1:_week='星期一';break;
        case 2:_week='星期二';break;
        case 3:_week='星期三';break;
        case 4:_week='星期四';break;
        case 5:_week='星期五';break;
        case 6:_week='星期六';
    }
  document.body.innerHTML = _year + '年' + _month + '月' + _date + '日  ' + _week + ' ' + toTwo(_hours) + ':' + toTwo(_minutes) + ':' + toTwo(_seconds);
}
function toTwo(n) {  //單數轉雙數
  return n = n < 10 ? '0' + n : '' + n;
}

圖片日期要點:日期共6位,使用str.charAt(i)獲取每一位數字,與圖片名字相對應

str = toTwo(_hours)+toTwo(_minutes)+toTwo(_seconds);
for(var i=0;i<str.length;i++){
    img[i].src = '../img/timePic/'+ str.charAt(i)+'.JPG'
}

運行

倒計時:
設置時間形式:
數字形式:new Date(2013,6,22,01,19,54)
字符串形式:new Date('June 10,2013 12:01:20')
思想:(未來時間 - 當前時間)/1000 = t //秒

套用

天:Math.floor(t/86400)
時:Math.floor(t%86400/3600)
分:Math.floor(t%86400%3600/60)
秒:t%60
Math.floor(t/86400)+'天'+ Math.floor(t%86400/3600)+'時'+ Math.floor(t%86400%3600/60)+'分'+t%60+'秒'

一月:January 简写Jan.
二月:February 简写Feb.
三月:March 简写Mar.
四月:April 简写Apr.
五月:May 简写May.
六月:June 简写Jun.
七月:July 简写Jul.
八月:August 简写Aug.
九月:September 简写Sep. / Sept.
十月:October 简写Oct.
十一月:November 简写Nov.
十二月:December 简写Dec.
開始時間:<input type="text" value="August 29,2015 1:39:59"/>
剩余時間:<input type="text"/>
<input type="button" value="Start"/>
var nowTime = new Date();
//var newTime = new Date(2013, 5, 22, 1, 39, 59);
var newTimeE = new Date('August 29,2014 1:39:59')
var t = Math.floor((newTimeE - nowTime) / 1000); //newTime - nowTime 毫秒單位 t為秒
var str = Math.floor(t / 86400) + '天' + Math.floor(t % 86400 / 3600) + '時' + Math.floor(t % 86400 % 3600 / 60) + '分' + t % 60 + '秒'
var inp = document.getElementsByTagName('input')
var inow = null;
var inew = null;
var timer = null;
inp[2].onclick = function () {
  clearInterval(timer)
  inew = new Date(inp[0].value)
  timer = setInterval(function () {
    inow = new Date();
    var tt = Math.floor((inew - inow) / 1000);
    if (tt >= 0) {
      var str = Math.floor(tt / 86400) + '天' + Math.floor(tt % 86400 / 3600) + '時' + Math.floor(tt % 86400 % 3600 / 60) + '分' + tt % 60 + '秒'
      inp[1].value = str;
    } 
    else { //倒計時完成後動作
      clearInterval(timer)
    }
  }, 1000)
}

new Date().getTime() //時間戳:1970年1月1日0點0分0秒0毫秒 距離現在多長時間,毫秒為單位

基礎方法封裝匯總

隨機數生產

function randomNum(alls, now) {
  var arr = []
  var Newarr = []
  for (var i = 1; i <= alls; i++) {
    arr.push(i);
  }
  for (var i = 0; i < now; i++) {
    Newarr.push(arr.splice(Math.floor(Math.random() * arr.length), 1))
  }
  return Newarr;
}
randomNum(49,7)

快速排序

function quickSort(arr) {
  if (arr.length <= 1) { //有可能為0
    return arr;
  }
  var num = Math.floor(arr.length / 2) //向下取整,找到中間數
  var numV = arr.splice(num, 1); //找到基準點的數值
  var left = []; //存小於基准點的值
  var right = []; //存大於基準點的值
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] < numV) {
      left.push(arr[i]);
    } 
    else {
      right.push(arr[i]);
    }
  }
  //以上一次操作,下面再利用遞歸原理
  return quickSort(left).concat([numV], quickSort(right));
  //左邊.concat(基准數,右邊)
}
alert( quickSort([30,12,5,6,9,18,57,2]) )

事件綁定

function on(obj, evt, fn) {
  if (obj.addEventListener) {
    obj.addEventListener(evt, fn, false)
  } 
  else {
    obj.attachEvent('on' + evt, function () {
      fn.call(obj);
    })
  }
}
on(document, 'click', fn1)

元素拖拽

function drag(obj) {
  var cw = document.documentElement.clientWidth;
  var ch = document.documentElement.clientHeight;
  obj.onmousedown = function (e) {
    var e = e || event;
    var disW = e.clientX - this.offsetLeft;
    var disH = e.clientY - this.offsetTop;
    //解決IE文字選中後移動問題:
    if (obj.setCapture) {
      obj.setCapture();
    }
    document.onmousemove = function (e) {
      var e = e || event;
      var cw_w = e.clientX - disW;
      var ch_h = e.clientY - disH
      if (cw_w < 0) {
        cw_w = 0
      } 
      else if (ch_h < 0) {
        ch_h = 0
      } 
      else if (cw_w > cw - obj.offsetWidth) {
        cw_w = cw - obj.offsetWidth
      } 
      else if (ch_h > ch - obj.offsetHeight) {
        ch_h = ch - obj.offsetHeight
      }
      obj.style.left = cw_w + 'px'
      obj.style.top = ch_h + 'px'
    }
    document.onmouseup = function () {
      document.onmousemove = null;
      //解決IE8抬起鼠標,釋放全局捕獲 releaseCapture();
      if (obj.releaseCapture) {
        obj.releaseCapture()
      }
    }
    return false; //down事件觸發時陰止默認行為;
  }
}

獲取className

function getClassName(parent, tagName, className) {
  var aEls = parent.getElementsByTagName(tagName)
  var arr = []
  for (var i = 0; i < aEls.length; i++) {
    var aClassName = aEls[i].className.split(' '); //当前classname拆分成数组
    for (var j = 0; j < aClassName.length; j++) {
      if (aClassName[j] == className) { //如果第j个class == classname
        arr.push(aEls[i]) //则把当前第i个class push进来
        break; //如果class='box box'相同名字,找到一个跳出for
      }
    }
  }
  return arr;
}
getClassName(document, 'li', 'box');

增加class方法

function addClass(obj, className) {
  if (obj.className == '') { //原本无
    obj.className = className;
  } 
  else { //原本有
    var arrClassName = obj.className.split(' ');
    var _index = arrIndexOf(arrClassName, className);
    if (_index == - 1) { //不存在
      obj.className += ' ' + className;
    }
  }
}
//判斷一個數組裏是否存在元素
function arrIndexOf(arr, v) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] == v) {
      return i; //当前重複的值出现位置
    }
  }
  return - 1;
}
 
addClass(box, 'box111');

刪除class方法

function removeClass(obj, className) {
  if (obj.className != '') {   //如果有class
    var arrClassName = obj.className.split(' ');
    console.log(arrClassName);
    var _index = arrIndexOf(arrClassName, className);
    if (_index != - 1) {     //如果有需要移除的class
      arrClassName.splice(_index, 1); //删除数组裏需要移除的
      obj.className = arrClassName.join(' ');//再把處理完的數組class給obj
    } 
  }
}
//判斷一個數組裏是否存在元素
function arrIndexOf(arr, v) {
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] == v) {
      return i; //当前重複的值出现位置
    }
  }
  return - 1;
}
 
removeClass(box, 'box3')

選中文字方法

function selectText() {
    if (document.selection) { //IE
        return document.selection.createRange().text;//字符串
    }
    else {
        return window.getSelection().toString(); //getSelection()對象,需轉成字符串
    }
}

阻止冒泡

function (ev) {
    ev = ev || event
    if(ev.stopPropagation){
        ev.stopPropagation();
    }
    else{
        ev.cancelBubble = true;
    }
}

阻止默認事件

function (ev) {
  ev = ev || event
  if (ev.preventDefault) {
    ev.preventDefault();
  } 
  else {
    ev.returnValue = false;
    return false;
  }
}

判斷IE

var ie = !-[1,] //IE9已修復
//推薦
if(!window.VBArray){
    alert('Not IE')
}
else{
    alert('IE')
}

getStyle,startMove方法

function startMove(obj,json,endFn){clearInterval(obj.timer);obj.timer=setInterval(function(){var bBtn=true;for(var attr in json){var iCur=0;if(attr=="opacity"){if(Math.round(parseFloat(getStyle(obj,attr))*100)==0){iCur=Math.round(parseFloat(getStyle(obj,attr))*100)}else{iCur=Math.round(parseFloat(getStyle(obj,attr))*100)||100}}else{iCur=parseInt(getStyle(obj,attr))||0}var iSpeed=(json[attr]-iCur)/8;iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);if(iCur!=json[attr]){bBtn=false}if(attr=="opacity"){obj.style.filter="alpha(opacity="+(iCur+iSpeed)+")";obj.style.opacity=(iCur+iSpeed)/100}else{obj.style[attr]=iCur+iSpeed+"px"}}if(bBtn){clearInterval(obj.timer);if(endFn){endFn.call(obj)}}},30)}function getStyle(obj,attr){if(obj.currentStyle){return obj.currentStyle[attr]}else{return getComputedStyle(obj,false)[attr]}};

getStyle(obj,'left')  //top,opacity,zIndex,width,height....帶px
startMove(img,{left:30;top:100},fn)//left:30;top:100同時進行
startMove(img,{left:30},function(){ startMove(img,{top:100}) },fn) //分步執行

Ajax封裝

function ajax(url,fnSucc,fnFaild){var oAjax=null;if(window.XMLHttpRequest){oAjax=new XMLHttpRequest()}else{oAjax=new ActiveXObject("Microsoft.XMLHTTP")}oAjax.open("GET",url,true);oAjax.send();oAjax.onreadystatechange=function(){if(oAjax.readyState==4){if(oAjax.status==200){fnSucc(oAjax.responseText)}else{if(fnFaild){fnFaild()}}}}};

ajax('date.js',function(){alert('成功')},function(){alert('失敗')})

兼容獲取class對象

function getByClass(oParent, sClass) {
    var aEle = oParent.getElementsByTagName('*');
    var result = [] //最后返回数组
    var re = new RegExp('\\b' + sClass + '\\b', 'i');//正则对象
    for (var i = 0; i < aEle.length; i++) {
        if (re.test(aEle[i].className)) {
            result.push(aEle[i])
        }
    }
    return result;
}

var box = getByClass(document, 'box')

連續觸發兼容寫法

if(ie){
this.inp.onpropertychange = function(){}
}
else{
this.inp.oninput = function(){}
}

doMove前後上下移動

function doMove(obj, attr, dir, target) { //obj,屬性[left,top],速度[每次時間移動多長],目標點
  dir = parseInt(getStyle(obj, attr)) < target ? dir : - dir
  clearInterval(obj.timer)
  obj.timer = setInterval(function () {
    var speed = parseInt(getStyle(obj, attr)) + dir
    if (speed > target && dir > 0 || speed < target && dir < 0) {
      speed = target
    }
    obj.style[attr] = speed + 'px'
    if (speed == target) {
      clearInterval(obj.timer)
    }
  }, 30)
}

doMove(obj,'left',30,10) //移動obj的left到10px的位置,速度為每30ms移動30px
doMove(obj,'left',40,500) //移動obj的left到500px位置,速度為每30ms移動40px
//如果當前left從小到大,則為往前,反之為往後;

WebkitTransitionEnd webkitAnimationEnd方法封装

function addEnd(obj, fn)
{
  obj.addEventListener('WebkitTransitionEnd', fn, false);
  obj.addEventListener('transitionend', fn, false);
}
function removeEnd(obj, fn)
{
  obj.removeEventListener('WebkitTransitionEnd', fn, false);
  obj.removeEventListener('transitionend', fn, false);
}

//同理還有
function addEnd(obj, fn) {
  obj.addEventListener('webkitAnimationEnd', fn, false);
  obj.addEventListener('animationend', fn, false);
}


//end函數如觸發transition行為,即改變width/height/opacity....,則須先removeEnd(obj,fn)
addEnd(obj,end)
function end(){
    removeEnd(obj,end)
    //do something...
}

直角三角形已知斜邊及角度,求另兩邊,方法封裝

function toLT(iR, iDeg) { //斜边[圆弧半径],角度
  return {
    l: Math.round(Math.sin(iDeg / 180 * Math.PI) * iR),
    t: Math.round(Math.cos(iDeg / 180 * Math.PI) * iR)
  }
}
//如已知半徑iR = -150 ; 角度依次增加 var _RH = toLT(-150,90/4*i)
left = _RH.l;top = _RH.t

獲取元素到屏幕的距離 直當於jq的offset()

    function getPos(obj){
        var pos = {left: 0, top:0};
        while (obj) {
            pos.left +=obj.offsetLeft;
            pos.top +=obj.offsetTop;
            obj = obj.offsetParent
        }
        return pos;
    }

抖動

    function shake(obj, attr, endfn) {
        if (obj.door) {
            return
        }
        obj.door = 1;
        var pos = parseInt(css(obj,attr));
        var arr = []; //20 -20 18 -18
        var num = 0;
        for (var i = 20; i > 0; i -= 2) {
            arr.push(i, - i);
        }
        arr.push(0);
        clearTimeout(obj.shake)
        obj.shake = setInterval(function () {
            obj.style[attr] = pos + arr[num] + 'px'
            num++
            if (num == arr.length) {
                clearInterval(obj.shake)
                endfn && endfn()
                obj.door = 0;
            }
        }, 50)
    }