javascript心得Word文档格式.docx
《javascript心得Word文档格式.docx》由会员分享,可在线阅读,更多相关《javascript心得Word文档格式.docx(36页珍藏版)》请在冰点文库上搜索。
另外,定义一个容器的class,使用setAttribute('
className'
)而不是setAttribute('
class'
),同样是因为IE不支持。
4.关于max-width属性,IE6及其以下的版本不支持max-width,一下为替代方法:
<
!
--[ifltIE7]>
styletype="
text/css"
media="
screen"
>
pimg{width:
expression(this.width>
450?
"
100%"
:
true);
/style>
[endif]-->
--[ifIE]-->
5.关于firefox3.5的img标签onerror事件:
firefox3.5对于img标签中src为空的情况不会触发onerror事件(IE,firefox2,3均可以),只好把src设一个不存在的地址,就可以触发了。
以下均出自《javascript权威指南》第四版
6.javascript中如果语句分别放置在不同的行,就可以省去分号(所以某一行没有加分号,也不报错)
7.javascript中的变量命名,第一个字符必须是字母、下划线或美元符号,接下来跌字符可以是字母、数字或下划线、美元符号,数字不允许作为首字符出现。
8.javascript中的对象可以作为关联数组使用。
因为它们能够将任意的数据值和任意的字符串关联起来例如:
img.length=img[‘length’]。
9.虽然undefined和null值不同,但是==运算符却将两者看作相等,如果必须区分,可以使用===或typeof。
10.使用var多次声明同一个变量不仅是合法的,而且也不会造成任何错误。
11.隐式声明(未声明直接赋值)的变量总是被创建为全局变量,即使该变量只在一个函数体内使用。
12.没有块级作用域,函数中声明的所有变量,无论是在哪里声明的,在整个函数中他们都是有定义的:
varscope=“global”;
functionf(){
alert(scope);
//显示”undefined”,而不是”global”
varscope=“local”;
alert(scope);
//显示”local”
}
13.基本类型:
数值,布尔值,null,未定义的值(undefined)-固定大小
引用类型:
对象,数组,函数–不固定大小
14.在Javascript中,由于所有的数字都是浮点型的,所以除法的结果也都是浮点型;
15.如果函数不包含return语句,他就只执行函数体中的每条语句后返回给调用者Undefined;
16.如果传递的参数比函数需要的个数多,多余的值会被忽略掉,如果少,则会被赋予undefined;
17.在一个函数体内,标识符arguments具有特殊含义,是调用对象的一个特殊属性,它类似数组(实际上是Arguments对象),能够按照数字获取传递给函数的参数值,arguments[]允许存取函数参数,arguments.length表示参数个数;
18.除了数组元素,Arguments对象还定义了callee属性,用来引用当前正在执行的函数,这对未命名的函数调用自身非常有用:
function(x){
if(x<
=1)return1;
returnx*arguments.callee(x-1);
第八章对象>
19.for/in循环枚举对象属性:
functionDisplayPropertyNames(obj){
varnames=””;
for(varnameinobj)
names+=name+”\n”;
alert(names);
20.关于原型对象(prototype):
javascript的对象都继承原型对象的属性,每个对象都有原型对象,继承实在查询一个属性值时自动发生的,例如在读对象o的属性p时,首先检查o是否具有一个名为p的属性,则再检查o的原型对象是否具有这个属性;
由于一个原型对象能够被多个对象继承(类似类成员,静态成员),因此存在着读写不对称性(有可能读到的是原型的属性,写的却是对象自身的属性);
21.toString()方法的目的是每个对象类都有自己特定的字符串表示,所以应该定义一个合适的toString()方法将对象转换成相应的字符串形式:
Obj.prototype.toString=function(){…}
第九章数组>
22.在javascript中,数据第一个元素的下标是0。
23.在javascript中,数组是稀疏的,数组的下标不会落在一个连续的数字范围内,只有那些真正存储在数组中的元素才能够分配的内存。
如a[0]=1;
a[1000]=1;
javascript解释器只给数组下标为0和1000的元素分配内存,但是如果用a.length取数组的长度,那么长度是1001而不是2.
24.通过设置数组的length属性来阶段数组是唯一一种缩短数组长度的方法。
25.Array.slice(from,end)返回数组从from开始的元素到end的前一个元素,即从array[from]到array[end-1]。
26.unshift()和shift()和push()与pop()相似,只不过都是在数组的头操作,即在数组的第一个元素处操作,由于在操作的同时需要移动数组元素的位置,不知道效率是不是比push()和pop()低。
第十章使用正则表达式的模式匹配>
27.重复字符可以匹配尽可能多的字符,而且允许接下来的正则表达式继续匹配,因此我们说重复是“贪婪的”。
可以以非贪婪方式进行重复,只需要在重复字符后加问号即可。
例如,正则表达式/a+/匹配一个或多个字符a,应用在“aaa”上时,匹配三个字母,但是/a+?
/只匹配一个或多个必要的字母a,因此只匹配“a”。
28.关于模式g,对于RegExp对象,当一个具有g标志的正则表达式调用exec()时,他将把该对象的lastIndex属性设置到紧接着匹配子串的字符位置。
当同一个RegExp对象第二次调用exec()时,它将从lastIndex属性所指示的字符处开始检索。
如果exec()没有发现任何匹配,它会将lastIndex属性重置为0。
第十一章JavaScript的更多主题>
29.运算符+,<
,<
=,>
,>
=即能用于数字,又能做作用于字符串,当这些运算符用于对象时,大多数情况下,javascript会先尝试调用对象的valueOf()方法对他进行转换,如果该方法返回了原始值,就使用那个值,但是valueOf()通常返回的都是未被转换的对象,在这种情况下,Javascript将调用对象的toString()方法对他进行转换。
30.要把一个值转换成字符串,可以把它连接到一个空串上:
varx_as_string=x+“”;
要把一个值强制转换成数字,就用它减0:
varx_as_number=x–0;
要把一个值强制转换成布尔值,需要连用两次”!
”运算符:
varx_as_boolean=!
x;
31.Number对象的toString(x)方法可以将数字转换成x进制。
第十二章客户端JavaScript>
第十三章Web浏览器中的Javascript>
32.如果编写了一个并不产生任何文档输出的脚本,可以使用<
script>
标签中的defer属性来提示浏览器这样做是安全的:
继续解析HTML文档并延迟脚本的执行,直到遇到一个无法延迟的脚本。
33.关于<
/script>
标记,浏览器不会理解javascript代码,因此要在javascript里写<
时,要么拆分字符串,要么做转义:
document.write(“<
/”+”script>
”);
\/script>
34.关于onload:
当注册了多个onload句柄的时候,浏览器调用所有的句柄,但是,调用他们的顺序并不能保证;
由于onload时间在文档完全解析之后调用,他们不能调用document.write,如果调用的话则会重新打开一个文档并且覆盖掉当前的文档,而不是在当前文档后面添加内容;
35.关于onunload:
窗口关闭时会调用(刷新时也会调用)
第14章脚本化浏览器窗口>
36.关于location对象:
location.href:
url
location.protocol:
协议(:
前的部分,比如http,file等等)
location.host:
主机名
location.pathname:
主机名后,参数前
location.search:
get参数
37.setTimeout和clearTimeout,使用setTimeout返回值作为clearTimeout的参数,可以使setTimeout失效
38.URL解码:
decodeURIComponent
URL编码:
encodeURIComponent
39.书上提到“不要混淆Window对象的location属性和Document对象的location属性,前者引用一个Locatioin对象,而后者只是一个只读字符串,并不具有Location对象的任何特性。
但是alert(window.location===document.location);
结果是true,不知道为什么……
似乎document.location也是一个对象!
40.关于坐标:
outerWidth:
浏览器窗口的宽度
outerHeight:
浏览器窗口的高度
screenX:
浏览器窗口相对于桌面的横坐标距离
screenY:
浏览器窗口相对于桌面的纵坐标距离
innerWidth:
HTML文档的宽度
innerHeight:
HTML文档的高度
pageXOffset:
滚动条的横坐标
pageYOffset:
滚动条的纵坐标
41.关于访问变量:
在做测试的时候发现,js遇到“xxxisnotundefined“错误时会停止脚本的运行,但是如果加上一个window对象,以访问window对象的属性时就不会出现一个脚本错误停止运行,只是返回一个”undefined”对象。
42.关于Navigator对象的属性:
appName:
浏览器的简单名称
appVersion:
浏览器的版本号和(或)其他版本信息
userAgent:
浏览器在他的USER-AGENTHTTP头部发送的字符串,一般包含appName和appVersion中的所有信息
appcodeName:
浏览器的代码名,Netscape用代码名“Mozilla“作为这一属性的值,为了兼容,IE也采用这种方式
platform:
运行浏览器的代码名
43.遍历一个对象属性的方法(以遍历Navigator方法为例):
for(varpropnameinnavigator){
browser+=propname+"
:
"
+navigator[propname]+"
\n"
;
44.打开一个新窗口,关闭,检测是否关闭:
varw=window.open("
test"
widht=400,height=350,status=yes,resizable=yes"
true);
//打开新窗口
w.close();
//关闭
alert(w.closed);
//检测是否关闭,关闭返回true,否则返回false
《第15章脚本化文档》
45.如果两个DOM具有相同的name属性,那么document.somename就变成保存了这两个元素引用的一个数组。
46.HTML不区分大小写,例如onMouseover
47.DOM树结构表现为不同种类的Node对象的一棵树,Node接口订了一遍历和操作树的属性和方法。
Node对象的childNodes属性返回节点的孩子的一个列表,并且firstChild,lastChild,nextSibling,previousSibling和parentNode属性提供了遍历节点的树的一种方法。
像appendChild(),removeChild(),replaceChild()和insertBefore()这样的方法能够向一个文档树中添加节点或者从一个文档树中移除节点。
48.常见的节点类型:
接口nodeType常量nodeType值
Element(html,i)NODE.ELEMENT_NODE1
Text(文本串)NODE.TEXT_NODE3
Document(dom树根)NODE.DOCUMENT_NODE9
CommentNODE.COMMENT_NODE8
DocumentFragmentNODE.DOCUMENT_FRAGMENT_NODE11
AttrNODE.ATTRIBUTE_NODE2
49.用Element接口的getAttribute()方法、setAttribute()方法和removeAttribute()方法可以查询,设置并删除一个元素的属性。
50.dom属性class对应javascript中的className。
《第16章层叠样式表和动态HTML》
51.关于position:
static:
根据文档内容定位
absolute:
绝对定位,相对于<
body>
标记定位
fixed:
总是可见,不随文档其余的元素滚动(IE6不支持)
relative:
根据上层元素定位
52.关于visibility和display,如果visibility设置了hidden,会为该元素预留大小,但是display不会。
53.关于padding和margin:
以前一直不知道这两个有什么区别,设置了一下border才明白……padding是相对于border的“内边距”,margin是border相对于父元素的“外边距”
《16.3脚本化内联工具》
54.Javascript中的CSS属性,css样式属性的名字中有连字符,对应javascript中会被误解为减号,因此一般改为连字符,且原来紧接在连字符后的字母改写为大写
《第17章事件和事件处理》
55.javascript事件模型:
原始事件模型(DOM0):
用HTML属性设置事件处理代码,如onclick。
事件是浏览器内部提取的,,javascript代码不能直接操作事件。
标准事件模型(DOM2):
使用addEventListener()方法为时间注册句柄
IE事件模型:
中间模型,介于原始事件模型和标准事件模型之间。
56.当事件句柄被调用时,它是作为产生事件的元素的方法调用的,所以关键字this引用了那个目标元素。
57.javascript事件传播:
事件传播分三个阶段进行,第一,在捕捉(capture)阶段,事件从Document对象沿着文档树下下传播给目标节点。
如果目标的任何一个祖先专门注册了捕捉事件句柄,那么在事件传播的过程中,就会运行这些句柄;
事件传播的下一个阶段发生在目标节点本身,直接注册在目标上的适合的事件句柄将运行;
事件传播的第三个阶段是起泡(bubbling)阶段,在这个阶段,时间将从目标元素向上传播回或起泡回Document对象的文档层次。
58.addEventListener(event,handle,capture_boolean)其中第三个参数表示是否要在事件捕捉的阶段触发,我的理解一般是在起泡的过程触发事件,如果设置为true,有可能父节点的事件先触发,如果调用两次该函数,分别设置为true和false,则事件会调用两次(捕捉阶段和冒泡阶段均会触发)
59.所有知名的实现都是用addEventListener()来调用句柄注册,就好像他们是目标元素的方法一样,也就是说,this关键字所引用的对象正是在其上注册了这个句柄的对象。
如果不希望依赖于这种不确定的行为,可以使用传递给句柄的Event对象的属性currentTarget。
59.Event接口定义了两个方法:
stopPropagation()和preventDefault(),preventDefault()方法组织浏览器执行与事件相关的默认动作。
60.IE的Event对象并不是作为函数参数,而是作为Window对象的属性,IE模型支持起泡形式的事件传播,但不支持DOM模型的捕捉形式的事件传播。
61.attachEvent(event,handle):
传递给IE方法的时间句柄名字前应当有个“on“,关键字this引用的是Window对象,允许同一事件句柄函数注册多次,当指定类型的一个事件发生时,注册函数被调用的次数和他被注册的次数一样多。
《17.4鼠标事件》
62.按键事件:
有3中按键事件,分别是keydown、keypress和keyup,他们分别对应onkeydown、onkeypress和onkeyup这几个事件句柄,一个典型的按键会产生所有这3种事件,义次是keydown、keypress,然后是按键释放时候的keyup。
如果一个按键被按下并自动重复,可能是在keydown和keyup之间有多个keypress事件,但是这和操作系统击浏览器相关,而不能想当然。
63.按键事件中的键盘码:
firefox定义了两个属性,keycode存储了一个按键的较低层次的虚拟按键码,并且和keydown事件一起发送,charcode存储了按下一个键时所产生的可打印的字符的编码,并且和keypress事件一起发送。
在IE中,只有一个keycode属性,并且它的解释也取决于时间的类型,对于keydown事件来说,keycode是一个虚拟按键码,对于keypress事件来说,keycode是一个字符码。
64.调用表单的submit()方法不会触发onsubmit事件。
65.可以用<
button>
标记代替传统的<
input>
标记创建包括Submit和Reset在内的按钮,<
标记更灵活一些,因为他不显示由value属性指定的纯文本,而是现实出现在<
和<
/button>
之间的html内容。
第19章cookie和客户端持久性>
66.cookie值不能含有分号、逗号或空白符,因此需要使用核心javascript的全局函数encodeURIComponent()把值存入cookie之前对他编码。
67.发现一个有意思的函数:
prompt(‘pleasfilltheblank’,’’);
可以出来一个对话框,填写内容,这个函数的返回值就是填写的内容;
第一个参数表示提示语,第二个参数为默认输入框中的内容。
《javascript权威指南》到此结束
=======================================================================
68.关于javascript的回调函数顺序
今天使用getjson函数,遇到一个郁闷的问题,下面是一个简单的示例
functionaa(){
varv;
$.getJSON(url,function(json){
v=json.name;
//alert(‘afterajax:
‘+v);
1
});
//alert(‘beforereturn:
“+v);
2
returnv;
varu=aa();
alert(‘afterreturn:
‘+u);
3
在ff3.5下执行顺序是:
1,2,3(大部分情况下)或者2,3,1
在IE下执行顺序必然是:
2,3,1
最后问了陈sir,才明白是怎么回事,javascript的回调函数执行顺序与函数外层执行顺序是不确定的,也就是说有可能回调函数还没执行,就已经return了,尤其是IE比较明显,因此如果要对回调函数的数据进行处理,那一定要把全部工作都在回调函数里进行,而不要把回调函数的结果再传给别的函数进行处理,否则会出现意想不到的结果。
69.阻止事件冒泡
function
stopBubble(e)
{
if
(e
&
e.stopPropagation)
e.stopPropagation()
else
window.event.cancelBubble=true
《javascript高级程序设计》第2版
70.<
标签中language属性已废弃,大多数浏览器会忽略这个标签。
71.如果是在xhtml中,可以省略<
标签。
72.在代码中使用保留字作为标识符在大多数浏览器中都会导致“IdentifierExpected”(缺少标识符)的错误。
73.直接使用未定义的变量会导致一个错误,但是可以使用typeof返回undefined。
74.使用typeof检测null会返回object。
75.undefined值是派生自null值的,因此他们的相等性测试返回true。
《3.5操作符》
76.无符号右移操作符由3个大于号(>
)表示。
77.对于加法操作符,如果有一个操作数是字符串,则将另一个操作数转换为字符串,然后将两个字符串拼接起来:
varresult=5+‘5’;
//result=‘55’;
78.with:
with语句的作用是将代码的作用域设置到一个特定的对象中:
va