1、JS脚本放置位置
页面内的JS脚本中,各种公共函数和变量应放在head标签之间,而将页面加载期间执行的代码、dom对象初始化以及与dom相关的全局引用赋值操作放在body标签之间,如果没有特殊要求,不妨放在body标签之前。
2、js命名规范和代码注释
JS区分大小写,包括数字、字母、下划线(_)、美元符($),小写字符命名变量,保留字可根据系统默认大小写来输入;类和构造函数使用大写首字符
单行注释,//注释内容;多行注释,/*注释内容*/
3、变量作用域
函数外var全局变量,函数内var局部变量;不适用var声明的都是局部变量
4、with语句(一般不建议使用)
<script type="text/javascript" language="javascript"> with(document.getElementById("box").style){ borderColor="red"; borderWidth="1px"; borderStyle="solid"; width="400px"; height="200px"; } </script>
5、数据类型和转化
- 基本数据类型:数值(都是浮点型)、字符串、布尔型
- 引用数据类型:对象、数组、函数
- 特殊类型:Null类型只有一个值:null;未定义的值:undefined
- 数值+“”=字符;布尔+“”=字符;
- 字符*1=数值;布尔*1=数值;parseInt/parseFloat(字符)=数值;
- !!数值=布尔;!!字符=布尔;
6、函数定义
- 使用function语句声明:命名函数,function f() { };匿名函数,var f=function() { }
- 使用Function对象构造:var say = function(name, say){document.write('<h1>' + name + ' : ' + say + '</h1>'); }
7、函数分类(函数可作参数、表达式、返回值)
- 闭包函数:函数里面包含另一个函数
- 高阶函数:函数作为参数
- 函数柯里化:函数作为返回值
8、对象和数组
- 对象是无序的、已经命名的数据集合,var point={z:{a:1,b:2};x:2.3,y:-1.2}; var i=point["z"]["a"];var j=point.z.b;
- 数组是有序的数据集合,与对象可相互转化,但是数组拥有大量方法,适合完成一些复杂的运算,var a=new Array(1,2,3,"4","5");var a=[1,2,3,"4","5"];
9、数组常用方法
length(属性) |
var a = [1, 2, 3, 4, 5]; |
push/pop |
var a = []; //定义一个空数组 |
unshift/shift |
var a = []; //定义一个空数组 |
splice |
var a = [1,2,3,4,5,6]; |
splice |
var a = [1,2,3,4,5,6]; |
join |
var a = [1,2,3,4,5];a = a.join("-");document.write("a类型 = " + typeof(a)+"<br />");//a类型=string document.write("a的值 = " + a);//a的值=1-2-3-4-5 |
split |
var a = [1,2,3,4,5];a = a.join("-");var s = a.split("-");document.write("s类型 = " + typeof(s)+"<br />");//a类型=object document.write("s的值 = " + s);//a的值=1,2,3,4,5 |
reverse | var a = [1,2,3,4,5];var a = a.reverse();document.write(a);//输出[5,4,3,2,1] |
sort |
var a = [3,2,5,1,4]; |
concat | var a = [1,2,3,4,5];var b = a.concat([4,5],[1,[2,3]]);document.write(b);//输出[1,2,3,4,5,4,5,1,2,3] |
slice | var a = [1,2,3,4,5,6,7,8,9];var b = a.slice(2,5);document.write(b);//输出[3,4,5] |
10、检测数据类型
值(value) | typeof value(表达式返回值) | value.constructor(构造函数的属性值) |
var value=1 | "number" | Number |
var value="a" | string | String |
var value="true" | boolean | Boolean |
var value={} | "object" | Object |
var value=new Object() | "object" | Object |
var value=[] | "object" | Array |
var value=new Array() | "object" | Array |
var value=function(){} | "function" | Function |
function className(){} | "object" | className |
function typeOf(o){ var _toString = Object.prototype.toString; // 获取对象的toString()方法引用 // 列举基本数据类型和内置对象类型,可以进一步补充该数组的检测数据类型范围 var _type ={ "undefined" : "undefined", "number" : "number", "boolean" : "boolean", "string" : "string", "[object Function]" : "function", "[object RegExp]" : "regexp", "[object Array]" : "array", "[object Date]" : "date", "[object Error]" : "error" } return _type[typeof o] || _type[_toString.call(o)] || (o ? "object" : "null"); } var a = Math.abs; alert(typeOf(a)); //"function"
11、数值计算与类型转换(当对象与数值进行加号运算时,则会尝试将对象转化为数值,然后参与求和运算。如果转换不成功,则执行字符串连接操作)
值(value) | 字符串操作环境 | 数字运算环境 | 逻辑运算环境 | 对象运算环境 |
undefined | "undefined" | NaN | false | Error |
null | "null" | 0 | false | Error |
非空字符串 | 不转换 | 字符串对应的数字值或NaN | true | String |
空字符串 | 不转换 | 0 | false | String |
0 | "0" | 不转换 | false | Number |
NaN | "NaN" | 不转换 | false | Number |
Infinity | "Infinity" | 不转换 | true | Number |
Number.POSITION_INFINITY | "infinity" | 不转换 | true | Number |
Number.NEGATIVE_INFINITY | "infinity" | 不转换 | true | Number |
Number.MAX_VALUE | "1.7976931348623157e+308" | 不转换 | true | Number |
Number.MIN_VALUE | "5e-324" | 不转换 | true | Number |
其它所有数字 | "数字的字符串" | 不转换 | true | Number |
true | "true" | 1 | 不转换 | Boolean |
false | "false" | 0 | 不转换 | Boolean |
对象 | toString() | valueOf()或toString()或NaN | true | 不转换 |
12、字符串替换(正则表达式)
<script> var s="javascript"; var b=s.replace(/(java)(script)/,"$2-$1")//输出script-java alert(b); var b=s.replace(/java/,"$&");//输出javascript alert(b); var b=s.replace(/java/,"$`");//左侧文本 输出script alert(b); var b=s.replace(/script/,"$`");//输出javajava alert(b); var b=s.replace(/java/,"$'");//右侧文本 输出scriptsctipt alert(b); var b=s.replace(/java/,"$$");//输出$script alert(b); </script>
13、增强数组排序
<script> /*function f(a,b){ var a=a%2; var b=b%2; if(a==0) return 1; if(b==0) return -1; } var a=[3,1,2,4,5,7,6,8,0,9]; a.sort(f); alert(a); function f(a,b){ var a=a%2; var b=b%2; if(a==0) return -1; if(b==0) return 1; } var a=[3,1,2,4,5,,7,6,8,0,9]; a.sort(f); alert(a); var a=['aB','Ab','Ba','bA']; a.sort(); alert(a);*/ function f(a,b){ var a=a.toLowerCase; var b=b.toLowerCase; if(a>b) return 1; else return -1; } var a=['aB','Ab','Ba','bA']; a.sort(f); alert(a); function f(a,b){ if(a>Math.floor(a)) return 1; if(b>Math.floor(b)) return -1; } var a=[3.555,1.234,3,2.111,5,7,3] a.sort(f); alert(a); </script>
14、浏览器对象模型(BOM)
包含对象:
- 用户对象:在JS脚本中定义的对象
- 内置对象:由系统预定义并内置到JS内的对象,如Object、Array、Function、Date、Math、String、Number、RegExp等
- 宿主对象:捆绑到浏览器内的API组件定义的对象。这些对象与JS语言本身没有任何直接关系,但在JS脚本中可以访问和操作它们,如Window、Document、Navigator、Screen、Location、History、Form等
BOM作用:
- 弹出新的浏览器窗口,移动、关闭浏览器窗口以及调整窗口大小(窗口对象)
- 提供浏览器详细信息(导航对象)
- 提供装载到浏览器中页面的详细信息(定位对象)
- 提供用户屏幕分辨率详细信息(屏幕对象)
- 对Cookie的支持
15、BOM操作浏览器常用方法
打开窗口:window.open(url,name,features,replace)
var url="http://www.baidu.com/"; var features="height=400,width=800,top=10,left=10,toolbar=no,menubar=no,scrollbar=no,resizable=no,location=no,status=no"; document.write('<a href="http://www.sina.com.cn/ target="newW">切换到新浪</a>'); var me=window.open(url,'newW',features); setTimeout(function(){me.close();},60000);
三种人机交互窗口:alert()、confirm()、prompt()
var user=prompt("请输入你的用户名:"); if(!!user){ var ok=confirm("你输入的用户名为: "+user+" 请确认。"); if(ok){ alert("欢迎你: "+user); } else{ user=prompt("请重新输入你的用户名:"); alert("欢饮你: "+user); } } else{ user=prompt("请输入你的用户名:"); }
获取URL查询字符串信息
1 var queryString=function(){ 2 var q=location.search.substring(1); 3 var a=q.split('&'); 4 var o={}; 5 for(var i=0;i<a.length;i++){ 6 var n=a[i].indexOf('='); 7 if(n==-1) continue; 8 var v1=a[i].substring(0,n); 9 var v2=a[i].substring(n+1); 10 o[v1]=unescape(v2); 11 } 12 return o; 13 } 14 var f1=queryString(); 15 for(var i in f1){ 16 document.write(i+"="+f1[i]+'<br/>'); 17 } 18 </script> 19 </head> 20 <body> 21 <a href="?id=123&name=location">获取查询字符串</a>
设计窗口居中和弹跳窗口
- availHeight和availWidth显示web浏览器屏幕可用高度和宽度
- availLeft和availTop屏幕最左侧x坐标和y坐标
- moveTo()、moveBy()、resizeTo()、resizeBy(),by相对,移动指定个长度单位;to绝对,移动到指定坐标
1 <script> 2 function openW(url){ 3 var w=screen.availWidth/2; 4 var h=screen.availHeight/2; 5 var t=(screen.availHeight-h)/2; 6 var l=(screen.availWidth-w)/2; 7 var p="top="+t+",left="+l+",width="+w+",height="+h; 8 var win=window.open(url,"url",p); 9 win.focus(); 10 } 11 openW("http://www.baidu.com/"); 12 </script> 13 14 <script type="text/javascript" language="javascript"> 15 window.onload=function(){ 16 timer=window.setInterval("jump()",1000); 17 } 18 function jump(){ 19 window.resizeTo(200,200); 20 x=Math.ceil(Math.random()*1024); 21 y=Math.ceil(Math.random()*760); 22 window.moveTo(x,y); 23 } 24 </script>
16、DOM是Document Object Modal(文档对象模型)的简写,它表示访问和操作文档(如HTML、XML文档)的API(应用程序接口)
遍历文档
<script type="text/javascript" language="javascript"> function count(n){ var num=0; if(n.nodeType==1) num++; var son=n.childNodes; for(var i=0;i<son.length;i++) num+=count(son[i]); return num; } window.onload=function(){ alert("当前文档包含"+count(document)+"个元素"); } </script>
动态增加文档内容
window.onload=function(){ var ul=document.getElementsByTagName("ul")[0]; var lis=ul.getElementsByTagName("li"); lis[0].onclick=function(){ this.innerText="谢谢"; } lis[1].onclick=function(){ this.innerHTML="<h2>我是一名初学者</h2>"; } lis[2].onclick=function(){ this.outerText="我是学生"; } lis[3].onclick=function(){ this.outerHTML="<h2>当然喜欢</h2>"; } }
17、操作节点和属性
<script> //获取节点 var p=document.getElementsByTagName("p")[0]; alert(p.innerHTML); p.innerText=p.innerText; //获取节点属性 var box=document.getElementById("box");var info="nodeName:"+box.nodeName; info+="<br>nodeType:"+box.nodeType; info+="<br>parentNode:"+box.parentNode.nodeName; info+="<br>childNodes:"+box.childNodes[0].nodeName; document.write(info); //设置节点属性 var p=document.getElementsByTagName("p"); alert(p[4].innerHTML); for(var i=0;i<p.length;i++){ p[i].setAttribute("class","blue"); } //克隆节点、true为复制节点包含所有内容 window.onload=function(){ var p=document.createElement("p"); var h1=document.createElement("h1"); var txt=document.createTextNode("hello world"); p.appendChild(txt); h1.appendChild(p); document.body.appendChild(h1); var new_h1=h1.cloneNode(true); document.body.appendChild(new_h1); } //insertbefore 把节点放到父节点指定子节点前面 window.onload=function(){ var ok=document.getElementById("ok"); ok.onclick=function(){ var red=document.getElementById("red"); var blue=document.getElementById("blue"); var h1=document.getElementsByTagName("h1")[0]; red.insertbefore(blue,h1); } } //删除子节点 window.onload=function(){ var ok=document.getElementById("delete"); ok.onclick=function(){ var blue=document.getElementById("blue"); (blue.parentNode).removeChild(blue); } } //替换节点 用h2替换h1 window.onload=function(){ var ok=document.getElementById("ok"); ok.onclick=function(){ var red=document.getElementById("red"); var h1=document.getElementsByTagName("h1")[0]; var blue=document.getElementById("blue"); var h2=document.createElement("h2") red.replaceChild(h2,h1); } } window.onload=function(){ var ok=document.getElementById("ok"); ok.onclick=function(){ var red=document.getElementById("red"); var blue=document.getElementById("blue"); var h1=document.getElementsByTagName("h1")[0]; var del_h1=red.replaceChild(blue,h1); red.parentNode.insertBefore(del_h1,red); } } //获取和设置属性、属性值 /*window.onload=function(){ var red=document.getElementById("red"); alert(red.getAttribute("id")); var blue=document.getElementById("blue"); alert(blue.id); } window.onload=function(){ var red=document.getElementById("red"); var blue=document.getElementById("blue"); red.setAttribute("title","这是红色盒子"); blue.setAttribute("title","这是蓝色盒子"); }*/ window.onload=function(){ var hello=document.createTextNode("Hello World!"); var h1=document.createElement("h1"); //var h2=document.createElement("h2"); h1.setAttribute("title","您好!欢饮光临!"); //h2.title="这是h2的title"; h1.appendChild(hello); //h2.appendChild(hello); document.body.appendChild(h1); } //增加和删除属性值 window.onload=function(){ var table=document.getElementsByTagName("table")[0]; var del=document.getElementById("del"); var reset=document.getElementById("reset"); del.onclick=function(){ table.removeAttribute("border"); } reset.onclick=function(){ table.setAttribute("border","2"); } } </script>
18、JS事件模型和事件流
- 基本事件模型:通过简单的事件属性为指定标签绑定事件处理函数,属性较弱,一般不建议使用
- 标准事件模型:W3C制定
- IE事件模型
多个对象同时相应一个事件的时候,哪个对象优先相应,哪个对象后续响应?决定这种响应顺序的机制称为事件流
- 冒泡型事件流(IE支持:div->body->document):由特殊到一般,从下往上。
- 捕获型事件流:(document->body->div)从一般到特殊,从上往下。
- 标准事件流:W3C定义的标准事件流同时支持以上两种事件流,但是捕获型事件流先发生,即从document开始再返回document结束。
19、基本事件模型的两种绑定方式
//静态绑定
<button id="btn" onclick="alert('你单击的一次!');">按钮</button><!--单引号里只能双引号 双引号里只能单引号-->
//动态绑定 <script> var button=document.getElementById("btn"); btn.onclick=function(){ alert("你单击的一次!") } </script>
20、标准事件模型和IE事件模型的注册、注销
//标砖事件模型
<body> <h2>标准事件模型的注册和注销</h2> <input id="a" type="button" value="点我"/> <input id="b" type="button" value="删除事件"/> <script> var a=document.getElementById("a"); var b=document.getElementById("b"); function ok(){ alert("您好!欢饮光临!"); } function delete_event(){ a.removeEventListener("click",ok,false); } a.addEventListener("click",ok,false); b.addEventListener("click",delete_event,false); </script> </body> //IE事件模型 <body> <p id="p1">IE事件模型的注册和注销</p> <script> /*var p1=document.getElementById("p1"); p1.attachEvent("onmouseover",function(){ p1.style.background='blue'; }) p1.attachEvent("onmouseout",function(){ p1.style.background='red'; })*/ var p1=document.getElementById("p1"); var f1=function(){ p1.style.background='blue'; }; var f2=function(){ p1.style.background='red'; p1.detachEvent("onmouseover",f1); p1.detachEvent("onmouseout",f2); }; p1.attachEvent("onmouseover",f1); p1.attachEvent("onmouseout",f2); </script> </body> //兼容IE和标准 <body> <p id="p1">IE和标准事件模型都兼容</p> <script> var p1=document.getElementById("p1"); var f1=function(){ p1.style.background='blue'; }; var f2=function(){ p1.style.background='red'; if(p1.detachEvent){ p1.detachEvent("onmouseover",f1); p1.detachEvent("onmouseout",f2); } else{ p1.removeEventListener("mouseover",f1); p1.removeEventListener("mouseover",f2); } }; if(p1.attachEvent){ p1.attachEvent("onmouseover",f1); p1.attachEvent("onmouseout",f2); } else{ p1.addEventListener("mouseover",f1); p1.addEventListener("mouseout",f2); } </script> </body>