JavaScript 学习总结
第一章 认识JavaScript
1,JavaScript是什么
JavaScript是一种可以用来给网页增加交互性的编程语言。
脚本语言(Scripting language)
<script> </script>标签
包含在HTML页面内部(通常放在<head>部分)
存储在外部文件中<script src=“外部文件名”>
2,Java和Javascript区别
Java和Javascript的区别就像印度和印度尼西亚的区别,名字中有点相同的东西。
3,关于Ajax
Ajax(Asynchronous Javascript XML)异步JavaScript和XML:是一种创建交互式网页应用的网页开发技术。
包括技术
XHTML
CSS
使用JavaScript访问DOM
XML
XMLHttpRequest
4,JavaScript与面向对象
对象、属性和方法组合在一起:点号语法(的)
document.getElementById('div1').style.display
5,处理事件
事件(event):用户在访问页面时执行的操作。
例如:
当鼠标移入时,display属性取值block;鼠标移出时dispay属性取值为none。
onmouseover="document.getElementById('div1').style.display='block';" onmouseout="document.getElementById ('div1').style.display='none';"
div和span:标识范围
div:块级元素,元素周围自动换行
span:行内元素,前后不会换行
class和id选择器区别
class样式可以使用多次,id样式只能使用一次,id选择器的优先级大于类别选择器
6,值和变量
typeof检测变量类型
用法:alert(typeof a);
undefined类型:未定义;或者虽然定义了但未赋值。
什么叫Object?
简单解释:不是基本类型,是复合类型。除了number(整数、实数),string,boolean,undefined,其他的都是Object。
注意:
JavaScript区分大小写。
变量值: JavaScript弱类型。规范:一个变量应该只存放一种类型的数据。
==:先把两边的东西转成一样的类型,然后再比较(隐式类型转换)
===:不转换,直接比较
加法:字符串连接、数字加法。优先选择第一种。
命名规范及必要性
可读性——能看懂
规范性——符合规则(字母数字下划线$,不能以数字开头)
匈牙利命名法
类型前缀
首字母大写
例如:alert(parseInt(n/60)+'分'+n%60+'秒'); parseInt将字符串转换成整数
赋值:=、+=、-=、*=、/=、%=
关系:<、>、<=、>=、==、===、!=、!==
逻辑:&& 与、|| 或、! 否
运算符优先级:括号
7,结构,表现和行为(这是核心)
结构、表现和行为相分离
HTML(结构):包含页面的内容和结构
CSS(表现):控制页面的外观和表现
JavaScript(行为):控制页面的行为
例子:
在页面中使用CSS样式表
<link id="link1" href="css1.css" rel="stylesheet" type="text/css" />
单击事件:onclick
onclick="document.getElementById('link1').href='css1.css';"
将行为分离出来(把JS代码放在标签里,放在行间,代码可读性差,修改起来工作量过大。)
window.onload=function(){
var oBtn1 = document.getElementById('btn1');
oBtn1.onclick=function(){
document.getElementById('link1').href='css1.css';
}
var oBtn2 = document.getElementById('btn2');
oBtn2.onclick=function(){
document.getElementById('link1').href='css2.css';
}
}
将JavaScript代码写在.js文件中
<script src="changeskin.js"/>
补充:
取值用value
alert(oTxt1.value+oTxt2.value);
关于NaN的手册信息:NaN not a number
var a=parseInt('abc');
var b=parseInt('aaa');
alert(a==NaN); //false
alert(a==b); //false
处理:isNaN()函数
var a=parseInt('abc');
alert(isNaN(a)); //true
变量作用域(作用范围)
局部变量:只在本函数内使用。
全局变量:不定义在任何一个函数里,可以在任何地方使用(尽量不要使用全局变量)
什么是闭包
子函数可以使用父函数中的局部变量
实例:隔行变色(aLi相当于数组,aLi.length是表示数组里面有多少元素)
例子:
<script>
window. (){
var oUl=document.getElementById('ul1');
var aLi= oUl.getElementsByTagName('li');
var i=0;
for(i=0;i<aLi.length;i++){
if(i%2==0) { //0,2,4,6,8,10...
aLi[i].style.background='#CCC';
}
}
};
</script>
</head>?
<body>
<ul id="ul1">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</body>
综合总结如下:
js的组成:
ECMAScript
DOM:操作文档(页面)
BOM:操作窗口
关于变量:
var
typeof():number,string,boolean,object,undefined,null,function
关于运算:
隐式:==,-
显式: parseInt/NaN
==/===
关于事件:
事件的处理不放在行间
window.onload=function(){...}
元素名.事件名 =function(){...}
获取元素:
getElementById(元素的id名字)
getElementsByTagName("") 按标签名字取-〉数组
数组.length
关于数组:
数组.sort()
字符串.split(解析分隔符)
数组.join(元素之间的连接符)
关于样式:
style.display=block/none
style.background=颜色
复选框.checked=true/false
结构、表现、行为相分离:
1、布局---html
2、样式---<link href="" > (.css)
<style>
</style>
3、js
<script> </script> (<head>)
<script src=""> (.js)
文本转换为数字的方法
parseInt
parseFloat
原理:从最左侧的字符开始,到第一个不是数字的字符为止(即使文本中包含非数字,也可以转化)
当不能转化时,返回一个NaN
判断NaN的方法: 使用isNaN()函数
第二章,程序流程控制,数组,函数
1,什么是真、什么是假:
真:true、非零数字、非空字符串、非空对象
假:false、数字零、空字符串、空对象、undefined
2,分支
if
switch
?:
3,循环
while
for
do-while
for…in:通常用来枚举对象的属性
例子:
<script type="text/javascript">
window.onload=function(){
var oBtn = document.getElementById('btn');
var aInput=document.getElementsByTagName('input'); //通过标签名获取元素
?
oBtn.onclick=function(){
//alert(aInput.length);
for(var i=0; i<aInput.length; i++)
aInput[i].checked=true;
}
};
</script>
4,数组
数组的定义
使用Array关键字定义
例如:var arr=new Array();
var arr=new Array(1,2,3,4);
使用[]定义
例如:var arr=[1,2,3,4]
数组的属性
数组的长度:length属性
数组的方法
push:向数组尾部添加元素
pop:从数组尾部弹出一个数据
shift:从数组头部删除一个元素
unshift:向数组头部添加一个元素
sort:排序
排序规则:字母序对字符串进行排序
比较函数
concat:连接两个数组
split:解析字符串为数组
join:输出数组时元素之间的分隔符
例子:
数组的排序,从小到大排序
<script type="text/javascript">
var arr=[96, 8, 12, 72, 33, 118];
arr.sort(function (num1, num2){
return num1-num2;
});
alert(arr);
</script>
5,函数
函数的返回值
没有return/return ;:undefined
规则:令一个函数只返回一种类型的值
函数的参数
一般的参数:
参数类型
参数个数
arguments:参数数组,可变参,不定参
例子:
<script type="text/javascript">
function show(){
alert(arguments[1]);
}
show(12, 5);
</script>
上面会显示5,数组里面的第2个元素
例子:
模拟“重载”的处理
<script type="text/javascript">
function sum(){
var result=0;
var i=0;
for(i=0;i<arguments.length;i++){
result+=arguments[i];
}
alert(result);
}
sum(12, 5, 7, 8, 12, 5, 7, 8, 12, 5, 7, 8, 12, 5, 7, 8, 12, 5, 7, 8, 12, 5, 7, 8, 12, 5, 7, 8, 12);
</script>
6,CSS函数
css(‘background’)
css(‘background’,’red’);
第三章,DOM(Ducument Object Model)
1,获取节点
getElementById
获取子节点:childNodes
子节点的个数
操作子节点
例子:
window. (){
var oUl=document.getElementById('ul1');
oUl.childNodes[0].style.background=yellow';//ul的第一个子节点,也就是下面的li
}
2,检测节点的类型
nodeType
元素节点:1
文本节点:3
属性节点:2
例子:
<script type="text/javascript">
window. () {
alert(document.body.childNodes[1].nodeType);
}
</script>
3,父节点parentNode
父节点只有一个
例子:隐藏父节点
window. (){
var aA=document.getElementsByTagName('a');
var i=0;
for(i=0;i<aA.length;i++) {
aA[i]. () {
this.parentNode.style.display='none';
}
}
}
this:指向调用该方法或属性的对象。
4,offsetParent
获取当前元素用于定位的父节点
5,子节点
firstChild,firstElementChild
lastChild, lastElementChild
例子:
window. (){
var oUl=document.getElementById('ul1');
//IE低版本
//oUl.firstChild.style.background='red';
//FF,IE11
//oUl.firstElementChild.style.background='red';
var oFirst=oUl.firstElementChild||oUl.firstChild;
oFirst.style.background='red';
}
6,DOM元素的查找
用id选择元素
用tagName选择元素
用className选择元素
选出所有元素
利用if做筛选
封装为函数
function getByClass(oParent, sClass){
var aEle=oParent.getElementsByTagName('*');
var aResult=[]; //可能存在多个,放在数组中
var i=0;
for(i=0;i<aEle.length;i++) {
if(aEle[i].className==sClass){
aResult.push(aEle[i]);
}
}
return aResult;
}
window. (){
var oUl=document.getElementById('ul1');
var aBox=getByClass(oUl, 'box');
var i=0;
for(i=0;i<aBox.length;i++){
aBox[i].style.background='yellow';
}
}
7,创建、插入和删除元素
创建DOM元素
createElement(标签名) 创建一个节点
appendChild(节点)
追加一个节点
例子:为ul插入li
window. (){
var oBtn=document.getElementById('btn1');
var oTxt=document.getElementById('txt1');
var oUl=document.getElementById('ul1');
oBtn. () {
var oLi=document.createElement('li');
oLi.innerHTML=oTxt.value;
oUl.appendChild(oLi);
}
}
InnerHTML是一个标签内部的东西
<div id="div1">
这里是标签内部的东西,存储在innerHTML中
</div>
插入元素
insertBefore(节点, 原有节点) 在已有元素前插入
例子:倒序插入li
window. (){
var oBtn=document.getElementById('btn1');
var oTxt=document.getElementById('txt1');
var oUl=document.getElementById('ul1');
oBtn. () {
var oLi=document.createElement('li');
var aLi=oUl.getElementsByTagName('li');
oLi.innerHTML=oTxt.value;
if(aLi.length==0){
oUl.appendChild(oLi);
}
else{
oUl.insertBefore(oLi, aLi[0]);
}
}
}
删除DOM元素
removeChild(节点) 删除一个节点
例子:删除li
window. (){
var aA=document.getElementsByTagName('a');
var oUl=document.getElementById('ul1');
var i=0;
for(i=0;i<aA.length;i++) {
aA[i]. () {
oUl.removeChild(this.parentNode);
}
}
}
第四次课 处理事件
1,在document上加事件
document. (){
alert('a');
}
2,从event对象获取点击坐标(考虑到不同浏览器的兼容性问题)
document.onclick=function(ev){
if(ev){
alert(ev.clientX+","+ev.clientY);
}else{
alert(event.clientX+","+event.clientY);
}
}
3,或运算
非0---true 0/null/false
12 || false 12
0 || ’abc’ ‘abc’
‘’ || true true
12 || 0 12
12 || null 12
null || ’abc’ ‘abc’
‘abc’ || 12 ‘abc’
利用或运算处理浏览器兼容性
document. (ev){
var oEvent=ev||event; //将特殊的放在前面
alert(oEvent.clientX+', '+oEvent.clientY);
};
4,事件流
事件像冒泡一样从DOM层次结构的底层往上一级级升
事件处理:避免事件冒泡带来的干扰
window. (){
var oBtn=document.getElementById('btn1');
var oDiv=document.getElementById('div1');
oBtn. (ev){
var oEvent=ev||event;
oDiv.style.display='block';
oEvent.cancelBubble=true; //阻止冒泡
};
document. (){
oDiv.style.display='none';
};
};
5,鼠标事件
鼠标位置
document. (ev)
{
var oEvent=ev||event;
var oDiv=document.getElementById('div1');
oDiv.style.left=oEvent.clientX+'px' ;
oDiv.style.top=oEvent.clientY+'px' ;
};
滚动位置
鼠标跟随改进:
document. (ev){
var oEvent=ev||event;
var oDiv=document.getElementById('div1');
var scrollTop =document.documentElement.scrollTop || document.body.scrollTop;
var scrollLeft=document.documentElement.scrollLeft || document.body.scrollLeft;
oDiv.style.left=oEvent.clientX+scrollLeft+‘px’ ; //横向滚动处理
oDiv.style.top=oEvent.clientY+ scrollTop +‘px’ ; //纵向滚动处理
};
6,键盘事件
对比鼠标事件:onclick=onmousedown+onmouseup
键盘事件:onpress= onkeydown+onkeyup
键值keycode
document.onkeydown=function (ev){
var oEvent=ev||event;
alert(oEvent.keyCode);
}
offsetWidth: div的宽度
border:1px; +
padding(内边距):10px +
margin(外边距):20px -
offsetLeft:div的左边距
offsetTop
offsetRight
键盘控制移动:上下左右移动
document.onkeydown=function (ev){
var oEvent=ev||event;
var oDiv=document.getElementById('div1');
if(oEvent.keyCode==37){//左
oDiv.style.left=oDiv.offsetLeft-10+'px';
}else if(oEvent.keyCode==39) {
oDiv.style.left=oDiv.offsetLeft+10+'px';
}else if(oEvent.keyCode==38) {
oDiv.style.left=oDiv.offsetTop-10+'px';
}else if(oEvent.keyCode==40) {
oDiv.style.left=oDiv.offsetTop+10+'px';
}
};
使用鼠标点击留言:
window. (){
var oBtn=document.getElementById('btn1');
var oTxt1=document.getElementById('txt1');
var oTxt2=document.getElementById('txt2');
oBtn. () {
oTxt1.value+=oTxt2.value+'\n';
oTxt2.value='';
};
};
Enter键留言:
window. (){
……
oTxt2.onkeydown=function (ev){ //注意加事件的对象
var oEvent=ev||event;
if( oEvent.keyCode==13){
oTxt1.value+=oTxt2.value+'\n';
oTxt2.value='';
}
};
};
ctrl+enter提交:
window. (){
……
oTxt2.onkeydown=function (ev){ //注意加事件的对象
var oEvent=ev||event;
if( oEvent.ctrlKey && oEvent.keyCode==13){
oTxt1.value+=oTxt2.value+'\n';
oTxt2.value='';
}
};
};
7,默认行为
什么是默认行为?
不需要自己编写,浏览器自己即具备的功能。
右键打开快捷菜单(oncontextmenu事件(上下文菜单):右键菜单)
文本框输入
表单提交
阻止默认行为的一般的写法:return false
弹出自定义右键菜单:
document.oncontextmenu=function (ev){
var oEvent=ev||event;
var oUl=document.getElementById('ul1');
var scrollTop =document.documentElement.scrollTop || document.body.scrollTop;
var scrollLeft=document.documentElement.scrollLeft || document.body.scrollLeft;
oUl.style.display='block';
oUl.style.left= oEvent.clientX+scrollLeft+‘px’ ;;
oUl.style.top= oEvent.clientY+ scrollTop +‘px;
return false; //阻止系统右键菜单
};
弹出自定义右键菜单:
document. (){
var oUl=document.getElementById('ul1');
oUl.style.display='none';
};
8,拖拽
存储距离
onmousemove:根据距离计算DIV最新位置
<script>
window. ()
{
var oDiv=document.getElementById('div1');
var disX=0;
var disY=0;
oDiv. (ev)
{
var oEvent=ev||event;
disX=oEvent.clientX-oDiv.offsetLeft;
disY=oEvent.clientY-oDiv.offsetTop;
document. (ev)//放在onmousedown事件下,防止鼠标移出去
{
var oEvent=ev||event;
var l=oEvent.clientX-disX;
var t=oEvent.clientY-disY;
if(l<0)
{
l=0;
}
else if(l>document.documentElement.clientWidth-oDiv.offsetWidth)
{
l=document.documentElement.clientWidth-oDiv.offsetWidth;
}
if(t<0)
{
t=0;
}
else if(t>document.documentElement.clientHeight-oDiv.offsetHeight)
{
t=document.documentElement.clientHeight-oDiv.offsetHeight;
}
oDiv.style.left=l+'px';
oDiv.style.top=t+'px';
};
document. ()
{
document.onmousemove=null;
document.onmouseup=null;
};
return false;
};
};
</script>
最后总结:
1、事件对象--注意兼容性
function(ev)
var oEvent = ev ||event;
2、事件流
父节点,子节点 相同事件
oEvent.cancelBubble=true; 阻止事件冒泡
3、鼠标事件
鼠标点击位置:
oEvent.clientX 鼠标距可视区的左边距
oEvent.clientY 鼠标距可视区的上边距
带滚动条的滚动位置(注意兼容性):
var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
div定位: oDiv.style.left= scrollLeft+oEvent.clientX +'px';
oDiv.style.top = scrollTop+oEvent.clientY +'px';
4、键盘事件
oEvent.keyCode
取值:测试
常用取值:13--回车
第5次课 BOM
1,打开窗口
window.open(页面地址, 打开方式);
打开方式:在哪个框架中打开?
_blank:新窗口,默认
_self:当前窗口
例子:
oBtn. (){
window.open(‘ www.126.com/', '_self');
};
运行代码:
document.write():向页面输出内容
举例:document.write(‘aaa’);
运行并查看页面源代码
window. (){
var oTxt=document.getElementById('txt1');
var oBtn=document.getElementById('btn1');
oBtn. () {
var oNewWin=window.open('about:blank');
oNewWin.document.write(oTxt.value);
};
};
<body>
<textarea id="txt1" rows="10" cols="40"></textarea><br />
<input id="btn1" type="button" value="运行" />
</body>
2,关闭窗口
window.close()
window. (){
var oBtn=document.getElementById('btn1');
oBtn. () {
window.close();
};
};
<body>
<input id="btn1" type="button" value="关闭" />
</body>
3,常用属性
window.navigator.userAgent:浏览器版本号
window.location:当前页面地址
读
alert(window.location);
写
window.location='http://www.126.com/'
4,系统对话
var b = confirm('今天下雨了吗?');
alert(b);
var str = prompt('请输入你的姓名', ‘song');
alert(str);
5,尺寸及坐标
可视区尺寸
document.documentElement.clientWidth
document.documentElement.clientHeight
滚动距离
document.body.scrollTop
document.documentElement.scrollTop
侧边栏例子:
window.onscroll=function (){
var oDiv=document.getElementById('div1');
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
var t=(document.documentElement.clientHeight-oDiv.offsetHeight)/2;
oDiv.style.top=scrollTop+t+'px';
};
<style>
#div1 {width:100px; height:100px; background:red; position:absolute; right:0;}
</style>
需要解决的问题
页面刚加载
页面大小改变
window.onresize=window.onload=……接上面,这样无论怎样都可以居中右靠