《javascript征途》学习笔记
基础
1、 只有函数有作用域
2、 如果在<script src>的src 中设置了src特性,则script元素包含的任意代码就无效了。应该分开放到不同的script块中。
3、 外部js脚本文件和页面内嵌的js代码的执行顺序是按它们在文档中的位置决定的,而不是先执行内嵌脚本,后执行外部脚本文件。
4、 建议通过外部文件形式导入js文件。
5、 使用接口技术解决js文件函数重名的冲突。问题是如果封装的接口也冲突了怎么办?定义接口的对象名也不能够相同,否则也会冲突。P46 这个例子没运行起来。
6、 Js为css设置样式,是以html文件为参考的,而不用考虑js文件的具体位置,而css文件是以它本身位置为参考的。
7、 浏览器是从上到下解析网页源码的。
8、 接口的概念?
9、 使用变量之前必须先声明。尽量少使用全局变量。
10、 怎么区分构造函数、类和一般的函数?在命名时构造函数和类名建议首字母大写,而函数小写开头
11、 使用alert和confirm进行手动调试
第四章 数据类型和变量
1、 实词和虚词。实词指标识符、关键字保留字、直接量等。虚词指空白符、换行符、注释等无意义的字符。实词是区分大小写的。
2、 Js只有三种数据类型:数值型(不区分浮点和整数,都是浮点型)、字符串型和数组型。null、undefined,number,string,Boolean是五种原始数据类型。
object
function是对象。是object的特殊情况。
棧存储值类型,堆存储引用类型。
3、 alert(Boolean(1));//返回的是true。书上返回的是13。有误
alert((a = 1,2,3,4));//4
alert(a=(1,2,3,4));//4
alert(Boolean(1));//true
a = 1,2,3,4;
alert(a);//1
var a = 1,2,3,4;
alert(a);//null
4、 JS仅支持定义一维数组。不支持多维数组。但是可以模拟多维数组。但是性能不好。
Var a = [[1,2,3],[4,5,6]];。数组可以放入不同的任意类型的数据,包括function和表达式。
5、 函数在js中是第一种类型(基类,父类),其他类型继承于function。Object也是由Function来实现的。这点很NB啊。
6、 函数如果没有返回值,责约定返回值是undefined。
7、 函数是一个独立的作用域,只能通过函数返回值读取函数内部的数据。而构造函数是可以通过this.属性,获取函数内部的属性值。构造函数是定义对象的模板,就是类。
8、 函数解析的机制:js解释器在预编译时就会把所有function语句声明的函数处理,如果存在同名函数,则后面的函数体会覆盖前面的函数体。而js解释器只是对var语句声明的变量名进行索引,变量的初始化值却被忽略,直到执行期才去为变量读取初始值。而对于function声明的函数体,js解释器不仅对函数盟按变量标识符进行索引,而且对于函数体也提前处理。
第一:JavaScript时按<script></script>编译,并执行的。
第二:JavaScript编译时完成对变量的声明,及函数处理。
第三:JavaScript后声明的函数将会覆盖前声明的函数
9、 处于同一个文档中的js教本,都属于同一个作用域:window。可以互相通信和调用。
10、 Constructor属性。表示构造函数的属性值,用来检测数据类型。(10).constructor。返回number。
Js习惯:先声明后读写,先赋值后运算。
变量的作用域:
1、 局部变量都比全局变量的优先权高
2、 内部局部变量比外层局部变量优先权高
3、 变量都是对象的属性。全局变量是window对象的属性。
第五章
Delete
如果删除内部对象的预定义成员和客户端对象成员,使用var语句申明的变量也是不允许删除的。
可以删除不存在的变量,返回true。
Delete操作是彻底删除所占用的存储空间。
Void运算符的优先级、void的运算结果返回undefined。
第七章
函数的作用域。
function和Function构造函数的作用域是不同的。Funtion有顶级作用域。而function是局部的。
函数的解析机制
Js解释器是一段段分析和执行程序的。在同一段代码中,function语句和函数直接量定义的函数结构总会被提取出来执行。只有当函数被解析和执行完毕之后,才会按顺序执行其它代码。但是Function构造函数定义的函数并非提前运行,而是在运行时动态地被执行。
函数的接收值个数没有限制。函数的返回值只能有一个。若要返回多个数据,则用数组存储。
函数的生命周期:
使用function语句声明的函数被预先编译,此时如果存在相同的函数名,则会按顺序覆盖。而函数直接量和构造函数定义的函数都属于表达式函数,因此在代码按行执行时,才被激活生命周期。
函数的形参通过length属性来获取。
Arguments对象。参数管理器
Arguments.length表示实参的个数。Arguments不是array对象,而是object对象,不能用for/in结构遍历。
可以通过arguments[i]下标动态改变实参的值。也可以通过修改length动态增大或减小实参的个数。
Arguments.Callee可以返回当前arugments对象所属的函数的引用,等价于函数名。Arguments.Callee.length表示函数形参的个数。
This关键字
Undefined+undefined=NaN。多个undefined相加会返回NaN。
函数作用域和实例化函数this的作用域是不同的。实例化只值向当前函数的作用域,而函数调用对象的作用域则是window。
函数属性的作用域:
函数体外定于的属性可以任意的访问,可以在函数体内或外部访问,而函数内部定义的属性在初始化状态只能在函数体内部被调用。但若函数被调用后,则可以在外部访问函数内部定义的属性。若属性是函数,作用域也是一样的。
Call和apply。Apply传递的是数组。
1、 Call和apply将函数转换成方法传递给某个对象,只是临时的,函数最终没有作为对象的方法存在,当函数被调用后,该对象方法会自动被注销。
2、 Call和apply避免了资源浪费。
闭包:数据存储的一种方式。在动态环境中,数据实时变化,为了避免前面的数据丢失,js提供了闭包来寄存动态数据。
特性:
自闭特性。外界无法访问闭包结构内部的数据。
包裹特性。
第八章
定义抽象对象的方法是通过构造函数来实现的。
Push()会添加新元素后返回数组长度。
创建对象时,存储在变量中的只是引用指针,并不是对象本身。删除变量后,对象本身依然存在。
Js的垃圾回收机制,自动收集无用存储单元,不需要专门销毁无用对象以释放内存。当对象没有被任何变量引用时,js会自动侦测并把所有废除的对象注销。
当我们把对象的所有引用变量都设置为null时,可以强制对象处于废除状态。并被回收。
当删除对象属性后,不是将属性设为undefined,而是真正从内存清除掉。
对象的作用域:
Js仅支持一种作用域,即公共作用域。对于js所有对象的所有属性和方法来说都是公开的。
Js对象的结构封闭性不如函数结构。函数有自己的私有作用域。外界是无法访问的。
通过命名规则以区分私有作用域。O.x._a_=1;
静态对象:static 声明。Math和Global都是静态对象。
Js不支持静态作用域。
构造对象:就是构造函数。如Object、Date、Function。构造对象的首字母要大写。
构造对象不能直接被引用。必须使用new来实例化。
alert(Point.name); //直接读取构造对象的属性
alert(p1.name); //但是不能够通过实例对象来读取构造对象的属性 返回 undefined。这个name是构造对象在函数外定义的。如果是在函数内定义的则可以访问。
对于构造对象的属性,实例对象是不能继承的,因此也不能够通过实例对象来读取构造对象的属性,反过来,构造对象也不能读取实例对象的属性。
构造对象不能使用this关键字来读去实例对象的属性。
function Point(x,y){
this.x = x;
this.y = y;
this.z = z;
}
Point.name = "类属性";
Point.money = "1203";
Point.saying = function(){
alert(this.length); //返回值2
}
Point.saying();
var p = new Point();
alert(p.name);// 实例对象不能访问构造对象的属性。抛错。
function Point(x){
this.x = x;
}
Point.saying = function(){ //构造对象的方法
alert("类方法");
}
Point.saying(); //直接调用构造对象的方法
Point.saying = function(){
alert(this.x);//不能通过this访问实例对象的属性
}
Point.saying(); //直接调用构造对象的方法 返回undefined
实例对象
实例对象的属性有两种:
第一种:从构造对象中继承过来的,这种属性每一个实力属性都有,但是他们拥有不同的副本。
第二种:自己创建的,这种属性只有这个实例对象所独有。
原型对象
就是构造函数的实例对象。它所包含的所有属性和方法能够供构造函数的所有实例共享。(类继承的实现),js叫原型继承。
原型对象时在使用构造函数创建对象是同时实例化的一个对象,所有的对象都共同拥有这个对象的引用。
通常我们在原型对象里面定义实例对象公用的方法,这样的好处是:
第一:所有的对象都共有这样一个方法实例,大大的节省的内存。
第二: 当我们想修改对象的方法是,只用修改原型对象的方法既可以了,不用再麻烦的修改每一个实例的方法。
如果原型属性和实例对象自定义的属性发生了命名冲突,则自定义的属性会“覆盖”原型属性的内容。这时由他的工作机制所决定的,但并不是真正的覆盖。如果我们删除这个属性,也是删除的实例的属性。
当js解释器在检索属性时,会先检查对象实例是否定义该属性,没有,则会检查构造函数的原型对象是否具有这个属性。属性的继承只发生在读属性值时,而在写属性时不会发生。
构造器
构造器是在Object类中定义的属性,该属性始终指向对象的构造函数。
对象的构造器属性是通过原型对象继承的,如果我们删除掉对象的原型,就可以看到他会自动查找到上一层的构造器属性。最终是要指向Ojbect的。
对于js内置对象来说,由于它们的原型是只读的,用户无法修改,所以可以使用constructor属性来判断内置对象的数据类型。
ToString ()、valueOf()方法。
hasOwnProperty 用来检测一个对象的属性是继承属性,还是私有属性。但是注意:如果是一个对象的继承属性则会返回false,但是对于这个对象的原型对象来说则会返回true
isPrototypeOf:判断一个对象的原形对象。函数的原型对象可以是Object.prototype,或者Function.prototype。
Global对象。是抽象类。JavaScript规定所有的对象和函数都不能独立存在,换句话说,所有的函数都必须是某个对象的方法, 所有的对象都必须是某个类的子类。
这就是全局对象,虽然是全局对象,但是global却没有方法调用全局的变量和方法。 这些方法却可以自己直接执行。
所以global有点像名誉zhuxi。没有实际的操控权利。
Date对象:
//获取本地系统的当前时间。
var now = new Date();
alert(now); //返回当前时间对象,如"Wed Apr 29 15 :37: 55 UTC +0800 2009 "
//通过多选参数来创建指定的时间对象。此时,构造函数Date()的参数格式如下:
new Date(year, month, day, hours, minutes, seconds, ms)
//除了前两个参数外(年和月)外,其他所有参数都是可选的,其中月数参数从0开始,如0表示第1个月,11表示第12个月。
var d1 = new Date(2009,4,1);
alert(d1); //返回时间对象,如"Fri May 1 00: 00:00 UTC+ 0800 2009"
var d2 = new Date(2009,4,1,5,30,30);
alert(d2); //返回时间对象,如"Fri May 1 00: 00:00 UTC+ 0800 2009"
//通过一个时间格式的字符串来创建指定的时间对象。此时,月份是从1开始,而不是从0开始。
var d1 = new Date("2009/4/1 5:30:30");
alert(d1); //返回时间对象,如"Wed Apr 1 05 :30: 30 UTC +0800 2009"
//通过传递一个毫秒数来创建指定的时间对象。这个毫秒数是距离1970年1月1日午夜(GMT时间)的毫秒数。
var d1 = new Date(1000000000000);
alert(d1); //返回时间对象,如"Sun Sep 9 09 :46 :40 UTC +0800 2001"
第九章 数组
数组的定义有两种方法:
1.使用new关键字,传入参数。
2.使用数组直接量,在中括号中添加元素。
建议使用第二种方法因为效率高一些。
Js的数组的长度可以任意伸缩,可以存储任意类型的数据内容。数组的下标可以不连续。Js在初始化数组时,只有真正存储在数组中的元素才能够被分配到内存中。
数组中的元素可以自由定义,例如如果只定义1和100则在内存中实际额只存在这两个元素。
所以在JavaScript中数组是否按顺序并不是那么重要。
Array.length返回的不是数组存储值的实际个数,而是当前数组的最大元素的个数。
数组和对象的一个区别就是:数组使用的是下标和具体的值相关联,而对象中则使用的是特定的字符串。
交换两个变量
var a = 10, b = 20; //变量初始化
//var temp = a; //定义临时变量存储a
//a = b; //把b的值赋值给a
//b = temp; //把临时变量的值赋值给b
a = [b, b = a ][0]; //通过数组快速交换数据
定义数组的基本方法:
第一步: 定义函数名,通过一个或表达式首先判断如果存在则直接使用如果不存在则定义。
第二步: 将第一的函数名付给Object,
Array.prototype._sum = Array.prototype.sum || //检测是否存在同名方法
( Array.prototype.sum = function(){ //定义该方法
var _n = 0; //临时汇总变量
for(var i in this){ //遍历当前数组对象
if( this[i] = parseFloat( this[i] ) ) _n += this[i]; //如果数组元素是数字,则进行累加
};
return _n; //返回累加的和
});
Object.prototype.sum = Array.prototype._sum //把数组临时原型方法赋值给对象的原型方法sum()
var a = [1, 2, 3, 4, 5, 6, 7, 8, "9"]; //定义数组直接量
alert( a.sum() ); //返回45
第十章字符串
Js解释器采用了引用的方法实现对字符串的操作。字符串数据被存储到堆,然后把字符串的引用地址存储在字符串变量中。同时为了避免错误操作,js解释器强制约定字符串在堆存储的数据是不可变的。相当于设置字符串在堆区存储的数据是只读的。
js对字符串的复制,传递操作,仅是简单的采用引用的方法,操作对象为堆区字符串的地址,即复制和传递地址。但是一旦编辑字符串本身的值,则js就会把堆区的字符串读取到棧区进行独立操作。
字符串的比较是逐字节比较的。先把两个变量的字符串读取到栈区,然后逐字节比较,最后返回比较结果。
字符串的操作是结合了值操作和引用操作的。当申明一个字符串时会把它的真实值存放在堆区,并且设定了堆区的内容是不可改变的,而在栈去存放堆区的地址。所以当进行复制和传递操作时只是进行了地址的传递,但是一旦要对字符串进行修改时则会复制一份放到栈区。实际是对栈区的内容进行改变,所以操作之后我们需要将这个值再次赋给引用,否则它会只是存放在栈区里,等待垃圾回收。
对于字符串类型的语句或表达式,可以使用静态方法eval()来执行。
var s = "alert('love')";
eval(s);
var s = new String(); //创建一个空字符串对象,并赋值给变量s.object类型。
var s = String( 123456 ); //包装字符串。String类型。
var s = String( 1, 2, 3, 4, 5, 6 ); //带有多个参数,只处理第一个参数并把它转换为字符串返回。
fromCharCode可以包含n个参数,参数代表字符的unicode编码。返回对应编码的字符的新字符串。
var a = [35835, 32773, 24744, 22909], b = [];//声明一个字符编码的数组
for( var i in a ){ //遍历数组
b.push( String.fromCharCode( a[i] ) ); //把每个字符编码都转换为字符串
}
alert( b ); //返回字符串"读,者,您,好"
alert( b.join( "" ) ); //返回字符串"读者您好"
第12章 BOM
BOM:浏览器对象模型。Browser Object Model
Bom对象包括:window,navigator,screen,history,location,document.
Window代表根节点,其它对象是window的属性。它是全局作用域
Window对象定义的3个人机交互方法:alert,confirm,prompt。
var url = "http://www.css8.cn/";
var features = "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no";
document.write('<a href="http://www.baidu.com/" target="newW" >切换到百度首页</a>');
var me = window.open (url, "newW", features);
setTimeout(function(){
me.close();
},30000);
使用write 方法时会覆盖掉前一个的内容。
Location.search 捕获url查询字符串信息。
第十三章 DOM
window.onload = function(){
var tag = document.getElementsByTagName("ul")[0];
var a = tag.childNodes;//获取列表结果所包含的所有列表节点
alert(a[0].nodeName);//显示第一个列表项的节点名称
node.childNodes[0] = node.firstChild
node.childNodes[node.childNodes.length-1] = node.lastChild
}
</script>
<ul>
<li>D表示文档,DOM的物质基础</li>
<li>O表示对象,DOM的思想基础</li>
<li>M表示模型,DOM的方法基础</li>
</ul>
DOM把元素之间的空格也当成文本节点。这在XML中是一样的。XML解析也是如此。
NodeType=1表示的是元素节点。
innerHTML返回元素包含的html信息内容。
第十四章 事件驱动模型
个人认为类似于as的事件机制。有父子元素冒泡和捕获的概念。
document.write('<script type="text/javascript">'); 写的js命令,必须放在<script></script>中。
4种事件处理模型:
1、0级 基本事件模型
2、标准事件模型
3、IE事件模型
4、Nerscape4事件模型
JS不支持多线程。支持异步回调。类似于as的回调函数。一旦异步执行完,根据执行返回条件执行对应的回调函数。
Js的事件流机制:捕获型和冒泡型。三个阶段:捕获阶段、目标阶段、冒泡阶段。
从IE6开始,html元素可以接受事件流。而这之前的版本是不行的。MOZILLA支持window对象。
<script language="javascript" type="text/javascript">
function f(a){
alert(a);//p点击时,FIREFOX的顺序是P,HTML,BODY。IE的顺序是P,BODY,HTML。
}
</script>
<html onclick="f('HTML')">
<body onclick="f('BODY')" bgcolor="#333333">
<p onClick="f('P')">冒泡型事件</p>
</body>
</html>
DOM2.0支持冒泡型事件流和捕获型事件流。但是规定捕获型事件流先进行响应。默认情况下,事件采用冒泡事件流,不采用捕获事件流。在firefox可以显示设置是否使用捕获型事件流。
一般来说事件处理函数都会有返回值,如果我们设置返回值为false就可以禁止它的默认行为。例如阻止超链接,阻止表单提交数据。
Event.srcElement。表示当前事件的源。利用该属性可以捕获当前对象。但是DOM2不支持该属性。在firefox浏览器要使用event.target。
alert(event.srcElement);//firefox:undefined,IE: object.firefox和 DOM2不支持srcElement属性
<button id="btn">按 钮</button>
<script language="javascript" type="text/javascript">
document.getElementById("btn").onclick = function(event){
event = event || window.event; //兼容FF和IE浏览器的event参数模式
var src = event.srcElement || event.target; //捕获当前事件的对象句柄
alert(src.innerHTML); //显示当前对象所包含的HTML文本信息
}
</script>
This对象
通常情况下this等于事件源对象。
<!--
通常情况下this等于事件源对象。
-->
<button id="btn" onClick="this.style.background='red';">按 钮</button>
<script language="javascript" type="text/javascript">
function btn1(){
this.style.background = "red"; //并非指向当前事件的目标对象.this指向window对象.
}
function btn2(event){
event = event || window.event;
var src = event.srcElement ? event.srcElement : event.target;
src.style.background = "red"; //指向当前事件的目标对象
}
</script>
<button onClick="btn1();">按 钮 1</button>
<button onClick="btn2(event);">按 钮 2</button>
再看个例子
<button id="btn1">按 钮 1</button>
<button id="btn2">按 钮 2</button>
<script language="javascript" type="text/javascript">
var b1 = document.getElementsByTagName("button")[0];
var b2 = document.getElementsByTagName("button")[1];
b1.f = function(){
this.style.background = "red"; //并非指向按钮1 按钮1 点击指向的是window,按钮2点击指向的是btn2.
}
b2.onclick = b1.f;
</script>
b2.onclick = function(){
b1.f(); //指向按钮1
}
这是因为函数的作用域造成的。
Js的函数总是运行在词法作用域中,即函数总是在定义它们的作用域中运行,而不在调用它们的作用域中运行。
元素的事件处理函数的作用域是独立的作用域,与局部作用域不同。
Js在引用变量值时,会根据作用域从内到外,从下到上检索,作用域顶部是window对象。但是对于html元素的属性的事件处理函数,它的作用域顶部是元素目标调用对象。
addEventListener()和removeEventListener()。在事件处理函数内部,this总是指向当前元素。
IE 7不支持DOM的addEventListener方法。
<p id="p">IE事件注册</p>
<script language="javascript" type="text/javascript">
/*
注销函数是不能够使用匿名函数,应为这样无法真正的删除这个绑定的函数。Firefox会把绑定和注销的两个结构相同的匿名函数视为不同函数。
*/
var p = document.getElementById("p");
p.attachEvent("onclick", f);
p.detachEvent("onclick", f);
function f(){
alert("p");
}
</script>
addEventListener()和removeEventListener()的第三个参数是否捕获,必须一致。
var event = event || window.event; //标准化事件对象 如果存在event则使用event,不存在则使用window.event
loading事件机制
<body onLoad="f1()">
<script language="javascript" type="text/javascript">
window.onload = f2;
function f1(){
alert('<body onload="f1()">');
}
function f2(){
alert('window.onload = f2;');
}
</script>
如果同时使用两种方式定义load事件类型,会使用window对象注册的事件处理函数覆盖掉body元素定义的页面初始化事件属性。
window.onload = f1;
window.onload = f2;
以上写法f1会被f2覆盖掉。
window.addEventListener("load",f1,false); //为load添加事件处理函数
window.addEventListener("load",f2,false); //为load添加事件处理函数
这些写法就不会覆盖。两个监听都会执行。
DOMContentLoaded事件类型。
Load事件需要等到所有图像全部载入完成之后才会被触发。而DOMContentLoaded事件会在页面结构加载完毕后就能执行。先于load事件。IE7 不支持。
Onunload 和Beforeunload事件类型。关闭窗口之前的事件处理函数。
第十五章 样式
IE不支持DOM定义的style方法。
DOM的style定义方法
var box = document.getElementById("box");
box.style.setProperty("width","400px","");//第三个参数 priority表示是否为属性设置!important优先级命令。
IE的style定义方法
Box.style.width = “400px”;
看下面的例子:
<style type="text/css">
#box {
width:100px;
height:100px;
border:solid 50px blue;
}
</style>
<div id="box"></div>
<script language="javascript" type="text/javascript">
var box = document.getElementById("box");
alert(box.style.border);//返回空值。使用style样式无法访问样式表中的样式属性。css样式信息并非存储在 style属性中,而是存储在css 类中。
</script>
和
<div id="box" style="width:100px; height:100px; border:solid 50px blue;"></div>
<script language="javascript" type="text/javascript">
var box = document.getElementById("box");
alert(box.getAttribute("style"));
</script>
要访问css类。可以使用document.styleSheet集合来实现。该集合包包含了文档中所有样式表的引用。如style 的link和import的外部样式表。和定义在本文档中的style样式。
DOM提供了cssRules集合,用来包含指定样式表中所有的样式。IE不支持。
<script language="javascript" type="text/javascript">
var cssRules = document.styleSheets[0].cssRules || document.styleSheets[0].rules;//判断浏览器的类型,是否支持cssRules。
alert(cssRules[0].style.border); //调用cssRules集合中的border属性
</script>
CssRules或rules集合的style对象在调用css属性时,使用的是js样式属性,不能够使用连字符,如cssRules[0].style.backgroundColor 不行,而必须使用cssRules[0].style.background-Color
如果同时存在css外部样式表,又存在定义在文档中的样式属性。按照它们的位置排列styleSheets数组的索引位置。
<link href="out.css" rel="stylesheet" type="text/css" media="all" />//styleSheets[0]
//styleSheets[1]
<style type="text/css">
#box { color:green; }
.red { color:red; }
.blue { color:blue; }
</style>
每个css规则都包含有selectorText属性,获取指定样式的选择符。在IE中大写显示,Firefox小写显示。
alert(cssRules[2].selectorText);
alert(cssRules[2].style.color);
动态添加样式insertRule和addRule
IE中支持addRule。FireFox支持insertRule
if(styleSheets.insertRule){ //判断浏览器是否支持insertRule()方法
//使用insertRule()方法在文档内部样式表中增加一个p标签选择符的样式,设置段落背景色为红色,字体颜色为白色,补白为一个字体大小。插入位置在样式表的末尾,
styleSheets.insertRule("p{color:#fff;padding:1em;}", index);
}else{ //如果哦浏览器不支持insertRule()方法
styleSheets.addRule("P", "color:#fff;padding:1em;", index);
}
addRule的Index表示样式插入的位置。默认是-1,表示在样式表末尾。
insertRule的Index表示样式插入的位置。默认是0,表示在样式表末尾。必须设置。
访问最终样式
IE: currentStyle对象,包含了所有元素的style对象定义的属性和任何未被覆盖的css规则的style属性。只有IE 支持。
alert("背 景 色:"+p.currentStyle.backgroundColor+"\n字体颜色:"+p.currentStyle.color);
DOM提供了getComputedStyle()方法。该方法需要在document.defaultView对象中访问。
var p = document.getElementsByTagName("p")[0];
alert("背 景 色:"+document.defaultView.getComputedStyle(p,null).backgroundColor+"\n字体颜色:"+document.defaultView.getComputedStyle(p,null).color);
offsetWidth表示元素在页面中的总宽度。
offsetHeight表示元素在页面中的总高度。
但是当为元素或者它的父元素定义了display:none,则offsetWidth和 offsetHeight都为0。
不同浏览器下获取style
function getStyle(e, n)
{
if(e.style[n])
{
return e.style[n];
}
else if(e.currentStyle)
{
return e.currentStyle[n];
}
else if(document.defaultView && document.defaultView.getComputedStyle)
{
n = n.replace(/([A-Z])/g, "-$1");
n = n.toLowerCase();
var s = document.defaultView.getComputedStyle(e, null);
if(s) return s.getPropertyValue(n);
}
else
return null;
}
显示和隐藏元素
css支持两种:visibility和display。
Visibility: 会保持元素在文档流中的影响力,隐藏后元素的位置保持不变。属性包括visible和hidden。
Display: 为none时,文档的结构会发生变化。被隐藏的元素及其子元素就被删除了。该元素不再占据文档位置。后面的元素会上移占据被删除的元素的位置。
透明度 :e.style.opacity = n / 100;
动画:
var out = setInterval(f, 1000); //定义周期性执行的函数.
clearTimeout(out); //则清除周期性调用函数
setTimeout();//只能被执行一次。如果要循环执行,采用以下嵌套的方式。
var t = document.getElementsByTagName("input")[0];
var i = 1;
function f(){
var out = setTimeout( //定义延迟执行的方法
function(){ //延迟执行函数
t.value = i ++ ; //递加数字
f(); //调用包含setTimeout()方法的函数
}, 1000); //设置每秒执行一次调用
if(i > 10){ //如果超过10次,则清除执行,并弹出提示信息
clearTimeout(out);
alert("10秒钟已到");
}
}
f(); //调用函数
第十六章 COOKIE
有效期 expires属性
可见性 path domain属性
安全性 secure属性
以上都是cookie属性,而不是js属性。
Name:唯一的。不区分大小写。
Value:cookie信息。不超过4KB
Domain:
Path: 有效访问路径。Path=/。表示cookie信息将会与服务器根目录下所有网页相关联
Expires:失效日期
Secure:boolean。True表示安全方式传递。
Cookie字符串是一对名值对。
Cookie的封装:
function cookie(name, value, options)
{
if (typeof value != 'undefined')
{
options = options ||
{
}
;
if (value === null)
{
value = '';
options.expires = - 1;
}
var expires = '';
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString))
{
var date;
if (typeof options.expires == 'number')
{
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
}
else
{
date = options.expires;
}
expires = '; expires=' + date.toUTCString();
}
var path = options.path ? '; path=' + options.path : '';
var domain = options.domain ? '; domain=' + options.domain : '';
var secure = options.secure ? '; secure' : '';
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
}
else
{
var cookieValue = null;
if (document.cookie && document.cookie != '')
{
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i ++ )
{
var cookie = (cookies[i] || "").replace( /^\s+|\s+$/g, "" );
if (cookie.substring(0, name.length + 1) == (name + '='))
{
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
}
第十七章 xml和json
XML :区分元素节点和文本节点。属性节点。
推荐使用JSON。
Json的数据结构基于对象和数组来构建。
对象:名值对。{“string1”:”value1”, “string2”:”value2”}
数组:
第十八章AJAX
注意 :客户端和服务器端的编码要一致。
JSON 异步通信协议 XMLHttpRequest 是 ajax异步交互的核心插件。和frame只能在同域中通信。
JSONP : JSON with Padding。能够通过在当前文档中生成脚本标记(script),来调用垮域脚本时使用的约定。
JSONP格式的数据就是把JSON数据作为参数传递给callback并传回。
ActiveXObject
XMLHRttpRequest。
encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。
第十九章 OOP
Object,Function,Array,是内置的类。但是并不应该称为构造函数。我们在实例化的时候,会实例类的构造函数,但是类并不等于构造函数。
构造函数没有返回值,但是在js中构造函书可以返回一个对象值。构造函书内部并没有创造对象,而是使用this代替。This是新创建对象的引用指针。
原型模式
当在构造函书中定义prototype属性后,任何实例化的对象都拥有prototype属性所定义的属性。而实例化的对象不能通过prototype属性定义原型。
Js的内置对象都是构造函数结构体,因此都拥有prototype属性。
Prototype属性也是一个引用对象的指针,它值向一个隐形的对象,该对象存储着构造函书所有的原型属性。相当于基因库。一旦某个对象的属性被改动,则所有其他实例对象的属性也会变化。
构造函数属性和原型属性混合模式是ECMAScript的推荐标准。
function Book(title,pages){
this.title = title;
this.pages = pages;
Book.prototype.what = function(){
alert(this.title +this.pages);
};
}
动态原型模式
function Book(title,pages){
this.title = title;
this.pages = pages;
if(typeof Book.isLock == "undefined"){
Book.prototype.what = function(){
alert(this.title +this.pages);
};
Book.isLock = true;
}
}
修改原型属性,所有实例的原型值都会发生改变。
这章太复杂拉。可以单独写一本书出来了。
第20章
函数是第一型。表示。