智能社:JavaScript教程-从入门到精通视频-整理笔记

初探JavaScript魅力-1
JavaScript是什么
根据用户的一些操作,然后来修改页面上的一些元素、属性等。
(1)HTML+CSS静态页面,JS给页面添加动的效果
(2)网页特效的原理
javascript就是修改样式
(3)编写JS的流程:
【1】布局:HTML+CSS
【2】属性:确定要修改哪些属性
【3】事件:确定用户做哪些操作
【4】编写JS:在事件中,用JS来修改页面元素的样式
补:事件:就是用户操作,如鼠标点击、移入、移出等
(4)id:在css中,id作为css里的一个选择符存在,而在JS里它有更加广泛的用途,
在JS中扮演标签(元素)名字的作用,如
(5)div1.style.display=’block’
点 . ——> 的,一般来说是所属的关系,其实是属性
等号 = ——> 在数学里,x=5,表示x的值就是5,即等号就是相等的意思
在JS里,等号并不是相等的意思,等号指赋值,把什么变成什么,把=右边的值赋给左边
第一个JS兼容性问题:document.getElementById
(1)在FF和低版本的chrome下,是不能直接拿着id就用的,存在兼容问题
真正兼容的写法是document.getElementById(‘id名字’),在任何浏览器下均可用
如:document.getElementById(‘div1’);
通过div1这个id把元素获取出来,然后再来用
注:记住,不能直接拿着id就用,而必须的通过getElementById(把元素获取出来)获取一下,然后才可以用
(2)网页换肤
(1) 任何标签都可以加ID,包括link
(2) 任何标签的任何属性,也都可以修改
(3) HTML里怎么写,JS里就怎么写,只有一个例外就是class,因为class在JS里是关键字(保留字),所以不能直接拿来用,要写成className
引入函数:因为直接在事件内写代码会很乱
(1)函数基本格式:1
2
3
4
5
6[javascript] view plain copy
    function 函数名()  
    {  
            代码  
    }
JS里的函数和css里的class有点相似,像class它最大的一个功能就是你把这个样式写到class里边,然后只要需要这套样式的地方,直接把那个class拿过去用就
可以了,同样JS里的函数也一样.
(2)函数的定义和调用
1  | [javascript] view plain copy  | 
函数定义:只是告诉系统有这个函数,不会实际执行
函数调用:真正执行函数里的代码
注:函数的定义和调用缺一不可,只有定义则没反应,只有调用则显示出错了
(3)引入变量的概念:考虑到重用
变量:就是给东西取了个别名
如var oDiv=document.getElementById(‘div1’);给后面这大串取了个别名叫oDiv。看到oDiv就跟看到document.getElementById(‘div1’)是一样的效果
注:(1) 如果你要操作一个元素,你必须先把它选择过来,比如现在要操作的是text这个元素,那么需要先给它加个id,比如id=”txt1”,然后function函数里用
getElementById把它给选择过来
(2) 要操作谁,就要获取谁
(3) 需要一个函数,这个函数是为按钮准备的,因为它点击需要一个函数
if判断:如点击按钮显示/隐藏div(弹出菜单)
(1)if判断基本格式:1
2
3
4
5
6
7
8
9
10[javascript] view plain copy
    if(条件)  
    {  
    语句1  
    }  
    else  
    {  
    语句2  
    }
翻译:如果条件成立就执行语句1,如果条件不成立就执行语句2
  注:
 (1) if :如果
 (2) 条件:在IS里是判断的意思,就是遇到不同的情况就做不同的操作,遇到不同的问题就做不同的处理
(2)单等和双等(=和==)
= 赋值(改变,变成)
== 判断(判断两边是否相等)
(3)为a链接添加JS1
2
3
4
<!--<a href="javascript:alert('a');">链接</a> -->     
<a href="javascript:;">链接</a>
一般a里不加JS代码,而是空的js原因:(1) 在a里加js代码不好 (2) 加空的js代码而不是加##,因为它不会像##那样一点就跳到页首。
初探JavaScript魅力-2
函数传参
改变背景颜色
(1)参数传参:参数就是占位符(占住一个位置,以便于后续向里面塞东西)
    什么时候用传参–函数里定不下来的东西1
2
3
4
5
6
7
8function setColor(color)
{
	var oDiv=document.getElementById('div1');
	
	oDiv.style.background=color;
}
<input type="button" value="变黑" onclick="setColor('black');" />
<div id="div1">
上例定义函数setColor,它有一个参数为color,从input中传递一个参数为black,才是color这个参数就为black,从而实现函数参数的传递。
改变Div的任意样式
(1)操纵属性的两种方式
   将属性名作为参数传递
1  | 1.  | 
style与className
(1)元素.style.属性=xxx是修改行间样式
样式优先级:*<标签<class<ID<行间
如下代码 已给出style的属性再修改className就不会有效果
1  | <!DOCTYPE HTML>  | 
注意:
1.若已给出style的属性再修改className就不会有效果
2.对于同一个元素,要么选择操纵class要么操纵style
提取行间事件
为元素添加事件
(1)事件和其他属性一样,可以用JS添加1
2
3
4
5
6
7
8
9
10
11function 名字()
{
	...
}
oBtn.onclick=名字   //直接获取onclick属性
oBtn.onclick=function ()    //匿名函数
{
	....
};
window.onload的意义
 1.script标签一般不放body里
 2.使用window.online加载HTML的代码
(3)行为(JS)、样式(CSS)、结构(HTML)三者分离
 (2)获取一组元素
(1)getElementsByTagName
   优势:
   1.获取一组元素(数组)
   2.配合循环使用
   3..length获取数组长度
循环
while循环、for循环
1  | while(条件)  | 
(2)用for循环为一组元素添加事件
1  | for(var i=0;i<aDiv.length;i++)  | 
(3)实现全选、反选、不选
1  | oBtn1.onclick=function () //全选  | 
选项卡
按钮的实现
(1)添加事件
    this的使用
    用this选定当前元素,用来修改当前元素的属性
1  | for(var i=0;i<aBtn.length;i++)  | 
内容的实现
(1)索引值的使用
(2)什么时候用索引值——需要知道“第几个”的时候
(3)html添加index——会被浏览器过滤
(3)js添加index
1  | window.onload=function ()  | 
简易日历
程序实现思路
(1)类似选项卡,只是下面只有一个div
(2)InnerHTML的使用
    innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML。
1  | window.onload=function ()  | 
数组的使用
数组对象用来在单独的变量名中存储一系列的值。
定义数组:
1  | var myArray=new Array()  | 
数组赋值:
1  | 1.  | 
字符串连接 (+)
作用:连接两个字符串
问题:连接中的优先级(用括号改变优先级)1
2
3
4
5<script>
alert('abc'+(12+5)+'def');
</script>
JavaScript基础
JavaScript组成
   ECMAScript:解释器、翻译
   DOM:Document Object Model 操作HTML
   BOM:Browser Object Model  操作浏览器
  兼容性问题:
   ECMA        几乎没有兼容性问题
   DOM        有一些操作不兼容
   BOM        没有兼容问题(完全不兼容)
变量类型
类型:typeof运算符
  用法、返回值1
2var a=12;
typeof a;
变量类型
变量本来没有类型,变量类型取决于他保存的类型
一个变量应该只存放一种类型的数据
1  | var a=12;  | 
数据类型转换
(1)显式类型转换(强制类型转换)
  [1]parseInt() 把非数字的原始值转换成数字
   检测方法:
   parseInt() 方法首先查看位置 0 处的字符,判断它是否是个有效数字;如果不是,该方法将返回 NaN,不再继续执行其他操作。但如果该字符是有效数字,该方法将查看位置 1 处的字符,进行同样的测试。这一过程将持续到发现非有效数字的字符为止,此时 parseInt() 将把该字符之前的字符串转换成数字。
var iNum1 = parseInt("12345red");    //返回 12345
var iNum1 = parseInt("0xA");    //返回 10
var iNum1 = parseInt("56.9");    //返回 56
var iNum1 = parseInt("red");    //返回 NaN  Not a number
parseInt() 方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由 parseInt() 方法的第二个参数指定的,所以要解析十六进制的值,需如下调用 parseInt() 方法:
1  | var iNum1 = parseInt("AF", 16); //返回 175  | 
当然,对二进制、八进制甚至十进制(默认模式),都可以这样调用 parseInt() 方法:
1  | var iNum1 = parseInt("10", 2); //返回 2  | 
  [2]parseFloat()
  从位置 0 开始查看每个字符,直到找到第一个非有效的字符为止,然后把该字符之前的字符串转换成整数。
  第一个出现的小数点是有效字符。如果有两个小数点,第二个小数点将被看作无效的。parseFloat() 会把这个小数点之前的字符转换成数字。这意味着字符串 “11.22.33” 将被解析成 11.22。
  此外,parseFloat() 方法也没有基模式。
1  | var fNum1 = parseFloat("12345red"); //返回 12345  | 
(2)NaN的意义和检测
[1]NaN = Not a number
[2]NaN和NaN是不相等的
[3]is NaN(a) 判断是否为NaN
隐式类型转换
(1)==、===
 [1] == 先转换类型,然后比较
 [2] === 不转换类型,直接比
1  | var a=5;  | 
(2)减法
先转换再相减1
2
3
4
5var a='12';
var b='5';
alert(a+b);		//1.字符串连接		2.数字相加
alert(a-b);		//1.数字相减
作用域
局部变量、全局变量
局部作用域
变量在函数内声明,变量为局部作用域。
局部变量:只能在函数内部访问。
因为局部变量只作用于函数内,所以不同的函数可以使用相同名称的变量。
局部变量在函数开始执行时创建,函数执行完后局部变量会自动销毁。
1  | // 此处不能调用 carName 变量  | 
(1)全局变量
变量在函数外定义,即为全局变量。
全局变量有 全局作用域: 网页中所有脚本和函数均可使用。 
1  | var carName = " Volvo";  | 
如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。
1  | 
  | 
(2)闭包
子函数可以使用父函数的局部变量
1  | function aaa() //父函数  | 
命令规范
(1)命名规范及必要性
  可读性——能看懂
  规范性——符合规则
(2)匈牙利命名法
  类型前缀(变量取名)
| 类型 | 前缀 | 类型 | 实例 | 
|---|---|---|---|
| 数组 | a | Array | aItems | 
| 布尔值 | b | Boolean | bIsComplete | 
| 浮点数 | f | Float | fPrice | 
| 函数 | fn | Function | fnHandler | 
| 整数 | i | Integer | iItemCount | 
| 对象 | o | Object | oDiv1 | 
| 正则表达式 | re | RegExp | reEmailCheck | 
| 字符串 | s | String | sUserName | 
| 变体变量 | v | Variant | vAnything | 
首字母大写
运算符
算术:+ 加、- 减、 乘、/ 除、% 取模
赋值:=、+=、-=、=、/=、%=
关系:<、>、<=、>=、==、===、!=、!==
逻辑:&& 与、|| 或、! 否
条件:var iMax = (iNum1 > iNum2) ? iNum1 : iNum2;
(1)用于字符串的 + 运算符
- 运算符用于把文本值或字符串变量加起来(连接起来)。
 
如需把两个或多个字符串变量连接起来,请使用 + 运算符。
1  | txt1="What a very";  | 
在以上语句执行后,变量 txt3 包含的值是 “What a verynice day”。
要想在两个字符串之间增加空格,需要把空格插入一个字符串之中:
1  | txt1="What a very ";  | 
或者把空格插入表达式中:
1  | txt1="What a very";  | 
在以上语句执行后,变量 txt3 包含的值是:
1  | "What a very nice day"  | 
(2)对字符串和数字进行加法运算
1  | x=5+5;  | 
规则是:
如果把数字与字符串相加,结果将成为字符串。
(3)运算符优先级
| 运算符 | 描述 | 
|---|---|
| . [] () | 字段访问、数组下标、函数调用以及表达式分组 | 
| ++ – - ~ ! delete new typeof void | 一元运算符、返回数据类型、对象创建、未定义值 | 
| * / % | 乘法、除法、取模 | 
| + - + | 加法、减法、字符串连接 | 
| << >> >>> | 移位 | 
| < <= > >= instanceof | 小于、小于等于、大于、大于等于、是否为特定类的实例 | 
| == != === !== | 等于、不等于、严格相等、非严格相等 | 
| & | 按位与 | 
| ^ | 按位异或 | 
| l | 按位或 | 
| && | 逻辑与 | 
| ll | 逻辑或 | 
| ?: | 条件 | 
| = oP= | 赋值、运算赋值 | 
| , | 多重求值 | 
程序流程控制
判断(if、switch、?:)
if
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19if()
{
}
else
{
}
if(条件1)
{
语句1
}
else if(条件2)
{
语句2
}
else
{
语句n
}switch
1
2
3
4
5
6
7
8
9
10
11
12switch(变量)
{
case 值1:
语句1
break;
case 值2:
语句2
break;
......
default:
语句n
}三目条件运算符
1
2
3
4
5
6
7
8
9
10条件?语句1:语句2
if(条件)
{
语句1
}
else
{
语句2
}
循环(while、for)
- while、for
1
2
3
4
5
6
7
8
9
10
11
12while(条件)
{
语句
}
for循环
for(初始化;条件;自增)
{
语句
} 
跳出(break、continue)
continue 语句中断循环中的迭代,如果出现了指定的条件,然后继续循环中的下一个迭代。
break 语句可用于跳出循环。break 语句跳出循环后,会继续执行该循环之后的代码(如果有的话)
什么是真、什么是假
- 真:true、非零数字、非空字符串、非空对象
 - 假:false、数字零、空字符串、空对象、undefined
 
Json
Json
JSON:JavaScript 对象表示法(JavaScript Object Notation)。
JSON 是存储和交换文本信息的语法。类似 XML。
JSON 比 XML 更小、更快,更易解析。
Json与数组区别
下标:Json下标为字符,数组下标为数字
1
2
3
4
5var json={a: 12, b: 5, c: 7};
var arr=[12, 5, 7];
alert(json['a']);
alert(arr[0]);.length
1  | alert(json.length); 错误,json没有length  | 
- 循环
 
1  | for(var i=0;i<arr.length;i++)  | 
Json和for in
1  | for(var i in json)  | 
深入JavaScript
函数返回值
什么是函数返回值
- 函数的执行结果
 - 可以没有return
 
一个函数应该只返回一种类型的值
函数传参
可变参(不定参):arguments
- 参数的个数可变,参数数组
 
在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。
arguments 对象检测函数的参数个数,引用属性 arguments.length 即可
取非行间样式(不能用来设置)
- obj.currentStyle[attr] 仅兼容IE
 - getComputedStyle(obj, false)[attr] 仅兼容火狐,chrome
 
1  | IE  | 
兼容函数编写
style:
1
#div1 {width:200px; height:200px; background:red;}
script:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19function getStyle(obj, name)
{
if(obj.currentStyle)
{
return obj.currentStyle[name];
}
else
{
return getComputedStyle(obj, false)[name];
}
} //函数主体
window.onload=function ()
{
var oDiv=document.getElementById('div1');
// alert(getStyle(oDiv, 'width')); //单一样式
alert(getStyle(oDiv, 'backgroundColor')); //复合样式 background 有图片,颜色等
};
数组基础
定义
- var arr=[12,5,8,9];
 - var arr=new Array[12,5,8,9];
 - 没有任何差别,[]的性能略高,因为代码短
 
数组的属性
length
既可以获取长度,又可以设置长度
应用:快速清空数组
script:1
2
3
4
5var arr=[1,2,3,4,5,6];
arr.length=3;
alert(arr); //运行结果为1,2,3
数组的方法
添加
- push(元素),从尾部添加
 - unshift(元素),从头部添加
1
2
3
4
5var arr=[1,2,3];
arr.push(4); 1,2,3,4
//arr.ushift(4); 4,1,2,3
alert(arr); 
删除
- pop(),从尾部弹出
 - shift(),从头部弹出
 
1  | var arr=[1,2,3];  | 
插入、删除(splice)
splice(开始, 长度,元素…)
先删除,后插入splice(开始,长度)
删除splice(开始, 0, 元素…)
插入splice(开始,a,b1,b2..bn) a=n
替换1
2
3
4
5
6
7var arr=[1,2,3,4,5,6];
arr.splice(2, 3); // 1,2,6
arr.splice(2, 0, 'a', 'b', 'c'); // 1,a,b,c,2,3,4,5,6
arr.splice(2, 2, 'a', 'b'); // 1,2,a,b,5,6
连接 concat(数组2)
- 连接两个数组
1
2
3
4var a=[1,2,3];
var b=[4,5,6];
a.concat(b); // 1,2,3,4,5,6
b.concat(a); // 4,5,6,1,2,3 
拼接 join(分隔符)
- 用分隔符,组合数组元素,生成字符串
 - 字符串split
1
2var arr=[1,2,3,4];
arr.join('-'); //1-2-3-4 
排序 sort([比较函数])
sort([比较函数]),排序一个数组
- 排序一个字符串数组
 排序一个数字数组
排序一个字符串数组
1
2
3var arr=['float', 'width', 'alpha', 'zoom', 'left'];
arr.sort(); //alpha,float,left,width,zoom排序一个数字数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var arr=[12, 8, 99, 19, 112];
arr.sort(function (n1, n2){
return n1-n2;
/*if(n1<n2)
{
return -1;
}
else if(n1>n2)
{
return 1;
}
else
{
return 0;
}*/
DOM基础-1
DOM 是 W3C(万维网联盟)的标准。
DOM 定义了访问 HTML 和 XML 文档的标准:
“W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”
W3C DOM 标准被分为 3 个不同的部分:
核心 DOM - 针对任何结构化文档的标准模型
XML DOM - 针对 XML 文档的标准模型
HTML DOM - 针对 HTML 文档的标准模型
DOM节点-1
根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:
- 整个文档是一个文档节点
 - 每个 HTML 元素是元素节点
 - HTML 元素内的文本是文本节点
 - 每个 HTML 属性是属性节点
 - 注释是注释节点
 
方法
一些常用的 HTML DOM 方法:
- getElementById(id) - 获取带有指定 id 的节点(元素)
 - appendChild(node) - 插入新的子节点(元素)
 - removeChild(node) - 删除子节点(元素)
 
| 方法 | 描述 | 
|---|---|
| getElementById() | 返回带有指定 ID 的元素。 | 
| getElementsByTagName() | 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。 | 
| getElementsByClassName() | 返回包含带有指定类名的所有元素的节点列表。 | 
| appendChild() | 把新的子节点添加到指定节点。 | 
| removeChild() | 删除子节点。 | 
| replaceChild() | 替换子节点。 | 
| insertBefore() | 在指定的子节点前面插入新的子节点。 | 
| createAttribute() | 创建属性节点。 | 
| createElement() | 创建元素节点。 | 
| createTextNode() | 创建文本节点。 | 
| getAttribute() | 返回指定的属性值。 | 
| setAttribute() | 把指定属性设置或修改为指定的值。 | 
属性
属性是节点(HTML 元素)的值,您能够获取或设置。
innerHTML
获取元素内容的最简单方法是使用 innerHTML 属性。
innerHTML 属性对于获取或替换 HTML 元素的内容很有用。
nodeName
nodeName 属性规定节点的名称。
- nodeName 是只读的
 - 元素节点的 nodeName 与标签名相同
 - 属性节点的 nodeName 与属性名相同
 - 文本节点的 nodeName 始终是 ##text
 - 文档节点的 nodeName 始终是 ##document
 
注释:nodeName 始终包含 HTML 元素的大写字母标签名。
nodeValue
nodeValue 属性规定节点的值。
- 元素节点的 nodeValue 是 undefined 或 null
 - 文本节点的 nodeValue 是文本本身
 - 属性节点的 nodeValue 是属性值
 
nodeType
nodeType 属性返回节点的类型。nodeType 是只读的。
比较重要的节点类型有:
| 元素类型 | NodeType | 
|---|---|
| 元素 | 1 | 
| 属性 | 2 | 
| 文本 | 3 | 
| 注释 | 8 | 
| 文档 | 9 | 
DOM基础-2
循环子节点
1  | var oUl=document.getElementById('ul1');  | 
- 兼容,不算文本节点,只算元素。
1
2
3var oUl=document.getElementById('ul1');
alert(oUl.children.length); 
parentNode
1  | var oUl=document.getElementById('ul1');  | 
offsetParent
获取定位的父级
首位子节点
firstChild、lastChild
获取首位子节点(包括文本)
firstElementChild lastElementChild
获取首位元素
1  | var oUl=document.getElementById('ul1');  | 
元素属性操作
元素属性操作
- 第一种:oDiv.style.display=“block”;
 - 第二种:oDiv.style[“display”]=“block”;
 - 第三种:Dom方式
 
1  | var oTxt=document.getElementById('txt1');  | 
DOM方式操作元素属性
- 获取:getAttribute(名称)
 - 设置:setAttribute(名称, 值)
 - 删除:removeAttribute(名称)
 
DOM元素灵活查找
用className选择元素
如何用className选择元素
选出所有元素
通过className条件筛选封装成函数
1  | function getByClass(oParent, sClass)  | 
DOM操作应用
创建、插入和删除元素
创建DOM元素
- createElement(标签名) 创建一个节点
 - appendChild(节点)            追加一个节点
例子:为ul插入li1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23function ()
{
var oBtn=document.getElementById('btn1');
var oUl=document.getElementById('ul1');
var oTxt=document.getElementById('txt1');
oBtn.onclick=function ()
{
var oLi=document.createElement('li');
oLi.innerHTML=oTxt.value;
//父级.appendChild(子节点);
oUl.appendChild(oLi);
};
};
<input id="txt1" type="text"/>
<input id="btn1" type="button" value="创建li"/>
<ul id="ul1">
</ul>
// 追加一个节点 
插入元素
- insertBefore(节点, 原有节点)    在已有元素前插入
例子:倒序插入li1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31function ()
{
var oBtn=document.getElementById('btn1');
var oUl=document.getElementById('ul1');
var oTxt=document.getElementById('txt1');
oBtn.onclick=function ()
{
var oLi=document.createElement('li');
var aLi=oUl.getElementsByTagName('li');
oLi.innerHTML=oTxt.value;
//父级.appendChild(子节点);
//oUl.appendChild(oLi);
if(aLi.length>0) //判断是不是第一个节点
{
oUl.insertBefore(oLi, aLi[0]);
}
else
{
oUl.appendChild(oLi);
}
};
};
<input id="txt1" type="text"/>
<input id="btn1" type="button" value="创建li"/>
<ul id="ul1">
</ul> 
删除DOM元素
- removeChild(节点)            删除一个节点
例子:删除li 
1  | function ()  | 
文档碎片
- 仅在低级的浏览器上才能提高性能
 
1  | function ()  | 
DOM操作应用高级
表格应用
获取
tBodies、tHead、tFoot、rows、cells
1  | function ()  | 
隔行变色
1  | function ()  | 
添加、删除一行
1  | function ()  | 
搜索
版本1:基础版本——字符串比较
1  | 
  | 
版本2:忽略大小写——大小写转换
1  | function ()  | 
版本3:模糊搜索——search的使用
1  | var str='abc';  | 
版本4:多关键词——split
1  | var str='abc 123 ert';  | 
高亮显示、筛选
- 高亮
 - 筛选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27function () //筛选
{
var oTab=document.getElementById('tab1');
var oTxt=document.getElementById('name');
var oBtn=document.getElementById('btn1');
oBtn.onclick=function ()
{
for(var i=0;i<oTab.tBodies[0].rows.length;i++)
{
var sTab=oTab.tBodies[0].rows[i].cells[1].innerHTML.toLowerCase();
var sTxt=oTxt.value.toLowerCase();
var arr=sTxt.split(' ');
oTab.tBodies[0].rows[i].style.display='none';
for(var j=0;j<arr.length;j++)
{
if(sTab.search(arr[j])!=-1)
{
oTab.tBodies[0].rows[i].style.display='block';
}
}
}
};
}; 
排序
li排序
从一个div移动另一个div
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24function ()
{
var oUl1=document.getElementById('ul1');
var oUl2=document.getElementById('ul2');
var oBtn=document.getElementById('btn1');
oBtn.onclick=function ()
{
var oLi=oUl1.children[0];
//oUl1.removeChild(oLi);
oUl2.appendChild(oLi); //1.先把元素从原有父级上删掉 2.添加到新的父级
};
};
<ul id="ul1">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<input id="btn1" type="button" value="移动" />
<ul id="ul2">
</ul>第一个li移动到最后一个
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21window.onload=function ()
{
var oUl1=document.getElementById('ul1');
var oBtn=document.getElementById('btn1');
oBtn.onclick=function ()
{
var oLi=oUl1.children[0];
oUl1.appendChild(oLi);
};
};
<input id="btn1" type="button" value="移动" />
<ul id="ul1">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>利用appendChild排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32window.onload=function ()
{
var oUl1=document.getElementById('ul1');
var oBtn=document.getElementById('btn1');
oBtn.onclick=function ()
{
var aLi=oUl1.getElementsByTagName('li');
//aLi.sort();
var arr=[];
for(var i=0;i<aLi.length;i++)
{
arr[i]=aLi[i];
}
arr.sort(function (li1, li2){
var n1=parseInt(li1.innerHTML);
var n2=parseInt(li2.innerHTML);
return n1-n2;
});
//alert(arr[0].innerHTML);
for(var i=0;i<arr.length;i++)
{
alert('该把'+arr[i].innerHTML+'插入到最后');
oUl1.appendChild(arr[i]);
}
};
};
表格排序
1  | window.onload=function ()  | 
JS运动基础
运动基础
- 让Div运动起来
 - 速度——物体运动的快慢
 - 运动中的Bug
不会停止
速度取某些值会无法停止
到达位置后再点击还会运动
重复点击速度加快1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20var timer=null;
function startMove()
{
var oDiv=document.getElementById('div1');
clearInterval(timer); //在开始运动时,关闭已有定时器
timer=setInterval(function (){
var speed=1; // 定义一个speed变量 控制速度
if(oDiv.offsetLeft>=300) //把运动和停止隔开(if/else)
{
clearInterval(timer); //满足条件 关闭定时器 停止运动
}
else
{
oDiv.style.left=oDiv.offsetLeft+speed+'px';
}
}, 30);
} 
运动框架及应用
运动框架实例
分享到 侧边栏
- 通过目标点,计算速度值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52<style>
#div1 {width:150px; height:200px; background:green; position:absolute; left:-150px;}
#div1 span {position:absolute; width:20px; height:60px; line-height:20px; background:blue; right:-20px; top:70px;}
</style>
window.onload=function ()
{
var oDiv=document.getElementById('div1');
oDiv.onmouseover=function ()
{
startMove(0);
};
oDiv.onmouseout=function ()
{
startMove(-150);
};
};
var timer=null;
function startMove(iTarget)
{
var oDiv=document.getElementById('div1');
clearInterval(timer);
timer=setInterval(function (){
var speed=0;
if(oDiv.offsetLeft>iTarget)
{
speed=-10;
}
else
{
speed=10;
}
if(oDiv.offsetLeft==iTarget)
{
clearInterval(timer);
}
else
{
oDiv.style.left=oDiv.offsetLeft+speed+'px';
}
}, 30);
}
<div id="div1">
<span>分享到</span>
</div> 
淡入淡出的图片
- 用变量存储透明度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54<style>
#div1 {width:200px; height:200px; background:red; filter:alpha(opacity:30); opacity:0.3;}
</style>
window.onload=function ()
{
var oDiv=document.getElementById('div1');
oDiv.onmouseover=function () //鼠标移入
{
startMove(100);
};
oDiv.onmouseout=function () //鼠标移出
{
startMove(30);
};
};
var alpha=30;
var timer=null;
function startMove(iTarget)
{
var oDiv=document.getElementById('div1');
clearInterval(timer); //关闭定时器
timer=setInterval(function (){
var speed=0;
if(alpha<iTarget) //当前透明度小于目标点
{
speed=10; //速度等于10
}
else
{ //当前透明度大于目标点
speed=-10; //速度等于-10
}
//判断是否到达目标点
if(alpha==iTarget) //当前透明度等于目标点
{
clearInterval(timer); //关闭定时器
}
else
{
alpha+=speed;
oDiv.style.filter='alpha(opacity:'+alpha+')';
oDiv.style.opacity=alpha/100; //opacity满的时候是1;
}
}, 30);
}
<div id="div1"></div> 
alpha
中文:alpha
解释
表示像素不透明性的值。像素越不透明,则隐藏越多呈现图像的背景。零 alpha 表示完全透明的像素,而最大值的 alpha 表示完全不透明的像素。
缓冲运动
逐渐变慢,最后停止
距离越远速度越大
- 速度由距离决定
 - 速度=(目标值-当前值)/缩放系数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<style>
#div1 {width:100px; height:100px; background:red; position:absolute; left:600px; top:50px;}
#div2 {width:1px; height:300px; position:absolute; left:300px; top:0; background:black;}
</style>
function startMove()
{
var oDiv=document.getElementById('div1');
setInterval(function (){
var speed=(300-oDiv.offsetLeft)/10;
//speed=Math.floor(speed);
speed=speed>0?Math.ceil(speed):Math.floor(speed); //速度为正,向上取整 速度为负,向下取整
oDiv.style.left=oDiv.offsetLeft+speed+'px';
document.title=oDiv.offsetLeft+','+speed;
}, 30);
}
<input type="button" value="开始运动" onclick="startMove()" />
<div id="div1"></div>
<div id="div2"></div> 
实例:右侧悬浮框
Bug:速度取整
跟随页面滚动的缓冲侧边栏
- 潜在问题:目标值不是整数时
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39<style>
#div1 {width:100px; height:150px; background:red; position:absolute; right:0; bottom:0;}
</style>
<script>
window.onscroll=function ()
{
var oDiv=document.getElementById('div1');
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
//oDiv.style.top=document.documentElement.clientHeight-oDiv.offsetHeight+scrollTop+'px';
startMove(document.documentElement.clientHeight-oDiv.offsetHeight+scrollTop);
};
var timer=null;
function startMove(iTarget)
{
var oDiv=document.getElementById('div1');
clearInterval(timer);
timer=setInterval(function (){
var speed=(iTarget-oDiv.offsetTop)/4;
speed=speed>0?Math.ceil(speed):Math.floor(speed);
if(oDiv.offsetTop==iTarget)
{
clearInterval(timer);
}
else
{
oDiv.style.top=oDiv.offsetTop+speed+'px';
}
}, 30);
}
<body style="height:2000px;">
<div id="div1"></div>
</body> 
附
网页可见区域宽:document.body.clientWidth
网页可见区域高:document.body.clientHeight
网页可见区域宽:document.body.offsetWidth (包括边线的宽)
网页可见区域高:document.body.offsetHeight (包括边线的宽)
网页正文全文宽:document.body.scrollWidth
网页正文全文高:document.body.scrollHeight
网页被卷去的高:document.body.scrollTop
网页被卷去的左:document.body.scrollLeft
网页正文部分上:window.screenTop
网页正文部分左:window.screenLeft
屏幕分辨率的高:window.screen.height
屏幕分辨率的宽:window.screen.width
屏幕可用工作区高度:window.screen.availHeight
屏幕可用工作区宽度:window.screen.availWidth
//alert(Math.ceil(-9.8));            //向上取整
alert(Math.floor(4.9999));                //向下取整
alert(Math.abs(-6));                //取绝对值
对联悬浮框
Bug:速度取整
跟随页面滚动的缓冲侧边栏
- 潜在问题:目标值不是整数时
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42<style>
#div1 {width:100px; height:150px; background:red; position:absolute; right:0; bottom:0;}
</style>
window.onscroll=function ()
{
var oDiv=document.getElementById('div1');
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
//可视区的高-div的高,再除以二
//oDiv.style.top=(document.documentElement.clientHeight-oDiv.offsetHeight)/2+scrollTop+'px';
startMove(parseInt((document.documentElement.clientHeight-oDiv.offsetHeight)/2+scrollTop));
// 目标取整 消除跳动
};
var timer=null;
function startMove(iTarget)
{
var oDiv=document.getElementById('div1');
clearInterval(timer);
timer=setInterval(function (){
var speed=(iTarget-oDiv.offsetTop)/4;
speed=speed>0?Math.ceil(speed):Math.floor(speed);
if(oDiv.offsetTop==iTarget)
{
clearInterval(timer);
}
else
{
document.title=iTarget;
document.getElementById('txt1').value=oDiv.offsetTop;
oDiv.style.top=oDiv.offsetTop+speed+'px';
}
}, 30);
}
<body style="height:2000px;">
<input type="text" id="txt1" style="position:fixed; right:0; top:0;" />
<div id="div1"></div>
</body> 
匀速运动的停止条件
运动终止条件
- 匀速运动:距离足够近
 - 缓冲运动:两点重合
 
1  | <style>  | 
JS运动应用
多物体运动框架
多个物体同时运动
例子:多个Div,鼠标移入变宽
- 单定时器,存在问题
 - 每个Div一个定时器
 
1  | <style>  | 
多物体运动框架
定时器作为物体的属性
参数的传递:物体、目标值
例子:多个Div淡入淡出
- 所有东西都不能公用
 - 属性与运动对象绑定:速度、其他属性值(如透明度等)
 
1  | <style>  | 
例子:变宽变高
1  | <style>  | 
任意值运动框架
offset属性的Bug
有边框的Div变宽
用currentStyle代替offset
- offsetWidth(盒模型尺寸)=width+2dorder+2padding
 - styl只能去行间样式
 - getStyle
1
2
3
4
5
6
7
8
9
10
11function getStyle(obj, name) //获取不在行间的样式
{
if(obj.currentStyle)
{
return obj.currentStyle[name];
}
else
{
return getComputedStyle(obj, false)[name];
}
} 
1  | <style>  | 
- 解决方案 用getStyle替换offset
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27<style>
#div1 {width:200px; height:200px; background:red; border:1px solid black;}
</style>
<script>
function getStyle(obj, name) //获取不在行间的样式
{
if(obj.currentStyle)
{
return obj.currentStyle[name];
}
else
{
return getComputedStyle(obj, false)[name];
}
}
setInterval(function (){
var oDiv=document.getElementById('div1');
oDiv.style.width=parseInt(getStyle(oDiv, 'width'))-1+'px';
}, 30);
</script>
<div id="div1"></div> 
去掉offset
1  | <style>  | 
原有运动框架的问题
- 只能让某个值运动起来
 - 如果想让其他值运动起来,要修改程序
 
1  | <style>  | 
扩展的运动框架
- 运动属性作为参数
 - 封装opacity
小数的问题 Math.round() 四舍五入 
1  | 
  | 
JS运动中级
链式运动框架
回调函数
- 运动停止时,执行函数
 - 运动停止时,开始下一次运动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#div1 {width:100px; height:100px; background:red;}
</style>
<script src="move.js"></script>
<script>
window.onload=function ()
{
var oBtn=document.getElementById('btn1');
var oDiv=document.getElementById('div1');
oBtn.onclick=function ()
{
startMove(oDiv, 'width', 300); //先变宽
startMove(oDiv, 'height', 300); //再变长
};
};
</script>
<iinput id="btn1" type="button" value="运动" />
<div id="div1"></div> 
完美运动框架
多个值同时变化
setStyle同时设置多个属性
-参数传递
- Json的使用,实现多个属性运动
 - for in遍历属性
-运用到运动框架 - 检测运动停止
 - 标志变量
 
1  | move2.js  | 
调用框架
1  | <style>  | 
运动框架总结
运动框架演变过程
- startMove(iTarget) 运动框架
 - startMove(obj, iTarget) 多物体
 - startMove(obj, attr, iTarget) 任意值
 - startMove(obj, attr, iTarget, fn) 链式运动
 - startMove(obj, json) 多值运动
 - startMove(obj, json, fn) 完美运动框架
 
运动框架应用
例子:幻灯片
1  | 
  | 
例子:微博信息发布效果
1  | <style>  | 
JS事件基础
event对象和事件冒泡
event对象
Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。事件通常与函数结合使用,函数不会在事件发生前被执行!
点击
- 直接用document.onclick
 - document.body 可能撑不开
 
1  | window.onload=function ()  | 
document
- <!DOCTYPE HTML>也是一个节点
 - <!DOCTYPE HTML>和HTML都是document的子节点
 
1  | window.onload=function ()  | 
获取event对象(兼容性写法)
- var oEvent=ev||event;
 
点击坐标
- clientX–获取x坐标值
 - clientY–获取y坐标值
 - event 只能在IE下用
 - 火狐下用ev
 
1  | window.onload=function ()  | 
事件流
事件冒泡
- 事件会随着层级传给父级
 
取消冒泡
- oEvent.cancelBubble=true
 
1  | #div1 {width:400px; height:300px; background:#CCC; display:none;}  | 
鼠标事件
鼠标位置
- 用到client一定要用的scroll
 
可视区位置:clientX、clientY
例子1:跟随鼠标的Div
1
2
3
4
5
6
7
8
9
10
11
12#div1 {width:200px; height:200px; background:red; position:absolute;}
document.onmousemove=function (ev)
{
var oEvent=ev||event;
var oDiv=document.getElementById('div1');
oDiv.style.left=oEvent.clientX+'px';
oDiv.style.top=oEvent.clientY+'px';
};
<div id="div1"></div>消除滚动条的影响
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#div1 {width:200px; height:200px; background:red; position:absolute;}
document.onmousemove=function (ev)
{
var oEvent=ev||event;
var oDiv=document.getElementById('div1');
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
oDiv.style.left=oEvent.clientX+'px';
oDiv.style.top=oEvent.clientY+scrollTop+'px';
};
<body style="height:2000px;">
<div id="div1"></div>
获取鼠标在页面的绝对位置
封装函数
1  | #div1 {width:200px; height:200px; background:red; position:absolute;}  | 
例子2:一串跟随鼠标的Div
1  | div {width:10px; height:10px; background:red; position:absolute;}  | 
键盘事件
keyCode
- 获取用户按下键盘的哪个按键
 - onkeydown–按下
 - onkeyup–抬起
 
1  | document.onkeydown=function (ev)  | 
例子:键盘控制Div移动
1  | #div1 {width:100px; height:100px; background:#CCC; position:absolute;}  | 
其他属性
ctrlKey、shiftKey、altKey
例子:提交留言
- 回车 提交
 - ctrl+回车 提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19window.onload=function ()
{
var oTxt1=document.getElementById('txt1');
var oTxt2=document.getElementById('txt2');
oTxt1.onkeydown=function (ev)
{
var oEvent=ev||event;
if(oEvent.keyCode==13 && oEvent.ctrlKey)
{
oTxt2.value+=oTxt1.value+'\n';
oTxt1.value='';
}
};
};
<1input id="txt1" type="text" /><br>
<1textarea id="txt2" rows="10" cols="40"></textarea> 
JS事件中级
默认行为
默认行为
- 浏览器自带的行为就是默认行为
 
阻止默认行为
- 普通写法:return flase;
 
例子1.屏蔽右键菜单
1  | document.oncontextmenu=function ()  | 
- 自定义右键菜单
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30* {margin:0; padding:0; list-style:none;}
#div1 {position:absolute; width:80px; background:#CCC; border:1px solid black; display:none;}
document.oncontextmenu=function (ev)
{
var oEvent=ev||event;
var oDiv=document.getElementById('div1');
oDiv.style.display='block';
oDiv.style.left=oEvent.clientX+'px';
oDiv.style.top=oEvent.clientY+'px';
return false;
};
document.onclick=function ()
{
var oDiv=document.getElementById('div1');
oDiv.style.display='none';
};
<div id="div1">
<ul>
<li>aaa</li>
<li>bbb</li>
<li>ccc</li>
<li>ddd</li>
</ul>
</div> 
例子2.只能输入数字的输入框
1  | window.onload=function ()  | 
附 KeyCode对照表




拖拽
简易拖拽
- 拖拽原理:鼠标与Div的距离不变,鼠标事件(onmousemove、onmousedown、onmouseup)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33#div1 {width:200px; height:200px; background:red; position:absolute;}
window.onload=function ()
{
var oDiv=document.getElementById('div1');
var disX=0;
var disY=0;
oDiv.onmousedown=function (ev)
{
var oEvent=ev||event;
disX=oEvent.clientX-oDiv.offsetLeft;
disY=oEvent.clientY-oDiv.offsetTop;
document.onmousemove=function (ev)
{
var oEvent=ev||event;
oDiv.style.left=oEvent.clientX-disX+'px';
oDiv.style.top=oEvent.clientY-disY+'px';
};
document.onmouseup=function ()
{
document.onmousemove=null; //鼠标抬起时,div不能再移动
document.onmouseup=null;
};
};
};
<div id="div1"></div> 
靠谱拖拽
原有拖拽的问题
- 直接给document加事件
1
2
3
4
5
6
7
8
9
10
11
12
13document.onmousemove=function (ev)
{
var oEvent=ev||event;
oDiv.style.left=oEvent.clientX-disX+'px';
oDiv.style.top=oEvent.clientY-disY+'px';
};
document.onmouseup=function ()
{
document.onmousemove=null;
document.onmouseup=null;
}; 
FF下,空Div拖拽Bug
- 阻止默认事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23oDiv.onmousedown=function (ev)
{
var oEvent=ev||event;
disX=oEvent.clientX-oDiv.offsetLeft;
disY=oEvent.clientY-oDiv.offsetTop;
document.onmousemove=function (ev)
{
var oEvent=ev||event;
oDiv.style.left=oEvent.clientX-disX+'px';
oDiv.style.top=oEvent.clientY-disY+'px';
};
document.onmouseup=function ()
{
document.onmousemove=null;
document.onmouseup=null;
};
return false; //阻止默认事件
}; //拖拽从onmousedown开始 
防止拖出页面
- 修正位置
 
1  | #div1 {width:200px; height:200px; background:red; position:absolute;}  | 
JS事件高级应用
事件绑定
IE方式
- attachEvent(事件名称, 函数),绑定事件处理函数 事件名带on
 - detachEvent(事件名称, 函数),解除绑定
1
2
3
4
5
6
7
8
9
10
11//attachEvent(事件名, 函数)
//IE
/*
oBtn.attachEvent('onclick', function ()
{
alert('a');
});
oBtn.attachEvent('onclick', function ()
{
alert('b');
}); 
DOM 方式
- addEventListener(事件名, 函数, false) 事件名不带on
 - removeEventListener(事件名称, 函数, 捕获)
 
火狐方式
1  | //FF  | 
兼容火狐、IE
1  | if(oBtn.attachEvent)  | 
兼容封装函数
1  | function myAddEvent(obj, ev, fn)  | 
高级拖拽-1
限制范围
对位置进行判断
- 例子:不能拖出指定对象的Div
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27document.onmousemove=function (ev)
{
var oEvent=ev||event;
var l=oEvent.clientX-disX;
var t=oEvent.clientY-disY;
if(l<0)
{
l=0;
}
else if(l>oDiv2.offsetWidth-oDiv.offsetWidth) //限制范围时用到div的宽度
{
l=oDiv2.offsetWidth-oDiv.offsetWidth;
}
if(t<0)
{
t=0;
}
else if(t>oDiv2.offsetHeight-oDiv.offsetHeight)
{
t=oDiv2.offsetHeight-oDiv.offsetHeight;
}
oDiv.style.left=l+'px';
oDiv.style.top=t+'px';
}; 
#### 磁性吸附
- 修改legth的大小判断条件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27document.onmousemove=function (ev)
{
var oEvent=ev||event;
var l=oEvent.clientX-disX;
var t=oEvent.clientY-disY;
if(l<50) //修改legth的大小判断条件
{
l=0;
}
else if(l>oDiv2.offsetWidth-oDiv.offsetWidth)
{
l=oDiv2.offsetWidth-oDiv.offsetWidth;
}
if(t<50)
{
t=0;
}
else if(t>oDiv2.offsetHeight-oDiv.offsetHeight)
{
t=oDiv2.offsetHeight-oDiv.offsetHeight;
}
oDiv.style.left=l+'px';
oDiv.style.top=t+'px';
}; 
高级拖拽-2
图片拖拽
- 阻止默认事件
文字选中
 - 阻止默认事件
 - IE下拖动有问题
 
事件捕获
- setCapture() 开启捕获
 - releaseCapture() 释放捕获
 
1  | #div1 {width:100px; height:100px; background:red; position:absolute;}  | 
与DOM配合
- 带框的拖拽
 - 保留原有位置的拖拽
 
1  | #div1 {width:100px; height:100px; background:yellow; position:absolute;}  | 
自定义滚动条
拖拽
- 只有横向拖拽
 - 限制范围——范围的大小
 - 计算比例——当前值/最大值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46#parent {width:600px; height:20px; background:#CCC; position:relative; margin:10px auto;}
#div1 {width:20px; height:20px; background:red; position:absolute; left:0; top:0;}
window.onload=function ()
{
var oDiv=document.getElementById('div1');
var oParent=document.getElementById('parent');
var disX=0;
oDiv.onmousedown=function (ev)
{
var oEvent=ev||event;
disX=oEvent.clientX-oDiv.offsetLeft;
document.onmousemove=function (ev)
{
var oEvent=ev||event;
var l=oEvent.clientX-disX;
if(l<0)
{
l=0;
}
else if(l>oParent.offsetWidth-oDiv.offsetWidth)
{
l=oParent.offsetWidth-oDiv.offsetWidth;
}
oDiv.style.left=l+'px';
};
document.onmouseup=function ()
{
document.onmousemove=null;
document.onmouseup=null;
};
return false; //chrome、ff、IE9
};
};
<div id="parent">
<div id="div1"></div>
</div> 
控制其他对象
例子1:控制物体的大小
1  | #parent {width:600px; height:20px; background:#CCC; position:relative; margin:10px auto;}  | 
例子2:控制物体的透明度
1  | #parent {width:600px; height:20px; background:#CCC; position:relative; margin:10px auto;}  | 
例子3:控制文字滚动
1  | #parent {width:600px; height:20px; background:#CCC; position:relative; margin:10px auto;}  | 
Ajax基础
什么是 Ajax
AJAX = 异步 JavaScript 和 XML。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
Ajax.js
1  | function ajax(url, fnSucc, fnFaild)  | 
使用Ajax
基础:请求并显示静态TXT文件
- 字符集编码(统一编码)
 - 缓存、阻止缓存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<script src="ajax.js"></script> //引用ajax.js
window.onload=function ()
{
var oBtn=document.getElementById('btn1');
oBtn.onclick=function ()
{
ajax('aaa.txt', function (str){
alert(str);
}, function (){
alert('失败');
});
};
};
<1input id="btn1" type="button" value="读取" /> 
阻止缓存
- ajax(‘aaa.txt?t=’+new Date().getTime(), function (str)
1
2
3
4
5
6
7
8
9
10
11
12
13window.onload=function ()
{
var oBtn=document.getElementById('btn1');
oBtn.onclick=function ()
{
ajax('aaa.txt?t='+new Date().getTime(), function (str){
alert(str);
}, function (){
alert('失败');
});
};
}; 
动态数据:请求JS(或Json)文件
- eval的使用
 - DOM创建元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29<script src="ajax.js"></script>
window.onload=function ()
{
var oBtn=document.getElementById('btn1');
var oUl=document.getElementById('ul1');
oBtn.onclick=function ()
{
ajax('data.txt?t='+new Date().getTime(), function (str){
var arr=eval(str);
for(var i=0;i<arr.length;i++)
{
var oLi=document.createElement('li');
oLi.innerHTML='用户名:<strong>'+arr[i].user+'</strong>密码:<span>'+arr[i].pass+'</span>';
oUl.appendChild(oLi);
}
}, function (){
alert('失败');
});
};
};
<1input id="btn1" type="button" value="读取" />
<ul id="ul1">
</ul> 
Ajax原理
HTTP请求方法
- GET方法是默认的HTTP请求方法,我们日常用GET方法来提交表单数据,然而用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向Web服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上
 - POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。
 
Ajax中级
编写Ajax-1
创建Ajax对象
- ActiveXObject(“Microsoft.XMLHTTP”) //IE6
 - XMLHttpRequest()
 - 全局变量是window的属性
 - 用没定义的变量–报错
 - 用没有定义的属性–undefined
 
1  | //1.创建Ajax对象 用属性的形式来判断  | 
连接服务器
- open(方法, 文件名, 异步传输)
 
1  | //2.连接服务器  | 
同步和异步
- 同步传输(一步一步)是一种以数据块为传输单位的数据传输方式,该方式下数据块与数据块之间的时间间隔是固定的,必须严格地规定它们的时间关系。每个数据块的头部和尾部都要附加一个特殊的字符或比特序列,标记一个数据块的开始和结束,一般还要附加一个校验序列,以便对数据块进行差错控制。
 - 异步传输(一起)将比特分成小组进行传送,小组可以是8位的1个字符或更长。发送方可以在任何时刻发送这些比特组,而接收方从不知道它们会在什么时候到达。
 - Ajax就是用异步传输
 
发送请求
- send()
1
oAjax.send();
 
接收返回值
1  | //4.接收返回  | 
Ajax
1  | function ajax(url, fnSucc, fnFaild)  | 
编写Ajax - 2
请求状态监控
onreadystatechange事件
- onreadystatechange 存储函数(或函数名
 - 每当 readyState 属性改变时,就会调用该函数。
 
readyState属性:请求状态
| readyState属性值 | 请求状态 | 
|---|---|
| 0 (未初始化) | 还没有调用open()方法 | 
| 1 (载入) | 已调用send()方法,正在发送请求 | 
| 2 (载入完成) | send()方法完成,已收到全部响应内容 | 
| 3 (解析) | 正在解析响应内容 | 
| 4 (完成) | 响应内容解析完成,可以在客户端调用了 | 
status属性:请求结果
1xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码。
| 代码 | 说明 | 
|---|---|
| 100 (继续) | 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 | 
| 101 (切换协议) | 请求者已要求服务器切换协议,服务器已确认并准备切换。 | 
2xx (成功)
表示成功处理了请求的状态代码。
| 代码 | 说明 | 
|---|---|
| 200 (成功) | 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 | 
| 201 (已创建) | 请求成功并且服务器创建了新的资源。 | 
| 202 (已接受) | 服务器已接受请求,但尚未处理。 | 
| 203 (非授权信息) | 服务器已成功处理了请求,但返回的信息可能来自另一来源。 | 
| 204 (无内容) | 服务器成功处理了请求,但没有返回任何内容。 | 
| 205 (重置内容) | 服务器成功处理了请求,但没有返回任何内容。 | 
| 206 (部分内容) | 服务器成功处理了部分 GET 请求。 | 
3xx (重定向)
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
| 代码 | 说明 | 
|---|---|
| 300 (多种选择) | 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。 | 
| 301 (永久移动) | 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。 | 
| 302 (临时移动) | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 | 
| 303 (查看其他位置) | 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。 | 
| 304 (未修改) | 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 | 
| 305 (使用代理) | 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。 | 
| 307 (临时重定向) | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 | 
4xx(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。
| 代码 | 说明 | 
|---|---|
| 400 (错误请求) | 服务器不理解请求的语法。 | 
| 401 (未授权) | 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。 | 
| 403 (禁止) | 服务器拒绝请求。 | 
| 404 (未找到) | 服务器找不到请求的网页。 | 
| 405 (方法禁用) | 禁用请求中指定的方法。 | 
| 406 (不接受) | 无法使用请求的内容特性响应请求的网页。 | 
| 407 (需要代理授权) | 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。 | 
| 408 (请求超时) | 服务器等候请求时发生超时。 | 
| 409 (冲突) | 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。 | 
| 410 (已删除) | 如果请求的资源已永久删除,服务器就会返回此响应。 | 
| 411 (需要有效长度) | 服务器不接受不含有效内容长度标头字段的请求。 | 
| 412 (未满足前提条件) | 服务器未满足请求者在请求中设置的其中一个前提条件。 | 
| 413 (请求实体过大) | 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 | 
| 414 (请求的 URI 过长) | 请求的 URI(通常为网址)过长,服务器无法处理。 | 
| 415 (不支持的媒体类型) | 请求的格式不受请求页面的支持。 | 
| 416 (请求范围不符合要求) | 如果页面无法提供请求的范围,则服务器会返回此状态代码。 | 
| 417 (未满足期望值) | 服务器未满足”期望”请求标头字段的要求。 | 
5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
| 代码 | 说明 | 
|---|---|
| 500 (服务器内部错误) | 服务器遇到错误,无法完成请求。 | 
| 501 (尚未实施) | 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 | 
| 502 (错误网关) | 服务器作为网关或代理,从上游服务器收到无效响应。 | 
| 503 (服务不可用) | 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 | 
| 504 (网关超时) | 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 | 
| 505 (HTTP 版本不受支持) | 服务器不支持请求中所用的 HTTP 协议版本。 | 
服务器响应
- responseText 属性:如果来自服务器的响应并非 XML,请使用 responseText 属性。
 - responseXML 属性:如果来自服务器的响应是 XML,而且需要作为 XML 对象进行解析,使用responseXML属性
 
| 属性 | 描述 | 
|---|---|
| responseText | 获得字符串形式的响应数据。 | 
| responseXML | 获得 XML 形式的响应数据。 | 
JS面向对象基础
什么是对象
- JavaScript 中的所有事物都是对象:字符串、数值、数组、函数
 - JavaScript 提供多个内建对象,比如 String、Date、Array 等等。
 - 对象只是带有属性和方法的特殊数据类型。
 
什么是面向对象
- 使用对象时,只关注对象提供的功能,不关注其内部细节
 - 比如JQuery
 
JS中的面向对象
面向对象编程(OOP)的特点
- 抽象:抓住核心问题
 - 封装:不考虑内部实现,只考虑功能使用
 - 继承:从已有对象上,继承出新的对象
多重继承
多态 
对象的组成
- 方法——函数:过程、动态的
 - 属性——变量:状态、静态的
 
方法——函数:过程、动态的
1  | function aaa() //函数:自由  | 
属性——变量:状态、静态的
1  | var a=12; //变量:自由的,不属于任何人  | 
第一个面向对象程序
为对象添加方法和属性
this详解,事件处理中this的本质
- 当前发生事件的对象
 - 当前的方法所属的对象
 
不能在系统对象中随意附加方法、属性,否则会覆盖已有方法、属性
object对象
1  | function createPerson(name, qq) //构造函数  | 
工厂方式
什么是工厂
- 原料
 - 加工
 - 出厂
 
工厂方式
- 用构造函数创建一个类
 - 什么是类、对象(实例):模具和零件
 
1  | function createPerson(name, qq) //构造函数  | 
工厂方式的问题
问题
- 没有new
 - 函数重复定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26function createPerson(name, qq) //构造函数
{
//原料
var obj=new Object();
//加工
obj.name=name;
obj.qq=qq;
obj.showName=function ()
{
alert('我的名字叫:'+this.name);
};
obj.showQQ=function ()
{
alert('我的QQ号:'+this.qq);
};
//出厂
return obj;
}
var obj=createPerson('blue', '258248832');
var obj2=createPerson('张三', '45648979879');
alert(obj.showName==obj2.showName); 
加上new
- 偷偷做了两件事
 - 替你创建了一个空白对象
 - 替你返回了这个对象
 
1  | function createPerson(name, qq) //构造函数  | 
原型——prototype
什么是原型
- 原型是class,修改他可以影响一类元素
 - 在已有对象中加入自己的属性、方法
 - 原型修改对已有对象的影响
 
为Array添加sum方法
- 给对象添加方法,类似于行间样式
 - 给原型添加方法,类似于class
 
原型的小缺陷
- 无法限制覆盖
 
1  | var arr1=new Array(12,55,34,78,676);  | 
流行的面向对象编写方式
用混合方式构造对象
- 混合的的构造函数/原型方式
 - Mixed Constructor Function/Prototype Method
 
原则
- 构造函数:加属性
 - 原型:加方法
 
对象命名规范
- 类名首字母大写
 
1  | function CreatePerson(name, qq) //构造函数  | 
JS面向对象实例
实例:面向对象的选项卡
把面向过程的程序,改写成面向对象的形式
原则
- 不能有函数套函数、但可以有全局变量
 
过程
- onload → 构造函数
 - 全局变量 → 属性
 - 函数 → 方法
 
改错
- this、事件、闭包、传参
 
1  | #div1 input {background:white;}  | 
对象与闭包
有权访问另一个函数作用域内变量的函数都是闭包
通过闭包传递this
JS面向对象高级
Json方式的面向对象
把方法包在一个Json里
- 有人管他叫——命名空间
 - 在公司里,把同一类方法,包在一起
 - 不适合多个对象
 
Json的对象
1  | var json={  | 
命名空间
1  | var zns={};  | 
拖拽和继承
面向对象的拖拽
- 改写原有拖拽
 
对象的继承
- 什么是继承
在原有类的基础上,略作修改,得到一个新的类
不影响原有类的功能 
instanceof运算符
- 查看对象是否是某个类的实例
 
父类
1  | function Drag(id)  | 
HTML部分
1  | #div1 {width:200px; height:200px; background:yellow; position:absolute;}  | 
使用继承
限制范围的拖拽类
继承类
1  | function LimitDrag(id)  | 
构造函数伪装
- 属性的继承
原理:欺骗构造函数 - call的使用
 
属性的继承
1  | function A()  | 
call的使用
1  | function show(a, b)  | 
原型链
- 方法的继承
原理:复制方法 - 覆盖原型和方法复制
 
引用
1  | var arr1=[1,2,3];  | 
方法的继承
1  | //继承父类方法  | 
系统对象
本地对象(非静态对象)
- 什么是本地对象,需要实例化(new)
 - 常用对象
Object、Function、Array、String、Boolean、Number、Date、RegExp、Error内置对象(静态对象)
 - 什么是本地对象
Global、Math宿主对象(由浏览器提供的对象)
 - DOM、BOM
 
BOM应用
BOM基础
打开、关闭窗口
open
- window.open(‘url’,’_blank’)
 - window.open有返回值,返回值就是打开的页面
 
例子:运行
1  | window.onload=function ()  | 
close
- 关闭时提示问题
 - 火狐里不能不用close关闭非open的窗口
1
window.close()
 
常用属性
- window.navigator.userAgent //当前浏览器版本信息
 - window.location //当前页面的地址,可读取还可赋值
 
window.location
1  | window.location='http://www.uknow.top'  | 
尺寸及坐标
窗口尺寸、工作区尺寸
可视区尺寸
- 仅跟窗口大小有关
 - document.documentElement.clientWidth
 - document.documentElement.clientHeight
 
滚动距离
- 随着滚动距离变大
 - document.body.scrollTop
 - document.documentElement.scrollTop
 
兼容写法
1  | document.onclick=function ()  | 
常用方法和事件
系统对话框
- 警告框:alert(“内容”),没有返回值
 - 选择框:confirm(“提问的内容”),返回boolean
 - 输入框:prompt(),返回字符串或null
 
选择框:confirm
1  | var res=confirm('你是否要删除');  | 
输入框:prompt
1  | var res=prompt('请输入你的姓名', 'blue');  | 
window对象常用事件
- onload
 - onscroll //当滚动时事件发生
 - onresize //当改变时事件发生
 
例子:回到顶部按钮、侧边栏广告
1  | #div1 {width:200px; height:150px; background:red; position:absolute; right:0; bottom:0;}  | 
闪烁问题
- userAgent>IE6 —> fixed
 - IE —> 运动
 
页面用来保存信息
- 比如:自动登录、记住用户名
 
- 同一个网站中所有页面共享一套cookie
 - 数量、大小有限
 - 过期时间
 
document.cookie
1
2
3
4document.cookie='user=blue'; //添加
document.cookie='pass=123456';
alert(document.cookie);Date()
1
2
3
4
5var oDate=new Date();
oDate.setDate(oDate.getDate()+800000);
alert(oDate.getFullYear()+'-'+(oDate.getMonth()+1)+'-'+oDate.getDate());
- 格式:名字=值
 - 不会覆盖
 - 过期时间:expires=时间
日期对象的使用 - 封装函数
 
1  | function setCookie(name, value, iDay)  | 
- 字符串分割
 
1  | function getCookie(name)  | 
- 已经过期
 
1  | function removeCookie(name)  | 
封装函数
1  | function setCookie(name, value, iDay)  | 
例子
用cookie记录上次登录的用户名
- 提交时——记录用户名
 - window.onload——读取用户名
 
1  | function setCookie(name, value, iDay)  | 
JS中的正则表达式
正则表达式基础 - 1
复习字符串操作
- search 查找
 - substring 获取子字符串
 - charAt 获取某个字符
 - split 分割字符串,获得数组
 
search
1  | var str='abcdef';  | 
substring
1  | var str='abcdef';  | 
charAt
1  | var str='abcdef';  | 
split
1  | var str='12-56-aaa-89';  | 
找出字符串中的所有数字
- 用传统字符串操作完成
 - 用正则表达式完成
 
传统操作
1  | var str='12 fff 87 er334 233 -=-=fa80';  | 
正则操作
1  | var str='12 fff 87 er334 233 -=-=fa80';  | 
正则表达式基础 - 2
什么是正则表达式
- 什么叫“正则”
规则、模式 - 强大的字符串匹配工具
 - 是一种正常人类很难读懂的文字
 - RegExp对象
JS风格——new RegExp(“a”, “i”)
perl风格——/a/i 
JS风格
1  | var re=new RegExp('b', 'i'); //i 忽略大小写  | 
perl风格
1  | var re=/a/i;  | 
字符串与正则配合 - 1
search
字符串搜索
- 返回出现的位置
 - 忽略大小写:i——ignore
 - 判断浏览器类型
 
match
获取匹配的项目
- 量词:+
 - 量词变化:\d、\d\d和\d+
 - 全局匹配:g——global
 - 例子:找出所有数字
 
例子:找出所有数字
1  | var str='asdf 34 656 cvs33';  | 
字符串与正则配合 - 2
replace
替换所有匹配
- 返回替换后的字符串
 - 例子:敏感词过滤
1
2
3
4
5var str='abc aaa erw';
var re=/a/g;
alert(str.replace(re, '0'));
</script> 
字符串 - 1
任意字符
- [abc]    或
例子:o[usb]t——obt、ost、out 
范围
- [a-z]、[0-9]
例子:id[0-9]——id0、id5 
排除
- [^a]
例子:o[^0-9]t——oat、o?t、o t 
字符串 - 2
组合
- [a-z0-9A-Z]
 
实例:偷小说
- 过滤HTML标签
自定义innerText方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18window.onload=function ()
{
var oTxt1=document.getElementById('txt1');
var oTxt2=document.getElementById('txt2');
var oBtn=document.getElementById('btn1');
oBtn.onclick=function ()
{
var re=/<[^<>]+>/g;
oTxt2.value=oTxt1.value.replace(re, '');
};
};
<textarea id="txt1" rows="10" cols="40"></textarea><br>
<input id="btn1" type="button" value="转换" /><br>
<textarea id="txt2" rows="10" cols="40"></textarea> 
转义字符
- .(点)——任意字符
 - \d(数字)、\w(英文、数字、下划线)、\s(空白字符)
 - \D(除了数字)、\W(除了英文、数字、下划线)、\S(除了空白字符)
 
量词
什么是量词
- {n}出现的次数
 - {n,m},至少出现n次,最多m次
 - {n,} 最少n次,最多不限
 - 例子:查找QQ号 [1-9]\d{4,10}
 - 例子:固定电话 (0\d{2,3}-)?[1-9]\d{7} ?表示前面可以有可以没有
 
常用量词
- {n,} 至少n次
 - × 任意次 {0,}
 - ? 零次或一次 {0,1}
 - + 一次或任意次{1,}
 - {n} 正好n次
 
常用正则例子
表单校验实例
- 校验邮箱
行首(^)、行尾($) - test 只要一部分符合要求就返回ture
 
window.onload=function ()
{
    var oTxt=document.getElementById('txt1');
    var oBtn=document.getElementById('btn1');
    oBtn.onclick=function ()
    {
        var re=/^\w+@[a-z0-9]+\.[a-z]+$/i;
        if(re.test(oTxt.value))
        {
            alert('合法的邮箱');
        }
        else
        {
            alert('你丫写错了');
        }
    };
};
<1input type="text" id="txt1" />
<1input type="button" value="校验" id="btn1" />
