本篇封装了一些常用的函数,兼容IE8及以下的浏览器,怪异模式。
按需加载loadScript()、绑定事件处理函数addEvet()、查看滚动尺寸getScrollOffset()、查看可视区窗口尺寸getViewportOffset()、返回计算样式getStyle()、获取事件源对象getEventScr(e)、判断类型type()、取消冒泡stopBubble()、深度克隆deepClone()、阻止默认事件cancelHandler()、字节长度排序retBytes()、拖拽方块drag()
按需加载loadScript()
方法一:函数传入一个匿名函数,在该函数参数传入需要执行的参数
1 function loadScript(url,callback){ 2 var script=document.createElement('script'); 3 script.type='text/javascript'; 4 if(script.readyState){ 5 script.onreadystatechange=function (){ 6 if(script.readyState=='complete'||script.readyState=='loaded'){ 7 callback(); 8 } 9 } 10 }else{ 11 script.onload=function (){ 12 callback(); 13 } 14 }//先启动监听事件后下载 15 script.src=url; 16 document.head.appendChild(script); 17 } 18 19 20 //执行函数需注意 21 loadScript('demo.js',function(){test()});
方法二:参数传入字符串形式
function loadScript(url,callback){ var script=document.createElement('script'); script.type='text/javascript'; if(script.readyState){ script.onreadystatechange=function (){ if(script.readyState=='complete'||script.readyState=='loaded'){ eval(callback); } } }else{ script.onload=function (){ eval(callback);; } }//先启动监听事件后下载 script.src=url; document.head.appendChild(script); } //执行函数需注意参数传入字符串形式 loadScript('demo.js','test()');
方法三:适合传入一个tools工具库,执行工具库中的某个函数
function loadScript(url,callback){ var script=document.createElement('script'); script.type='text/javascript'; if(script.readyState){ script.onreadystatechange=function (){ if(script.readyState=='complete'||script.readyState=='loaded'){ tools[callback](); } } }else{ script.onload=function (){ tools[callback](); } }//先启动监听事件后下载 script.src=url; document.head.appendChild(script); } //执行函数需注意参数传入字符串形式 loadScript('demo.js','test');
最后的封装:
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 </head> 8 9 <body> 10 11 <script type="text/javascript"> 12 //按需加载 执行js函数 13 function loadScript(url, callback) { 14 var script = document.createElement('script'); 15 script.type = 'text/javascript'; 16 //ie浏览器监测的方法 17 if (script.readyState) { 18 script.onreadystatechange = function () { 19 if (script.readyState == 'complete' || script.readyState == 'loaded') { 20 callback(); 21 } 22 } 23 } else { 24 //chrome、Firefox、Safari、Opera浏览器的方法 25 script.onload = function () { 26 callback(); 27 } 28 } 29 script.src = url;//先绑定监测的事件,再加载URL。假设下载速度比电脑运行还快的情况 30 document.head.appendChild(script); 31 } 32 // 分界线-------------------------------- 33 //执行需注意url是字符串。函数需传一个匿名函数包裹该test()进去,因为代码未加载就解析test会报错 34 35 /* loadScript('demo.js',function(){ 36 test(); 37 }); 38 */ 39 </script> 40 41 42 </body> 43 44 </html>
绑定事件处理函数addEvet()
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 </head> 8 9 <body> 10 11 <div style=" 100px;height: 100px;background: red;"></div> 12 13 <script type="text/javascript"> 14 15 // 给一个dom对象(elem)添加该事件类型(type)的处理函数(handle) 16 function addEvent(elem, type, handle) { 17 //兼容非ie9以下浏览器 18 if (elem.addEventListener) { 19 elem.addEventListener(type, handle, false); 20 } else if (elem.attachEvent) { 21 //兼容ie浏览器 22 elem.attachEvent('on' + type, function () { 23 handle.call(elem); 24 }) 25 } else { 26 //兼容性很好 27 elem['on' + type] = handle; 28 } 29 } 30 31 32 33 //分界线------------------------------------------------ 34 var div = document.getElementsByTagName('div')[0]; 35 addEvent(div, 'click', test); 36 function test() { 37 console.log("a"); 38 } 39 40 41 42 </script> 43 44 45 </body> 46 47 </html>
查看滚动尺寸getScrollOffset()
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 </head> 8 <body> 9 <!-- br*100 显示滚动条--> 10 11 <script type="text/javascript"> 12 13 function getScrollOffset() { 14 if (window.pageXOffset) { 15 return { 16 x: window.pageXOffset, 17 y: window.pageYOffset 18 } 19 } else { 20 //兼容ie8及ie8以下 21 return { 22 x: document.body.scrollLeft + document.documentElement.scrollLeft, 23 y: document.body.scrollTop + document.documentElement.scrollTop 24 } 25 } 26 } 27 28 </script> 29 </body> 30 31 </html>
查看可视区窗口尺寸getViewportOffset()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> function getViewportOffset() { //兼容非ie浏览器 if (window.innerWidth) { w: window.innerWidth, h : window.innerHeight } else { //兼容怪异模式 if (document.compatMode == "BackCompat") { return { w: document.body.clientWidth, h: document.body.clientHight } } else { //兼容标准模式 ie浏览器 return { w: document.documentElement.clientWidth, h: document.documentElement.clientHight } } } } </script> </body> </html>
返回计算样式getStyle()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div style=" 100px;height:100px;background: red;"></div> <script type="text/javascript"> function getStyle(elem,prop){ //兼容非ie8及以下浏览器 if(window.getComputedStyle){ return window.getComputedStyle(elem,null)[prop]; //null可以放伪元素 但是这里没有做伪元素兼容 }else{ //兼容ie浏览器 return elem.currentStyle[prop]; } } </script> </body> </html>
获取事件源对象getEventScr(e)
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 </head> 8 9 <body> 10 <div style=" 100px;height: 100px;background: red;"></div> 11 <script type="text/javascript"> 12 13 function getEventScr(e) { 14 var event = e || window.event;//兼容ie 15 var target = event.target || event.scrEvent;//event.target兼容火狐、event.scrEvent兼容ie。Chrome两兼容 16 console.log(target); 17 } 18 19 20 //分界线------------------------------------- 21 var div = document.getElementsByTagName('div')[0]; 22 div.onclick = function (e) { 23 getEventScr(e); 24 } 25 26 </script> 27 28 29 </body> 30 31 </html>
判断类型type()
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 </head> 8 9 <body> 10 11 <script type="text/javascript"> 12 13 function type(target) { 14 var template = { 15 "[object Array]": "array", 16 "[object Object]": "object", 17 "[object Number]": "number-object", 18 "[object Boolean]": "boolean-object", 19 "[object String]": "string-object" 20 } 21 22 //1.分两类 原始值 引用值 23 //2.区分引用值 24 if (target == null) { 25 return null; 26 } 27 if (typeof (target) == 'object') { 28 //数组 29 //对象 30 //包装类 Object.prototype.toString 31 var str = Object.prototype.toString.call(target);//属性名 32 return template[str];//属性值 33 } else { 34 return typeof (target);//原始值 和 function 35 } 36 } 37 38 39 </script> 40 41 42 43 </body> 44 45 </html>
取消冒泡stopBubble()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> function stopBubble(event) { //兼容非ie9以下浏览器 if (event.stopPropagation) { event.stopPropagation(); } else { //兼容ie浏览器 event.cancelBubble = true; } } </script> </body> </html>
深度克隆deepClone()
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 </head> 8 9 <body> 10 11 <script type="text/javascript"> 12 13 function deepClone(origin, target) { 14 var target = target || {}, 15 toStr = Object.prototype.toString, 16 arrStr = "[object Array]"; 17 for (var prop in origin) { 18 if (origin.hasOwnProperty(prop)) { 19 if (origin[prop] !== "null" && typeof (origin[prop]) == 'object') { 20 if (toStr.call(origin[prop]) == arrStr) { 21 target[prop] = []; 22 } else { 23 target[prop] = {}; 24 } 25 deepClone(origin[prop], target[prop]); 26 } else { 27 target[prop] = origin[prop] 28 } 29 } 30 } 31 return target; 32 }; 33 34 35 // 以下为界限 36 var obj = { 37 name: "liang", 38 age: 18, 39 son: { 40 name: "hua", 41 age: 11, 42 arr: [1, 2, 3] 43 } 44 }; 45 46 47 </script> 48 49 50 </body> 51 52 </html>
阻止默认事件cancelHandler()
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 </head> 8 9 <body> 10 11 <script type="text/javascript"> 12 13 function cancelHandler(event) { 14 // 兼容非ie浏览器 15 if (event.preventDefault) { 16 event.preventDefault(); 17 } else { 18 // 兼容ie浏览器 19 event.returnValue = false; 20 } 21 } 22 23 //分界线------------------------------------- 24 document.oncontextmenu = function (e) { 25 console.log(e); 26 cancelHandler(e); 27 } 28 29 </script> 30 31 32 33 </body> 34 35 </html>
字节长度排序retBytes()
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 </head> 8 9 <body> 10 11 <script type="text/javascript"> 12 13 function retBytes(str) { 14 var num = len = str.length; 15 for (var i = 0; i < len; i++) { 16 if (str.charCodeAt(i) > 255) { 17 num++; 18 } 19 } 20 return num; 21 } 22 var arr = ['a邓', 'bbbbden邓哥过', 'ddddnkkjkdjfkffhhaf']; 23 arr.sort(function (a, b) { 24 return retBytes(a) - retBytes(b); 25 }); 26 27 </script> 28 </body> 29 30 </html>
拖拽方块drag()
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>Document</title> 7 </head> 8 9 <body> 10 11 <div style="100px;height:100px;background-color:red;position:absolute;left:0;top:0;border-radius: 50%"></div> 12 13 <script type="text/javascript"> 14 15 var div = document.getElementsByTagName('div')[0]; 16 17 function drag(elem) { 18 elem.onmousedown = function (e) { 19 var event = e || window.event; 20 disX = event.pageX - parseInt(elem.style.left); 21 disY = event.pageY - parseInt(elem.style.top); 22 document.onmousemove = function (e) { 23 var event = e || window.event; 24 elem.style.left = event.pageX - disX + "px"; 25 elem.style.top = event.pageY - disY + "px"; 26 } 27 document.onmouseup = function () { 28 document.onmousemove = null; 29 } 30 } 31 } 32 33 34 drag(div); 35 36 </script> 37 38 </body> 39 40 </html>
时钟定时器
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style type="text/css"> 7 input{ 8 border:1px solid rgba(0,0,0,0.8); 9 text-align: right; 10 font-size: 18px; 11 font-weight: bold; 12 } 13 14 </style> 15 </head> 16 <body> 17 18 minutes:<input type="text" value="0"> 19 seconds:<input type="text" value="0"> 20 21 <script type="text/javascript"> 22 var minutesNode=document.getElementsByTagName('input')[0]; 23 var secondsNode=document.getElementsByTagName('input')[1]; 24 var minutes=0, 25 seconds=0; 26 var timer=setInterval(function(){ 27 seconds++; 28 if(seconds==60){ 29 seconds=0; 30 minutes++; 31 } 32 secondsNode.value=seconds; 33 minutesNode.value=minutes; 34 if(minutes==3){ 35 clearInterval(timer); 36 } 37 38 },10); 39 40 </script> 41 42 43 </body> 44 </html>
仿新搜索框
<input type="text" style="color: #999;position: relative;" onfocus="if(this.value=='请输入用户名') {this.value=''; this.style.color='#424242'}" onblur="if (this.value=='') {this.value='请输入用户名'; this.style.color='#999'}" value="请输入用户名">
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> .inp-txt { color: #666; border: #ff8400 solid 1px; } .submit-second-btn { background: #ff8400; border: 0; } </style> </head> <body> <input type="text" maxlength="40" value="请输入关键字" name="SerchKey" class="inp-txt" onfocus="if(this.value=='请输入关键字'){this.value='';this.className='inp-txt inp-txt-active'}" onblur="if(this.value==''){this.value='请输入关键字';this.className='inp-txt'}" autocomplete="off"> <input type="submit" name="SearchSubButton" class="submit-second-btn" value="搜索" onmouseover="this.className='submit-second-btn submit-second-btn-hover'" onmouseout="this.className='submit-second-btn'" suda-uatrack="key=index_new_search&value=search_click"> </body> </html>