/*
* 作者: 胡乐
* 2015/4/18
* js 基础 和 工具库
*
*
* */
//根据获取对象
function hGetId(id){
return document.getElementById(id);
}
//获取标签
function hGetTagName(el , parentObj){
return parentObj?parentObj.getElementsByTagName(el):document.getElementsByTagName(el);
}
//获取class
function hGetClass(paremtObj,tagName,className){ var aEl = obj.getElementsByTagName(tagName);
var arr = [];
var arrClassName = []; for (var i = 0; i < aEl.length; i++) {
arrClassName = aEl[i].className.split(' ');
for (var j = 0; j < arr2.length; j++) {
if(arrClassName[j] === className){
arr.push(aEl[i]);
break;
}
}
} return arr;
}
//查找数组是否存在某一个值
function arrIndexOf(arr , v){
for (var i = 0; i < arr.length; i++) {
if(arr[i] == v){
return i;
}
}
return -1;
}
//添加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;
}
}
}
//移除class
function removeClass(obj,className){
if(obj.className != ''){
var arrClassName = obj.className.split(' ');
var _index = arrIndexOf(arrClassName, className);
if(_index != -1){
arrClassName.split(_index,1);
obj.className = arrClassName.join(' ');
}
}
}
//获取对象样式
function hGetStyle(obj , attr){
return obj.currentStyle?obj.currentStyle[attr] : getComputedStyle( obj ,null )[attr];
} //移动函数
function hDoMove(obj , attr ,s ,target , endFn ){
// 获取当前对象的的位置
var pos = parseInt(hGetStyle(obj,attr));
//如果目标点的位置 大于当前距离,那么 就是正向移动,否则就是负向移动
s = target > pos ? s : -s;
//清除上一个定时器
clearInterval(obj.hDoMovetimer);
//创建新的定时器
obj.hDoMovetimer = setInterval(function(){
//距离等于 当前对象的实时距离 + 每次要移动的距离
var distance = parseInt(hGetStyle(obj,attr)) + s ;
// 如果 上一步计算的距离大于 给定的目标点距离, 进行修正 = 目标距离
if( distance > target && s > 0 || distance < target && s < 0){
distance = target;
}
// 对象移动
obj.style[attr] = distance + 'px';
// 如果距离 已经到达目标点, 清除定时器,执行回调函数
if( distance === target){
clearInterval(obj.hDoMovetimer);
// 回调函数是否是未定义? 不是则执行
endFn && endFn();
}
},20)
}
//抖动函数
function hShake ( obj, attr, endFn ) {
/*
* 两种办法解决抖动函数隐患的问题:
* 1. 进入函数先 进到一个if控制,永远不直接执行抖动函数的主体代码 , 而是取当前 对象的位置和 50毫秒后的位置 , 比较是否相等, 如果相等,
* 则 说明对象当前抖动已经结束, 可以执行抖动效果!(有稍微的一点小BUG)
* 2. 如果用一个变量开关来控制,也是挺好的, 但是, 变量开关不能函数开始被初始化也不能在函数结束后被清除。。 否则,每次触发这函数都可以
* 顺利的往下执行抖动函数的主体代码,那就不能修复问题。 需要一个变量,他能存在的时间更长, 将变量挂在 window 的身上的时候 (win
* dow.flag = false),每次就只能触发一次 对象进行抖动,下一个需要等到上一个抖动的对象抖动结束后,才能抖动, 这种效果,并不是想要
* 的,所以 , 将开关挂在 传递进来的 obj身上 是最好的选择, 每个对象身上的开关管理 各自身上的 抖动问题处理,而且obj.flag在函数执行结束后
* 并没有被回收,因为,他是从函数外部传递进来的,生命期很长!! 这样再次触发函数的时候,obj.flag = true,这个条件成立 if(obj.flag)
* {return} ,不往下执行了。。。除非抖动结束后, num === 数组的最后一个值, 这时候才 赋值 为 false.
* */
if(obj.flag) {return} ; //初始化 未定义(false 不执行 return),
obj.flag = true; // 马上赋值 true, 这样再次触发 函数 上一个判断就为 真(obj.flag 是传递进来的对象的属性,而对象是从外部传进来的,所以 没有被回收), 直接返回 ,不执行以下代码。 var pos = parseInt( hGetStyle(obj, attr)); // 刚开始对象的位置 //抖动函数运动轨迹数组
var arr = []; // 20, -20, 18, -18 ..... 0
var num = 0;
var timer = null;
//自动生成一个运动轨迹的数组
for ( var i=20; i>0; i-=2 ) {
arr.push( i, -i );
}
arr.push(0);
//先清除定时器
clearInterval( obj.shake ); obj.shake = setInterval(function (){
obj.style[attr] = pos + arr[num] + 'px';
num++;
//如果已经运动到最后一个值,清除定时器,执行回调函数
if ( num === arr.length ) {
clearInterval( obj.shake );
endFn && endFn();
obj.flag = false; //抖动结束后, 赋值false, 再次触发这个函数,会执行顶部的判断,就能再次抖动拉
}
}, 50);
} /*
读取或者设置el元素的透明值,val取值为0-1
*/
function hOpacity(el,val) {
var f=el.filters,s=el.style;
if (arguments.length==1)
return f?(f.alpha?(f.alpha.opacity/100):1):(s.opacity||1);
s.zoom=1;
s.filter="alpha(opacity="+parseInt(val*100)+")";
s.opacity=val;
}; //透明度淡出函数
function hFadeOut(obj , time ,endFn){
obj.iNum = 0;
clearInterval(obj.hFadeTimer);
obj.hFadeTimer = setInterval(function(){
obj.iNum++;
//使用设置和读取透明度函数
hOpacity(obj,hOpacity(obj)-0.1);
//处理有些浏览器透明度不能到零的问题。
if(obj.iNum >= 10){
obj.style.opacity = 0;
obj.iNum = 0;
}
if(hGetStyle(obj, 'opacity') == 0){
clearInterval(obj.hFadeTimer);
endFn && endFn();
}
},time)
} //获取当前并设置详细年月日期,设置第二个参数来确定获得的年月日详细情况
function hgetTime(iNum){
var hTime ={}; var myTime = new Date(); var iYear = myTime.getFullYear();
var iMonth = myTime.getMonth()+1;
var iDate = myTime.getDate();
var iWeek = myTime.getDay();
var iHours = myTime.getHours();
var iMin = myTime.getMinutes();
var iSec = myTime.getSeconds(); if( iWeek === 0 ) iWeek = '星期日';
if( iWeek === 1 ) iWeek = '星期一';
if( iWeek === 2 ) iWeek = '星期二';
if( iWeek === 3 ) iWeek = '星期三';
if( iWeek === 4 ) iWeek = '星期四';
if( iWeek === 5 ) iWeek = '星期五';
if( iWeek === 6 ) iWeek = '星期六'; //默认显示所有的年月日星期等详细的信息
if(iNum === 0 || typeof(iNum) == 'undefined'){
hTime.str = iYear+ '年' +iMonth+'月'+iDate+'日 '+iWeek+' '+ toTwo(iHours)+' : '+ toTwo(iMin)+' : '+ toTwo(iSec);
}else if(iNum === 1){
hTime.str = toTwo(iHours)+' : '+ toTwo(iMin)+' : '+ toTwo(iSec);
}else if(iNum === 2){
hTime.str = toTwo(iHours)+toTwo(iMin)+toTwo(iSec);
} function toTwo ( n ) {
return n < 10 ? '0' + n : '' + n;
}
//时间戳
hTime.getTime = Math.floor( myTime.getTime()/1000 );
hTime.Hours = iHours;
hTime.Min = iMin;
hTime.Sec = iSec;
return hTime;
} //倒计时函数 NewTime 为倒计时截止时间 格式为: 'November 27,2015 22:3:0'
function hCountDown(obj ,NewTime , endFn){
/*
* 月份取值:January、February、March、April、May、June、July、August、September、October、November、December
* 时间转换公式:
* 天:Math.floor(t/86400)
* 时:Math.floor(t%86400/3600)
* 分:Math.floor(t%86400%3600/60)
* 秒:t%60
* 获取时间对象:new Date()
- getFullYear
- getMonth
- getDate
- getDay
- getHours
- getMinutes
- getSeconds
- 时间戳:new Date().getTime()-返回从1970年1月1日到现在的毫秒数(UTC时间标准时间)
* */
var iNow = null;
var t = 0;
var str = '';
var timer = null; iNew = new Date( NewTime ); clearInterval( timer ); timer = setInterval (function (){
console.log(NewTime);
iNow = new Date();
t = Math.floor( ( iNew - iNow ) / 1000 );
if ( t >= 0 ) {
str = Math.floor(t/86400)+'天'+Math.floor(t%86400/3600)+'时'+Math.floor(t%86400%3600/60)+'分'+t%60+'秒';
obj.innerHTML = str;
} else {
clearInterval( timer );
endFn && endFn();
} }, 1000);
} //检查是否是数字
//charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。
function hDetectNum(val){
var str = '';
for (var i = 0; i < val.length; i++) {
str = val.charCodeAt(i);
if(str < 47 || str > 57){
return false;
}
}
return true;
} function hShow(obj){
obj.style.display = 'block';
}
function hHide(obj){
obj.style.display = 'none';
}
//查找和替换函数 iNum = 1 时候为替换模式,val2 为'' 的时候为删除 val1 中的内容。
function hReplace(str , val1 , val2 , iNum){
var hReplace = {};
hReplace.flag = true;
hReplace.newStr = ''; function strIndexOf(){
if(str.indexOf(val1) === -1){
hReplace.flag = false;
return hReplace;
}
}
if(typeof(val2) === 'undefined'){
strIndexOf();
hReplace.newStr = str.split(val1).join('<span style="background:yellow;">'+ val1 +'</span>');
}else if(iNum === 1){
strIndexOf();
hReplace.newStr = str.split(val1).join('<span style="background:yellow;">'+ val2 +'</span>');
} return hReplace;
} //获取元素距离浏览器的距离
function hGetPos(obj){
var pos = {left:0,top:0};
while (obj){
pos.left += obj.offsetLeft;
pos.top += obj.offsetTop;
obj = obj.offsetParent;
}
return pos;
}

js基础和工具库的更多相关文章

  1. 让IE8支持HTML5及canvas功能!chart.js图表绘制工具库IE8上兼容方案

    第一步,我们加上对html5的支持. <!--[if IE]> <script src="/public/html5.js" type="text/ja ...

  2. Python——详解collections工具库

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天为大家介绍Python当中一个很好用也是很基础的工具库,叫做collections. collection在英文当中有容器的意思,所以顾 ...

  3. JS工具库之Lodash

    破狼 JavaScript工具库之Lodash 2015-04-11 16:08 by 破狼, 235 阅读, 2 评论, 收藏, 编辑 你还在为JavaScript中的数据转换.匹配.查找等烦恼吗? ...

  4. 学以致用:手把手教你撸一个工具库并打包发布,顺便解决JS浮点数计算精度问题

    本文讲解的是怎么实现一个工具库并打包发布到npm给大家使用.本文实现的工具是一个分数计算器,大家考虑如下情况: \[ \sqrt{(((\frac{1}{3}+3.5)*\frac{2}{9}-\fr ...

  5. 如何手写一个js工具库?同时发布到npm上

    自从工作以来,写项目的时候经常需要手写一些方法和引入一些js库 JS基础又十分重要,于是就萌生出自己创建一个JS工具库并发布到npm上的想法 于是就创建了一个名为learnjts的项目,在空余时间也写 ...

  6. CSV.js – 用于 CSV 解析和编码的 JS 工具库

    逗号分隔值(CSV )文件用于以以纯文本的形式存储表格化数据(数字和文本). CSV 文件包含任意数量的记录,通过某种换行符分隔,每条记录由字段,其他一些字符或字符串分隔,最常用的是文字逗号或制表符. ...

  7. Lo-Dash – 替代 Underscore 的优秀 JS 工具库

    前端开发人员大都喜欢 Underscore,它的工具函数很实用,用法简单.这里给大家推荐另外一个功能更全面的 JavaScript 工具——Lo-Dash,帮助你更好的开发网站和 Web 应用程序. ...

  8. node.js基础模块http、网页分析工具cherrio实现爬虫

    node.js基础模块http.网页分析工具cherrio实现爬虫 一.前言      说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherri ...

  9. [js高手之路] 跟GhostWu一起封装一个字符串工具库-架构篇(1)

    所谓字符串工具库就是利用javascript面向对象的知识封装一个常用的字符串处理方法库,首先给这个库起个名字,好吧就叫ghostwu.js. 看下ghostwu.js的整体架构: ; (functi ...

随机推荐

  1. Users is not mapped(Hibernate实体类采用注解)

    今天做简单的登陆验证web应用时,用HQL语句查询数据表时 总是出现Users is not mapped [from Users u where u.username=? and u.passwor ...

  2. 架设自己的FTP服务器 Serv-U详细配置图文教程

    转自:http://www.jb51.net/article/31635.htm 所有不是很要求安全的情况下是可以用serv_U的,当然我们也可以通过一些设置,保证serv_u安全运行.这里就分享下s ...

  3. ajaxUploadFile在IE9等IE浏览器,上传变json下载的问题解决(SpringMVC + ajaxUploadFile)

    使用ajaxUploadFIle进行文件上传,在google中正常,但是IE中却变成了json文件下载.经过搜索和尝试,解决方案如下: 首先明确,该功能使用$.ajaxFileUpload而非ajax ...

  4. module parameters

    Parameter values can be assigned at load time by insmod or modprobe(this can read parameter from con ...

  5. ios常见问题 经验之谈

    1.既然有问题我们该怎样解决 ? 首先大部分人都会去百度搜索来解决问题, 谁都不例外, 可是百度这东西会有很多误解, 甚至误人子弟, 同时解决问题的效率也不是很高, 如果是技术问题可以去: Googl ...

  6. 免费数据库(SQLite、Berkeley DB、PostgreSQL、MySQL、Firebird、mSQL、MSDE、DB2 Express-C、Oracle XE)

    SQLite数据库是中小站点CMS的最佳选择 SQLite 是一个类似Access的轻量级数据库系统,但是更小.更快.容量更大,并发更高.为什么说 SQLite 最适合做 CMS (内容管理系统)呢? ...

  7. PAT 团体程序设计天梯赛-练习集 L1-002. 打印沙漏

    本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行符号中心对齐:相邻两 ...

  8. openwrt 串口无法登陆

    打印这个消息后串口无法进行交互 procd: - init complete - 主要问题是 /etc下inittab脚本中 ::sysinit:/etc/init.d/rcS S boot::shu ...

  9. zookeeper(1)

    参考文档:zookeeper中文网 一.介绍安装 zookeeper 是一个高效的分布式协调服务,它暴露了一些公用服务,比如命名/配置/同步控制/群组服务等.我们可以使用ZK来实现一些功能,例如:达成 ...

  10. Windows系统新建gitignore文件出现“必须键入文件名”错误的解决办法

    今天打算把本地的项目用git推送到github上去,但是有的信息我又不想把它加入到版本控制系统中去,例如.classpath文件和.class文件等等,这个时候我就想到了使用.gitignore文件把 ...