原生javascript封装的函数

时间:2022-01-14 17:06:25

1.javascript 加载的函数

window.onload = function(){}

2.封装的id函数

    function $(id) {
return document.getElementById(id);
} //调用 $("id")

3.封装的数组id

    function $arr(array) {
return document.getElementsByTagName(array);
} //调用 $arr("数组")

4.自定义平均值函数

    function avg(array) {
var sum = 0;
var len = array.length;
for (var i = 0; i < len; i++) {
sum += array[i];
}
return sum / len;
}

5.全选取消

    function all(flag) {
for (var i = 0; i < inputs.length; i++) {
inputs[i].checked = flag;
}
}

6.封装的类函数

//【主流浏览器(谷歌,火狐,IE9以上的包括IE9)都支持document.getElementsByClassName()函数,IE678不支持】

    function getClass(classname, id) {
// 主流浏览器带id
if (document.getElementsByClassName) {
if (id) {
var eleId = document.getElementById(id);
return eleId.getElementsByClassName(classname);
}
// 不带id
else {
return document.getElementsByClassName(classname);
}
} // IE678浏览器 带id
if (id) {
var eleId = document.getElementById(id);
var dom = eleId.getElementsByTagName("*");
}
// 不带id
else {
var dom = document.getElementsByTagName("*");
}
var arr = [];
for (var i = 0; i < arr.length; i++) {
var txtarr = dom[i].className.split(" ");
for (var j = 0; j < txtarr.length; j++) {
if (txtarr.className == classname) {
arr.push(dom[j]);
}
}
}
}

7.显示函数

    function show(obj) {
obj.style.display = "block";
} //调用 show(id)

8.隐藏函数

    function hide(obj) {
obj.style.display = "none";
}

9.封装的id和类函数

    function getClass(classname, id) {
// 主流浏览器带id
if (document.getElementsByClassName) {
if (id) {
var eleId = document.getElementById(id);
return eleId.getElementsByClassName(classname);
}
// 不带id
else {
return document.getElementsByClassName(classname);
}
} // IE678浏览器 带id
if (id) {
var eleId = document.getElementById(id);
var dom = eleId.getElementsByTagName("*");
}
// 不带id
else {
var dom = document.getElementsByTagName("*");
}
var arr = [];
for (var i = 0; i < arr.length; i++) {
var txtarr = dom[i].className.split(" ");
for (var j = 0; j < txtarr.length; j++) {
if (txtarr.className == classname) {
arr.push(dom[j]);
}
}
}
} function $(str) {
var s = str.charAt(0);
var ss = str.substr(1);
switch (s) {
case "#":
return document.getElementById(ss);
break;
case ".":
return getClass(ss);
break;
default :
return document.getElementsByTagName(str);
}
}

10.封装的scollTop函数

    function scroll() {
// 支持IE9+ 和其他主流浏览器
if (window.pageYOffset != null) {
return {
left: window.pageXOffset,
top: window.pageYOffset
}
}
// 声明了DTD
// 检测是不是怪异模式的浏览器,就是没有声明<!DOCTYPE html>
else if (document.compatMode == "CSS1Compat") {
return {
// document.documentElement就是document.html的意思 ,但是没有documen.html写法,谷歌不支持这个
left: document.documentElement.scrollLeft,
top: document.documentElement.scrollTop
}
}
// 剩下的肯定就是怪异模式的
return {
left: document.body.scrollLeft,
top: document.body.scrollTop
}
} // 调用
window.onscroll = function () {
// scroll().top 就是仿json的写法
console.log(scorll().top);
}

11.封装的可视区域大小的函数

     function client() {
if (window.innerWidth != null) // ie9 + 最新浏览器
{
return {
width: window.innerWidth,
height: window.innerHeight
}
}
else if (document.compatMode === "CSS1Compat") // 标准浏览器
{
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
}
}
return { // 怪异浏览器
width: document.body.clientWidth,
height: document.body.clientHeight }
}

12.阻止冒泡

//事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。
顺序
IE 6.0:
div -> body -> html -> document
其他浏览器:
div -> body -> html -> document -> window 不是所有的事件都能冒泡。以下事件不冒泡:blur、focus、load、unload //阻止冒泡
e ? e.stopPropagation() : window.event.cancelBubble = true;

13.匀速动画

    function animate(obj, target) {
clearInterval(obj.timer); // 先清除定时器
var speed = obj.offsetLeft < target ? 15 : -15; // 用来判断 应该 + 还是 -
obj.timer = setInterval(function () {
var result = target - obj.offsetLeft; // 因为他们的差值不会超过5
obj.style.left = obj.offsetLeft + speed + "px";
if (Math.abs(result) <= 15) // 如果差值不小于 5 说明到位置了
{
clearInterval(obj.timer);
obj.style.left = target + "px"; // 有5像素差距 我们直接跳转目标位置
}
}, 10)
}

14.缓动动画

    function slowanimate(obj, target) {
clearInterval(obj.timer);
// 定义步长
obj.timer = setInterval(function () {
var step = (target - obj.offsetLeft) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
obj.style.left = obj.offsetLeft + step + "px";
if (target == obj.offsetLeft) {
clearInterval(obj.timer);
}
}, 30);
}

15.封装的获得CSS样式的函数

    function getStyle(obj, attr) {
// IE浏览器 所有IE
if (obj.currentStyle) {
return obj.currentStyle[attr];
}
else {
// w3c 浏览器
return window.getComputedStyle(obj, null)[attr];
}
} //调用 getStyle(demo,"width") 注意:属性必须写引号

16.封装运动框架的单个属性

    function slowanimate(obj, attr, target) {
// 动画原理 盒子本身的样式 + 步长
clearInterval(obj.timer);
obj.timer = setInterval(function () {
var current = parseInt(getStyle(obj, attr));
var step = (target - current) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
obj.style[attr] = current + step + "px";
if (current == target) {
clearInterval(obj.timer);
}
}, 30);
}

17.封装运动框架的多个属性

    function slowanimate(obj, json) {
clearInterval(obj.timer);
obj.timer = setInterval(function () {
for (var attr in json) {
var current = parseInt(getStyle(obj, attr));
var step = (json[attr] - current) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
obj.style[attr] = current + step + "px";
}
}, 30);
}

18.封装运动框架的多个属性 带回调函数、透明度、层级

    function animate(obj, json, fn) {
clearInterval(obj.timer);
obj.timer = setInterval(function () {
var flag = true;
for (var attr in json) {
var current = 0;
if (attr == "opacity") {
current = Math.round(parseInt(getStyle(obj, attr) * 100)) || 0;
}
else {
current = parseInt(getStyle(obj, attr));
} var step = (json[attr] - current) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
// 判断透明度
if (attr == "opacity") {
// 主流浏览器
if ("opacity" in json) {
obj.style.opacity = (current + step) / 100;
}
// IE浏览器
else {
obj.style.filter = "alpha(opacity = " + (current + step) * 10 + ")";
}
}
else if (attr == "zIndex") {
obj.style.zIndex = json[attr];
}
else {
obj.style[attr] = current + step + "px";
}
if (current != json[attr]) {
flag = false;
}
}
if (flag) {
clearInterval(obj.timer);
if (fn) {
fn();
}
}
}, 30);
} //调用animate(box,{width:200,left:400,height:800,opacity:30,zIndex:3}, function () {});

19.js原生手机滑动手势

    //返回角度
function GetSlideAngle(dx, dy) {
return Math.atan2(dy, dx) * 180 / Math.PI;
} //根据起点和终点返回方向 1:向上,2:向下,3:向左,4:向右,0:未滑动
function GetSlideDirection(startX, startY, endX, endY) {
var dy = startY - endY;
var dx = endX - startX;
varresult = 0; //如果滑动距离太短
if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
return result;
} var angle = GetSlideAngle(dx, dy);
if (angle >= -45 && angle < 45) {
result = 4;
} else if (angle >= 45 && angle < 135) {
result = 1;
} else if (angle >= -135 && angle < -45) {
result = 2;
}
else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
result = 3;
} return result;

20.检测字符长度(包含中英文)

   //如果直接用str.length  会把中文也按照一个字符来计算,可是一个中文应该占两个字符,所以封装这个函数

   function getStringLength(str) {
// 存储字符的总长度
var len = 0;
// 存储每一个编码
var c = 0;
for (var i = 0; i < str.length; i++) {
c = txt.charCodeAt(i);
if (c >= 0 && c <= 127) {
len++;
}
else {
len += 2;
}
}
// 返回字符长度
return len;
}

21.自制滚动条

    //首先计算滚动条的高度
// 动态计算滚动条的告诉 滚动条高度/容器的高度 = 容器的高度 / 内容的高度
bar.style.height = box.offsetHeight * box.offsetHeight / content.offsetHeight + "px";
//obj 滚动条 target 内容盒子
function startScroll(obj, target) {
obj.onmousedown = function (event) {
var event = event || window.event;
var y = event.clientY - this.offsetTop;
var that = this;
document.onmousemove = function (event) {
var event = event || window.event;
// 滚动条的的top
var barTop = event.clientY - y;
// 内容盒子的高度 = (大盒子高度-内容盒子的高度)/(滚动盒子的高度 - 滚动条的高度)* 滚动条的top值
var contentTop = (target.offsetHeight - target.parentNode.offsetHeight) / (target.parentNode.offsetHeight - that.offsetHeight) * barTop;
if (barTop <= 0) {
barTop = 0;
} else if (barTop >= target.parentNode.offsetHeight - that.offsetHeight) {
barTop = target.parentNode.offsetHeight - that.offsetHeight + "px";
} else {
target.style.top = -contentTop + "px";
}
that.style.top = barTop + "px";
window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); // 防止拖动滑块的时候,选中文字
}
}
document.onmouseup = function () {
document.onmousemove = null;
}
}

22.阶乘(递归算法)

    function factorial(i) {
if (i > 1) {
return factorial(i - 1) * i;
} else {
return 1;
}
}
//调用 factorial(5) 5!

23.倒计时

  function showTime(obj) {
var box = document.querySelector(obj);
var ms = new Date("2018/2/11").getTime()- new Date().getTime();
var day = parseInt(ms/1000/3600/24);
var hour = Math.floor(ms/1000/3600%24);
var minute = parseInt(ms/1000/60%60);
var second = parseInt(ms/1000%60);
hour >= 10 ? hour : hour = "0" + hour;
minute >= 10 ? minute : minute = "0" + minute;
second >= 10 ? second : second = "0" + second;
box.innerHTML = "距离放假还有"+day+"天"+hour+"小时"+minute+"分"+second+"秒";
}

24.针对数组的升序降序排列

 //针对数组sort()方法的排序
 var arr = [4, 12, 36, 76, 21, 9, 19, 42];
//升序
//第一种
function asc(a,b){
return a-b;
}
//调用 console.log(arr.sort(asc));
//第二种
var res =arr.sort(function (a,b){
return a-b;  
})   //降序
//第一种
function desc(a,b){      
return b-a;
}  
console.log(arr.sort(desc));
//第二种  
var res = arr.sort(function(a,b)){
return b-a;
} //如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一:
负值,如果所传递的第一个参数比第二个参数小。
负值:就不换位置
零,如果两个参数相等。
正值,如果第一个参数比第二个参数大。
正值:就换位置

25.针对数组的累加求和

arr.reduce(function(total,current,index,arr){
return total+current;
})

26.正则验证身份证

//身份证号验证正则
function validateIdCard(idCard){
//15位和18位身份证号码的正则表达式
var regIdCard=/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/; //如果通过该验证,说明身份证格式正确,但准确性还需计算
if(regIdCard.test(idCard)){
if(idCard.length==18){
var idCardWi=new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ); //将前17位加权因子保存在数组里 var idCardY=new Array( 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ); //这是除以11后,可能产生的11位余数、验证码,也保存成数组 var idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和
for(var i=0;i<17;i++){
idCardWiSum+=idCard.substring(i,i+1)*idCardWi[i];
} var idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置 var idCardLast=idCard.substring(17);//得到最后一位身份证号码 //如果等于2,则说明校验码是10,身份证号码最后一位应该是X
if(idCardMod==2){
if(idCardLast=="X"||idCardLast=="x"){
return true;
}else{
return false;
}
}else{
//用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
if(idCardLast==idCardY[idCardMod]){
return true;
}else{
return false;
}
}
}
}else{
return false;
}
}

26.验证京东密码

// 验证密码
function testPwd(obj){
// 一种组合
// 纯数字组合
var numReg = /^\d{6,20}$/;
// 纯字母组合
var letterReg = /^[a-zA-Z]{6,20}$/;
// 纯英文字符组合
var charReg = /^[`~!|@#\$%\^&*()_\-\+\/=、<>'",\?\;]{6,20}$/;
// 纯中文字符组合
var zhCharReg = /^[?,。《》]{3,10}$/;
// 纯汉字组合
var wordReg = /^[\u4e00-\u9fa5]{6,20}$/; // 两种组合
// 数字和字母两种组合
var twoReg = /^[0-9a-zA-Z]{6,20}$/;
// 数字和英文字符组合
var nlReg = /^[\d`~!|@#\$%\^&*()_\-\+\/=、<>'",\?\;]{6,20}$/;
// 数字和中文字符组合
var nzReg = /^[\d?,。《》]{6,20}$/;
// 数字和中文汉字组合
var nwReg = /^[\d\u4e00-\u9fa5]{6,20}$/;
// 字母和纯英文字符组合
var lcReg = /^[a-zA-Z`~!|@#\$%\^&*()_\-\+\/=、<>'",\?\;]{6,20}$/;
// 字母和中文字符组合
var lzReg = /^[a-zA-Z?,。《》]{6,20}$/;
// 字母和中文汉字
var lwReg = /^[a-zA-Z\u4e00-\u9fa5]{6,20}$/;
// 英文字符和中文字符组合
var czReg = /^[?,。《》`~\!\|@#\$%\^&*()_\-\+\/=、<>'",\?\;]{6,20}$/;
// 英文字符和中文汉字
var cwReg = /^[\u4e00-\u9fa5\`~!|@#\$%\^&*()_\-\+\/=、<>'",\?\;]{6,20}$/;
// 中文字符和中文汉字
var zwReg = /^[\u4e00-\u9fa5\^[?,。《》]{6,20}$/; if (numReg.test(obj) == true || letterReg.test(obj) == true || charReg.test(obj) == true || zhCharReg.test(obj) || wordReg.test(obj)) {
alert("有被盗风险,建议使用字母、数字和符号两种及以上组合");
} else if (twoReg.test(obj) == true || nlReg.test(obj) == true || nzReg.test(obj) == true || nwReg.test(obj) == true || lcReg.test(obj) == true || lzReg.test(obj) == true || lwReg.test(obj) == true || czReg.test(obj) == true || cwReg.test(obj) == true || zwReg.test(obj) == true) {
alert("安全强度适中,可以使用三种以上的组合来提高安全强度");
} else if (obj.length >= 6) {
alert("你的密码安全");
} else {
alert("请核对输入");
}
}

27.利用正则替换路径问题

/*
* 需求:给图片的src地址前面增加为assets
*
* 1. 将需要匹配的内容原封不动的写入正则表达式
* 2. 将改变的内容替换为.*?
* 3. 将.*?添加(),目的是为了能够将src中的内容单独匹配一次作为匹配结果
* 4.通过replace将内容替换
* content.replace(reg,'<img src="assets/$1" alt="">')
* */
<body>
<ul>
<li class="images"><a href="1.html"><img class="a" src="data:images/1.jpg" alt="134534"></a></li>
<li><a href="2.html"><img src="data:images/2.jpg" alt="asdfas2"></a></li>
<li><a href="3.htlm"><img src="data:images/3.jpg" class="b" alt="3asdf"></a></li>
<li><a href="4.html"><img src="data:images/4.jpg" alt="45asdf4"></a></li>
<li><a href="5.html"><img src="data:images/5.jpg" alt="zxcv5" title="abc"></a></li>
</ul>
</body> <script>
//1。获取ul对象
var ul = document.querySelector('ul');
// 2.获取ul的文本内容,此时就是获取出来ul里所有的内容
var content = ul.innerHTML;
// 3.写正则表达式,先把需要改变的地址原封不动拿过来
// <img src="data:images/3.jpg" class="b" alt="3asdf">把不一样地方用(.*?)替换,如下
// .匹配的是非空字符*匹配任意数量?拒绝贪婪,匹配任意数量的非空字符,如果不加?,就会匹配到最后
var reg = /<img(.*?)src="(.*?)"(.*?)>/g;
var result = content.replace(reg,'<img$1src="assets/$2"$3>')
console.log(result);
</script>

28.去除数组中的重复值,打印出不重复的元素

    function unique(arr) {
// 定义一个空数组,用来存放不重复的值
var newArr = [];
// 遍历原数组
for (var i = 0; i < arr.length; i++) {
// 如果新数组里查找原数组 ,因为查找不到indexOf的值为-1,如果查找不到就把原数组的值放到新数组中
if (newArr.indexOf(arr[i]) == -1) {
newArr.push(arr[i]);
}
}
return newArr;
}

29.获取url地址的后缀名

    var str = "https://www.baidu.com/index.php?tn=78040160_40_pg";
两种方法:任选其一
// 数组拆分
function getURLtype(str){
var arr = str.split(".");
var arr1 = arr[arr.length - 1].split("?");
console.log(arr1[0]);
}
//输出php // lastIndexOf
function getURLtype(str) {
var index = str.lastIndexOf(".");
var index2 = str.indexOf("?");
console.log(str.slice(index, index2));
}
//输出.php

30.字符串转换为对象

    function strToObj(str) {
// 定义一个空对象
var obj = {};
// 切割字符串为数组
var arr = str.split("; ");
// 遍历数组
arr.forEach(function (value, key) {
// 获取第一个等号出现的位置
var index = arr[key].indexOf("=");
// 以等号切割
var res = arr[key].split(/[=]/);
obj[res[0]] = arr[key].slice(index + 1);
})
console.log(obj);
}

31.查找字符串的每个字符在字符串出现的次数,从小到大输出

    function strCount(str) {
var obj = {};
for (var i = 0; i < str.length; i++) {
if (obj[str[i]]) {
//obj[str[i]] 是对象的一种形式,也就是obj[str[0]] 就是obj['a']=obj.a,在str中查找obj.a obj.b 等等,如果找到 就+1,找不到就是1
obj[str[i]]++;
} else {
obj[str[i]] = 1;
}
}
// 获取object.keys ["1", "2", "a", "b", "d", "e"]
var num = Object.keys(obj).sort(function (a,b) {
// obj[a] obj.1 就是次数
return obj[a]-obj[b];
}); var newObj = {};
for (var item in num) {
newObj[num[item]] = obj[num[item]];
}
return newObj;
}

32.全选,取消全选,反选

    // 全选
function allSelect(obj, input) {
obj.onclick = function () {
input.forEach(function (value, key) {
input[key].checked = true;
})
}
} // 取消全选
function cancelSelect(obj, input) {
obj.onclick = function () {
input.forEach(function (value, key) {
input[key].checked = false;
})
}
} // 反选
function reverseSelect(obj, input) {
obj.onclick = function () {
input.forEach(function (value, key) {
if (input[key].checked){
input[key].checked = false;
} else {
input[key].checked = true;
}
})
}
}

33.添加类名、删除类名(移除类名)

    // 添加类名
function addClass(obj, className) {
// 获取对象的类名,并且去掉两边空格 以防class = " box "的情况
var oldClass = obj.className.trim();
// 把获取到的对象的类名以空格的形式拆分为数组,指定的形式可以是正则表达式,/\s+/ \s是匹配到空格,+最少匹配一个,以防页面中有多个空格
var classArr = oldClass.split(/\s+/);
// 在拆分后的数组中查找要传进来的类名,通过索引值,如果索引值为-1,就查找不到
if (classArr.indexOf(className) == -1) {
// 找不到需要添加的类型的话,就把这个类名添加到数组中
classArr.push(className);
// 然后把添加类名的对象的类名的数组形式转换为字符串,此时obj.className中的className 不是形参,而是类名
obj.className = classArr.join(' ');
}
} // 移除类名
function removeClass(obj, className) {
var oldClass = obj.className.trim();
var classArr = oldClass.split(/\s+/);
// 在拆分后的数组如果找到了需要移除的类名,那么就移除这个类名
if (classArr.indexOf(className) != -1) {
classArr.splice(classArr.indexOf(className), 1);
obj.className = classArr.join(' ');
}
}

34.放大镜效果

    /*
* 功能:实现电商网站放大镜效果
* @param Object box: 放大镜最大盒子的容器
* @param Object small: 放小图片的小盒子
* @param Object smallImg: 小盒子的图片
* @param Object shadow: 鼠标遮罩的阴影层
* @param Object big: 装放大图片的盒子
* @param Object bigImg: 放大的图片
* */
function magnifier(box, small, smallImg, shadow, big, bigImg) {
// 鼠标移入小盒子,显示阴影放大镜盒子
small.onmouseenter = function () {
shadow.style.display = "block";
big.style.display = "block"; // 设置阴影盒子的宽高阴影盒子的宽高,不是随便给的
// 阴影盒子的宽高/small盒子的宽高 应该等于 big盒子的宽高(不能包含边框 ,所以用clientWidth 因为offsetWidth包含宽高)/ bigImg的宽高,他们是等比例关系 也就是x/450 = 540/800
shadow.style.width = small.offsetWidth * big.clientWidth / bigImg.offsetWidth + "px";
shadow.style.height = small.offsetWidth * big.clientWidth / bigImg.offsetWidth + "px"; // 移动阴影,因为只有在进入small盒子是,才可以移动,所以在这里出发移动事件
small.onmousemove = function (ent) {
var e = ent || window.event;
/*
* 让鼠标一直保持在阴影盒子的中间,所以鼠标的起始位置就是阴影盒子的宽高的一半
* 阴影的left/top值= 鼠标距离页面的距离 - 小盒子距离页面的距离 - 阴影盒子自身(宽高)的一半
* */
// 此时没有small盒子的offsetLeft 是因为offsetLeft属性是距离有定位的祖辈盒子的距离,因为small的父级盒子box相对定位,所以small.offsetLeft 永远都为0,因为box和small盒子一样大,所以用box.offsetLeft // 为了不让阴影盒子超出边界,需要判断一下,
var left = e.pageX - box.offsetLeft - shadow.offsetWidth / 2;
if (left < 0) {
left = 0;
} else if (left > box.offsetWidth - shadow.offsetWidth) {
left = box.offsetWidth - shadow.offsetWidth;
} var top = e.pageY - box.offsetTop - shadow.offsetHeight / 2;
if (top < 0) {
top = 0;
} else if (top > box.offsetWidth - shadow.offsetWidth) {
top = box.offsetWidth - shadow.offsetWidth;
} shadow.style.left = left + "px";
shadow.style.top = top + "px"; // 上面都是计算出阴影的移动,下面计算出放大镜的右侧盒子移动的部分
/*
* 放大镜应该是等比例缩放的,small盒子的宽高450,放大镜图片的是800
* 右侧盒子和左侧盒子的比例就是800/450,假如 左侧鼠标的坐标位置是(100,100),如果他们是二倍关系,那么右侧盒子图片的坐标就是应该(100*2,100*2)
* 所以右侧盒子图片的left,top值就应该是(左侧left*800/450,左侧top*800/450)
* 由于右侧是盒子里面包含一个特别大的图片,图片的内容也超出右侧盒子的距离,可以用big.scrollTop(Left) 来设置坐标
* */
big.scrollTop = top * bigImg.offsetHeight / smallImg.offsetWidth;
big.scrollLeft = left * bigImg.offsetHeight / smallImg.offsetWidth;
}
}
// 鼠标离开小盒子,继续隐藏
small.onmouseleave = function () {
shadow.style.display = "none";
big.style.display = "none";
}
};

35.添加移除绑定事件

/*
* 添加绑定事件
* @param Object obj:绑定的事件对象
* @param String eventName:绑定的事件名称
* @param function callback:绑定事件执行的函数
* */
function addEvent(obj, eventName, callback) {
if (obj.addEventListener) {
obj.addEventListener(eventName, callback, false);
} else {
obj.attachEvent('on' + eventName, callback);
}
} /*
* 移除绑定事件
* @param Object obj:移除绑定的事件对象
* @param String eventName:移除绑定的事件名称
* @param function callback:移除绑定事件执行的函数
* */
function removeEvent(obj, eventName, callback) {
if (obj.removeEventListener) {
obj.removeEventListener(eventName, callback, false);
} else {
obj.detachEvent('on' + eventName, callback);
}
}

36.获取样式

    /*
* 获取样式
* @param Object obj获取样式的对象
* @param Object attr:获取的css样式名称
* return 获取样式的值
* */
function getStyle(obj, attr) {
return document.defaultView ? document.defaultView.getComputedStyle(obj, null)[attr] : obj.currentStyle[attr];
}
// 调用,需要给attr加引号
console.log(getStyle(box, 'backgroundColor'));
主流浏览器获取的颜色都转换成rgb值,IE8获取的是style样式里面写的属性值,写什么就是什么

37.阻止默认行为

e ?e.preventDefault() : window.event.returnValue = false;e ?e.preventDefault() : window.event.returnValue = false;

38.移动端视口

function getFontSize() {
// 定义html的字体大小
var htmlFontSize = 16;
// 以iphone6为准 设置窗口宽度
var cw = 375;
// 获取新窗口的可视宽度
var newCw = document.documentElement.clientWidth || document.body.clientWidth;
// 获取新窗口的字体大小
var newHtmlFontSize = newCw * htmlFontSize / cw;
document.documentElement.style.fontSize = newHtmlFontSize + 'px';
}