js基础和工具库
/*
* 作者: 胡乐
* 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基础和工具库的更多相关文章
- 让IE8支持HTML5及canvas功能!chart.js图表绘制工具库IE8上兼容方案
第一步,我们加上对html5的支持. <!--[if IE]> <script src="/public/html5.js" type="text/ja ...
- Python——详解collections工具库
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天为大家介绍Python当中一个很好用也是很基础的工具库,叫做collections. collection在英文当中有容器的意思,所以顾 ...
- JS工具库之Lodash
破狼 JavaScript工具库之Lodash 2015-04-11 16:08 by 破狼, 235 阅读, 2 评论, 收藏, 编辑 你还在为JavaScript中的数据转换.匹配.查找等烦恼吗? ...
- 学以致用:手把手教你撸一个工具库并打包发布,顺便解决JS浮点数计算精度问题
本文讲解的是怎么实现一个工具库并打包发布到npm给大家使用.本文实现的工具是一个分数计算器,大家考虑如下情况: \[ \sqrt{(((\frac{1}{3}+3.5)*\frac{2}{9}-\fr ...
- 如何手写一个js工具库?同时发布到npm上
自从工作以来,写项目的时候经常需要手写一些方法和引入一些js库 JS基础又十分重要,于是就萌生出自己创建一个JS工具库并发布到npm上的想法 于是就创建了一个名为learnjts的项目,在空余时间也写 ...
- CSV.js – 用于 CSV 解析和编码的 JS 工具库
逗号分隔值(CSV )文件用于以以纯文本的形式存储表格化数据(数字和文本). CSV 文件包含任意数量的记录,通过某种换行符分隔,每条记录由字段,其他一些字符或字符串分隔,最常用的是文字逗号或制表符. ...
- Lo-Dash – 替代 Underscore 的优秀 JS 工具库
前端开发人员大都喜欢 Underscore,它的工具函数很实用,用法简单.这里给大家推荐另外一个功能更全面的 JavaScript 工具——Lo-Dash,帮助你更好的开发网站和 Web 应用程序. ...
- node.js基础模块http、网页分析工具cherrio实现爬虫
node.js基础模块http.网页分析工具cherrio实现爬虫 一.前言 说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherri ...
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-架构篇(1)
所谓字符串工具库就是利用javascript面向对象的知识封装一个常用的字符串处理方法库,首先给这个库起个名字,好吧就叫ghostwu.js. 看下ghostwu.js的整体架构: ; (functi ...
随机推荐
- doT.js实例详解
doT.js详细介绍 doT.js特点是快,小,无依赖其他插件.官网:http://olado.github.iodoT.js详细使用介绍 使用方法:{{= }} for interpolation{ ...
- 二十四、oracle pl/sql 变量
一.变量介绍在编写pl/sql程序时,可以定义变量和常量:在pl/sql程序中包括有:1).标量类型(scalar)2).复合类型(composite) --用于操作单条记录3).参照类型(refer ...
- dump报文转换为wrieshark报文
我们开发中经常会出原始的报文,如下所示: 45 00 01 3d 8e 6a 00 00 80 11 ab 46 00 00 00 00 ff ff ff ff 00 44 00 43 01 29 6 ...
- css后续属性
- USACO 1.3 Wormholes
Wormholes Farmer John's hobby of conducting high-energy physics experiments on weekends has backfire ...
- 为什么PHP(CLI)同一个错误信息会打印两次?
第一个信息是display_errors输出的,在fpm环境下输出到浏览器那里,而在CLI环境下会打印到屏幕上. display_errors = On 第二个信息是log_errors输出的. lo ...
- 屏幕居中(DIV/CSS) 的几种方法(转)
1.利用table特性,在width and height all set 100%的时候,可以把容器嵌套在td内形成绝对居中,此时的被嵌套容器可为绝对或者相对大小.(非标准)注意不能加声明! 如是在 ...
- 14.hibernate的反向生成实现全套增删改查
图片顺序就是步骤顺序 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
- Kettle中spoon.sh在使用时报错
报错信息: Attempting to load ESAPI.properties via file I/O. Attempting to load ESAPI.properties as resou ...
- informix建临时表索引
对于特殊字段,比如外键,主键,在不知道外键主键名的情况下,需要如下操作select constrname from sysconstraints where constrtype='R' and ta ...