自己封裝的tools.js文件

/*
 * 生成指定范圍的隨機(jī)整數(shù)
 * @param lower 下限
 * @param upper 上限
 * @return 返回指定范圍的隨機(jī)整數(shù),上/下限值均可取
 */
function random(lower, upper) {
  return Math.floor(Math.random() * (upper - lower)) + lower;
}
 
/*
 * 生成rgb隨機(jī)顏色值
 * @return 返回生成的rgb字符串:"rgb(33,44,55)"
 */
function randomColor() {
  // 隨機(jī)生成 rgb 十進(jìn)制值
  var r = random(0, 255),
    g = random(0, 255),
    b = random(0, 255);
  // 串聯(lián)字符串,并返回
  return "rgb(" + r + "," + g + "," + b + ")";
}
/*
 * 將 URL 中查詢字符串轉(zhuǎn)換為對(duì)象
 * @param ul 待轉(zhuǎn)換的URL字符串
 */
function parseQueryString(url) {
  // 獲取 ? 與 # 的索引
  var start = url.indexOf("?"),
    end = url.indexOf("#");
 
  // 判斷是否有 ?
  if (start === -1)
    // 不存在,則返回 null
    return null;
  // 存在 ?,則起始索引從?后一位置開(kāi)始
  start += 1;
 
  // 判斷是否有 #
  if (end === -1)
    // 不存在,則截取到字符串末尾
    end = url.length;
 
  // 獲取查詢字符串
  var queryString = url.slice(start, end);
 
  // 使用 & 符號(hào)將查詢字符串分割
  queryString = queryString.split("&");
  var result = {}; // 保存解析后的對(duì)象
  // 遍歷迭代數(shù)組中每個(gè)元素
  for (var i = 0, len = queryString.length; i < len; i++) {
    // 將當(dāng)前數(shù)組中遍歷到的 "key=value" 以 = 分割
    var parts = queryString[i].split("=");
    result[parts.shift()] = parts.shift();
  }
  // 將解析報(bào)的對(duì)象返回
  return result;
}
/*
 * 將對(duì)象轉(zhuǎn)換為查詢字符串
 * @param obj 對(duì)象
 * @return 查詢字符串 key=value&key=value&key=value
 */
function toQueryString(obj) {
  // 定義變量保存轉(zhuǎn)換結(jié)果
  var result = [];
  // 遍歷迭代對(duì)象各屬性
  for (var attr in obj) {
    result.push(attr + "=" + obj[attr]);
  }
  // 返回連接后的查詢字符串
  return result.join("&");
}
/*
 * 格式化日期時(shí)間:yyyy-MM-dd HH:mm:ss
 * @param datetime 待格式化日期時(shí)間對(duì)象
 * @return 格式化后的字符串:yyyy-MM-dd HH:mm:ss
 */
function format(datetime) {
  var year = datetime.getFullYear(),
    month = ("0" + (datetime.getMonth() + 1)).slice(-2),
    date = ("0" + datetime.getDate()).slice(-2),
    hour = ("0" + datetime.getHours()).slice(-2),
    min = ("0" + datetime.getMinutes()).slice(-2),
    sec = ("0" + datetime.getSeconds()).slice(-2);
  return year + "-" + month + "-" + date + " " + hour + ":" + min + ":" + sec;
}
/*
*封裝獲取指定DOM元素的函數(shù)
*/
function $(selector) {
  var strs = selector.split(" "); //通過(guò)空格切割傳遞的字符串
  var result = document.getElementsByTagName("html"); //獲取最外層的dom元素
  for (var i = 0, len = strs.length; i < len; i++) {
    //根據(jù)傳過(guò)來(lái)的字符串,一層一層的遍歷查找dom
    if (strs[i].charAt(0) === "#") {
      //如果是id,返回的是dom元素
      result = document.getElementById(strs[i].slice(1));
    } else if (strs[i].charAt(0) === ".") {
      //如果是class,則返回的是一個(gè)偽數(shù)組(集合),需要加一個(gè)下標(biāo),才能獲得dom
      result = byClass(strs[i].slice(1), result[0]);
    } else {
      //如果是tagName
      if (i === 0)
        //代表傳遞的字符串只有一個(gè)tagName,
        result = result[0].getElementsByTagName(strs[i]);
      else if (strs[i - 1].charAt(0) === "#")
        //代表上一個(gè)是id,返回的是dom,可以直接調(diào)用
        result = result.getElementsByTagName(strs[i]);
      //代表上一個(gè)是class或者tagName,返回的是集合,需要加下標(biāo)
      else result = result[0].getElementsByTagName(strs[i]);
    }
  }
  return result;
}
/*
 * 解決 document.getElementsByClassName 瀏覽器兼容問(wèn)題
 * @param className 類(lèi)名
 * @param context 查詢上下文
 * @return 返回查找到的元素集合
 */
function byClass(className, context) {
  // 默認(rèn)在整個(gè)文檔中查詢
  context = context || document;
  // 支持使用 getElementsByClassName 方法,則直接調(diào)用
  if (context.getElementsByClassName)
    return context.getElementsByClassName(className);
  // 不支持使用 getElementsByClassName 方法,解決兼容
  var result = []; // 保存所有查找到的元素
  // 查找查詢上下文環(huán)境中所有元素
  var elements = context.getElementsByTagName("*");
  // 遍歷所有元素,判斷每個(gè)元素的類(lèi)名
  for (var i = 0, len = elements.length; i < len; i++) {
    // 將當(dāng)前遍歷到元素的類(lèi)名存入數(shù)組中
    var classNames = elements[i].className.split(" ");
    // 遍歷數(shù)組中的元素,判斷是否存在待查找的類(lèi)名
    for (var j = 0, l = classNames.length; j < l; j++) {
      if (classNames[j] === className) {
        result.push(elements[i]);
        break;
      }
    }
  }
  // 返回查找結(jié)果
  return result;
}
/*





*添加監(jiān)聽(tīng)事件
*/
function on(element, type, callback) {
  if (element.addEventListener) {
    if (type.charAt("on") === 0) type = type.slice(2);
    element.addEventListener(type, callback, false);
  } else {
    if (type.charAt("on") !== 0) type = "on" + type;
    element.attachEvent(type, callback);
  }
}
/*
*刪除監(jiān)聽(tīng)事件
*/
function off(element, type, callback) {
  if (element.removeEventListener) {
    if (type.charAt("on") === 0) type = type.slice(2);
    element.removeEventListener(type, callback, false);
  } else {
    if (type.charAt("on") !== 0) type = "on" + type;
    element.detachEvent(type, callback);
  }
}
/*
*獲取設(shè)置CSS樣式
*/
function css(element, attr, value) {
  if (typeof attr === "object") {
    //設(shè)置樣式
    for (var i in attr) {
      element.style[i] = attr[i];
    }
    return;
  }
  //查詢樣式
  if (typeof value === "undefined") {
    return window.getComputedStyle
      ? window.getComputedStyle(element)[attr]
      : element.currentStyle[attr];
  }
  //設(shè)置
  element.style[attr] = value;
}
/*
*顯示元素
*/
function show(element) {
  element.style.display = "block";
}
/*
*隱藏元素
*/
function hide(element) {
  element.style.display = "none";
}
/*
*獲取元素在文檔中的定位坐標(biāo)
*/
function offset(element) {
  var _top = 0,
    _left = 0;
  while (element !== null) {
    _top += element.offsetTop;
    _left += element.offsetLeft;
    element = element.offsetParent;
  }
  return {
    top: _top,
    left: _left
  };
}
/*
*查詢保存cookie
*/
function cookie(key, value, options) {
  //writing
  if (typeof value !== "undefined") {
    //傳入有具體的value值,此時(shí)執(zhí)行cookie保存操作
    var cookie = encodeURIComponent(key) + "=" + encodeURIComponent(value);
    //判斷可配置項(xiàng)
    options = options || {};
    if (options.expires) {
      //如果有有效時(shí)間
      var datetime = new Date();
      datetime.setDate(datetime.getDate() + options.expires);
      cookie += ";expires=" + datetime.toUTCString();
    }
    // 有路徑
    if (options.path) cookie += ";path=" + options.path;
    // 有域
    if (options.domain) cookie += ";domain=" + options.domain;
    // 有安全配置
    if (options.secure) cookie += ";secure";
    // 保存cookie
    document.cookie = cookie;
    return;
  }
  //reading
  // 讀取域下所有 cookie ("key=value") 放到數(shù)組中保存
  var cookies = document.cookie.split("; ");
  // 遍歷迭代數(shù)組元素
  for (var i = 0, len = cookies.length; i < len; i++) {
    // 當(dāng)前cookie以 "=" 分割
    var parts = cookies[i].split("=");
    // 第一個(gè)=號(hào)前的是cookie名,剩余元素以=連接作為cookie值
    var name = decodeURIComponent(parts.shift());
    // cookie名是否為待查找的名稱
    if (name === key) {
      // 將value解碼
      var value = decodeURIComponent(parts.join("="));
      // 返回查找到的 cookie 值
      return value;
    }
  }
  // 不能查找到,則返回 undefined
  return undefined;
}
/*
 * 刪除cookie
 * @param key cookie名
 * @param options 可配置項(xiàng)
 */
function removeCookie(key, options) {
    options = options || {};
    options.expires = -1;
    cookie(key, "", options);
}
/*
*封裝動(dòng)畫(huà)動(dòng)作函數(shù)
*@param element 需要添加動(dòng)畫(huà)的dom元素
*@param options 需要改變的屬性以及值
*@param speed 動(dòng)畫(huà)的時(shí)間
*@param fn 動(dòng)畫(huà)結(jié)束執(zhí)行的函數(shù)
*/
function animate(element,options,speed,fn){
  // 清除element前面的計(jì)時(shí)器
  clearInterval(element.timer);
  // 獲取屬性的初始值以及運(yùn)動(dòng)的總距離
  var start = {}, _range = {};
  for(var attr in options){
    start[attr] = parseFloat(css(element,attr));
    _range[attr] = options[attr]-start[attr];
  }
  // 獲取點(diǎn)擊按鈕的時(shí)候的當(dāng)前時(shí)間
  var nowTime = +new Date();
  // 啟動(dòng)計(jì)時(shí)器進(jìn)行動(dòng)畫(huà)的運(yùn)動(dòng)
  element.timer = setInterval(function(){
    // 獲取定時(shí)器運(yùn)行的時(shí)候的時(shí)間與初始點(diǎn)擊的時(shí)間的差值
    var dataTime = Math.min(+new Date()-nowTime,speed);
    for(var attr in options){
      result = dataTime * _range[attr]/speed + start[attr];
      if(attr === "width" || attr === "height" || attr === "bottom" || attr === "right" || attr === "left" || attr === "top")
        element.style[attr] = result + "px";
      else
        element.style[attr] = result;
    }
    if(dataTime === speed){
      clearInterval(element.timer);
      fn && fn();
    }
  },1000/60);
}
/* 淡入 */
function fadeIn(element,speed,fn){
    element.style.display = "block";
    element.style.opacity = 0;
    animate(element,{opacity:1},speed,fn);
}
/* 淡出 */
function fadeOut(element,speed,fn){
  animate(element,{opacity:0},speed,function(){
    element.style.display = "none";
  });
}


歡迎關(guān)注微信公眾號(hào):猴哥說(shuō)前端