1,document.getElementById方法只能獲取到一個對象,即使有多個同名的對象,也只取第一個具有該名稱的對象,例如在一個form(名稱為myform)中,有三個id="mycheckbox"的復(fù)選框,那么使用document.getElementById("mycheckbox"),返回的是第一個checkbox對象,而不是返回一個數(shù)組,如果使用document.myform.mycheckbox則返回一個數(shù)組。
2,使用showModalDialog打開一個頁面,則在這個頁面中,對于任何鏈接和任何表單提交,都會在新的窗口中執(zhí)行,即使你在鏈接或form中指定了target="_self"也是沒有用的。例如使用showModalDialog打開一個test.html,在該頁面有一段代碼
<a href="test2.html" target="_seft">打開</a>
如果點(diǎn)擊該鏈接,那么將會在新窗口中打開test2.html,至少在ie中是這樣的,那么是不是就沒有辦法解決了呢?不是的,我們可以通過在彈出的頁面的head中加入下面的代碼來解決這個問題:
<head>
<base target="_self">
</head>
3,在一個頁面含有某個iframe,其id="myframe" name="myframe",此時使用document.getElementById("myframe")取到的是iframe標(biāo)簽對象,通過該對象可以獲取iframe的各個屬性,例如src、frameborder、style等等,但是不能獲取到iframe所包含的子頁面的各個對象。如果使用document.frames("myframe")取到的是iframe組件對象,通過該對象可以獲取到iframe所包含的頁面的子頁面的各個對象,例如子頁面的window對象,但是不能獲得iframe標(biāo)簽得各個屬性,例如上面說到的src等等。請參看如下類似代碼:
1.html
<script>
function check(){
var obj1=document.getElementById("myframe");
alert(obj1.src);
//alert(obj1.window.document.myform.username.value);//Error
var obj2=document.frames("myframe");
alert(obj2.window.document.myform.username.value);
//alert(obj2.src);//Error
}
</script>
<body onload="check()">
<iframe id="myframe" name="myframe" src="2.html" frameborder="3" style="width:300;height:200;border-width:1;border-color:red;border-style:solid"></iframe>
</body>
2.html
<body>
<form name="myform">
用戶名:<input type="text" name="username" value="test" />
</form>
</body>
4,在table中,如果在table中加入border="1" bordercolor="red",那么table中所有單元格都會加上厚度為1的紅色邊框,但是如果在table中加入css style="border-width:1;border-color:red;border-style:solid" 那么只會在整個table的最外面加上厚度為1的紅色邊框,分別如下圖所示:

當(dāng)然第一個出現(xiàn)了雙邊框,這是因?yàn)闆]有設(shè)置cellspacing的緣故,只要在table中設(shè)計cellspacing="0",那么就變?yōu)閱芜吙蛄恕?/p>
5,許多時候我們需要在頁面加載時能夠通過javascript去動態(tài)操作html中的一些對象,對于這些操作我們最好是在body中定義onload操作,然后在該操作中去完成這些任務(wù),盡量避免在html中嵌入script執(zhí)行代碼,因?yàn)閷τ诒容^大的頁面,當(dāng)這些腳本執(zhí)行的時候,頁面往往還沒有加載完畢,因此許多頁面對象還沒有被生成,此時動態(tài)去改變很可能會報異常。
6,有時候我們需要在iframe子頁面中調(diào)用父頁面的javascript函數(shù),例如在父窗口中定義了一個函數(shù)如下:
<html>
<script>
function loadImage(){
//...
}
</script>
<body>
//...
</body>
</html>
那么在iframe子頁面中可以通過parent.loadImage()來實(shí)現(xiàn)調(diào)用,這也說明用戶在頁面定義的所有javascript函數(shù)都屬于window對象之下。那么在父窗口如何調(diào)用子窗口中的函數(shù)呢,應(yīng)該很簡單了,就是獲得子窗口對象,然后調(diào)用子窗口對象的window對象下的這些函數(shù)即可,例如iframe的name為myframe,在子窗口定義了一個函數(shù)getUserName,那么父窗口中的調(diào)用方式為document.frames("myframe").getUsername();另外對于父窗口調(diào)用子窗口中的方法,還要注意一個問題,就是子窗口的加載有時候會比較慢,如果子窗口正在加載,那么此時它的各種頁面對象都不存在,那么當(dāng)在父窗口調(diào)用子窗口的方法時,為了保險可以使用借助setTimeout來實(shí)現(xiàn)異步調(diào)用,即通過setTimeout指定一定時間之后(例如100ms),再執(zhí)行調(diào)用,調(diào)用執(zhí)行總是判斷子窗口頁面是否加載完畢,如果沒有加載完畢,則繼續(xù)使用setTimeout方法,循環(huán)往復(fù)直到子窗口被完全加載,然后執(zhí)行子窗口的函數(shù)調(diào)用。既然這里解釋了窗口間的異步調(diào)用,后面就不專門解釋了。
7,在一個網(wǎng)頁中如何最小化窗口,當(dāng)然你可能會說,網(wǎng)頁的右上角不是有最小化、最大化和關(guān)閉三個按鈕嗎,當(dāng)然了這里說這個問題是指,如果不點(diǎn)擊網(wǎng)頁右上角的最小化,如何實(shí)現(xiàn)網(wǎng)頁的最小化操作,例如有些項(xiàng)目中,用戶需要辦公界面是全屏化的,這意味著網(wǎng)頁自己提供的許多操作都不可見,更不用說去操作了。在網(wǎng)絡(luò)上我們搜索最小化的解決方式,我們會發(fā)現(xiàn)千篇一律的使用如下的方式實(shí)現(xiàn):
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Minimize"></object>
<input type=button value=最小化 onclick=hh1.Click()>
在win98和windows2000中這個方式可能是可以的,但是在windows XP中卻是不再支持了,不僅如此在windows XP中對javascript不少函數(shù)做了限制。那么在XP中如何實(shí)現(xiàn)最小化呢,一個可以實(shí)現(xiàn)的方式就是自己寫一個activeX控件,這個是在項(xiàng)目中證明可以實(shí)現(xiàn)的。(不要認(rèn)為activeX控件很難寫,也不要以為activeX控件用戶不接受,在實(shí)際的項(xiàng)目中如果用戶使用的都是ie,那么用戶一般是會接受的,當(dāng)然這里的項(xiàng)目最好是內(nèi)網(wǎng)辦公項(xiàng)目,對于公網(wǎng)項(xiàng)目來說,用戶接不接受就很難說了)
8,注意td中nowrap的使用,這個屬性是很有用的,例如如果一個td中含有多張圖片,那么如果不加入nowrap,那么很可能這些圖片會由于其它的td的擠壓而產(chǎn)生細(xì)微的上下錯位,這表現(xiàn)的頁面上就是某處出現(xiàn)了一條橫向的細(xì)縫。這一點(diǎn)很重要,頁面中許多非常奇怪的現(xiàn)象都與此有關(guān)。
9,對于showModalDialog彈出的頁面,不能使用右鍵菜單,也不支持F5和ctrl+r刷新,如果此時修改彈出頁面的內(nèi)容,那么必須關(guān)閉該窗口,然后重新彈出才可以。另外,對于許多web服務(wù)器,由于服務(wù)器都設(shè)置有緩存,如果修改了彈出頁面的內(nèi)容,那么許多時候只是關(guān)閉彈出頁面還是不夠的,往往還需要關(guān)閉彈出該頁面的那個頁面才可以。在這里多說一句,web開發(fā)許多奇怪的頁面現(xiàn)象都和web服務(wù)器的緩存有著很大的關(guān)系,因此出現(xiàn)問題時考慮一下是否是由于服務(wù)器的緩存所致。
10,我們喜歡在form中定義onsubmit操作,主要是為了在表單提交之前可以做一些有意義的操作,例如檢查輸入域的有效性等等,但是一定要注意,如果我們通過點(diǎn)擊該form中的submit按鈕(type=submit或type=image)提交表單,那么該onsubmit操作會被執(zhí)行,但是如果通過document.formName.submit()提交表單,那么此onsubmit操作將不被執(zhí)行。
11,許多時候我們修改了頁面的內(nèi)容,但是我們刷新頁面或重新打開該頁面,卻看不到修改的效果,除了前面提到過的showModalDialog和緩存的情況要考慮外,還要檢查一下是否改對了地方,即你修改的那個頁面是否是服務(wù)器上的那個頁面,有可能你修改了其它地方的一個頁面,如果不是這個原因,那么再進(jìn)行其它方面的檢查。
12,在沒有系統(tǒng)規(guī)劃好之前,請不要在css中定義html標(biāo)簽的統(tǒng)一行為,即下面的形式:
<style>
TABLE{font-size:11pt;color:black;}
INPUT{border-width:1;border-color:pink;border-style:solid}
</style>
因?yàn)橐坏x了這些標(biāo)簽的屬性,那么這將會影響頁面中所有的這些標(biāo)簽屬性,尤其在一些公用的css文件中,盡量不要定義html標(biāo)簽的統(tǒng)一行為。當(dāng)然如果經(jīng)過了系統(tǒng)的良好的規(guī)劃,那么這樣做將是非常好的,只是在國內(nèi)在css上經(jīng)過良好規(guī)劃的并不多,因此雖然我們見到許多項(xiàng)目和產(chǎn)品中對html標(biāo)簽做了許多css的定義,但是真正起到作用的并不多。
13,在html標(biāo)簽中有許多屬性的名稱都是復(fù)合詞,例如borderColor、frameBorder、readOnly等等,注意這些復(fù)合詞在html的書寫,一般來說我們在html標(biāo)簽中寫為borderColor和bordercolor,各個瀏覽器的解析都會通過,但是我們在使用javascriopt引用這些屬性時卻需要注意了,一定使用正確的屬性名稱,嚴(yán)格來說,對于復(fù)合詞而言,除了第一個有意義的詞之外,其它任何有意義的詞的首字母都要大寫,例如對于上面列出的三個屬性的引用,一定要使用borderColor、frameBorder、readOnly的形式。
<input type="text" id="myinput" readonly />
<script>
var flag=document.getElementById("myinput").readOnly;//正確的方式
//var flag=document.getElementById("myinput").readonly;//錯誤的方式
</script>
14,我們知道當(dāng)使用瀏覽器的菜單“查看”->“文字大小”來改變文字的顯示時(或者有些瀏覽器也可以使用ctrl+滾輪鍵),網(wǎng)頁中的文字的字號會發(fā)生相應(yīng)的變化,如果我們在網(wǎng)頁中的文字塊中定義了style="font-size:10pt",那么這些文字塊中的文字的大小將是固定的了(注意在<font/>標(biāo)簽定義size屬性是不能固定字號的),我想這一點(diǎn)多數(shù)人都應(yīng)該知道的。但是我們使用中有時會出現(xiàn)一種非常奇怪的現(xiàn)象,例如下面的一段代碼:
<table><tr><td>
<div style="font-size:10pt;border-width:1;border-color:red;border-style:solid">
這是上面
</div>
<br />
<div style="font-size:10pt;border-width:1;border-color:green;border-style:solid">
這是下面
</div>
</td></tr></table>
我們看一下在字號顯示“最大”和“最小”下的差別:


從上圖我們可以看到字號我們是固定住了,但是table的高度卻會隨著查看方式的不同而發(fā)生變化,這是為什么呢?原因就在于td當(dāng)中的那個<br />,我們知道<br />是表示段內(nèi)換行,但是要注意在網(wǎng)頁中所謂的行也是有一定的默認(rèn)高度的,而且這個高度隨著查看方式的不同而發(fā)生相應(yīng)的變化,因此如果我們想固定上面table的高度不發(fā)生變化,有下面兩種方式:
方式一:在table標(biāo)簽中加入字號限制例如<table style="font-size:10pt"...
方式二:在<br />中加入字號限制例如<br style="font-size:10pt" />...
如果你是一個web開發(fā)人員,你可以試著使用ctrl+滾輪鍵改變網(wǎng)頁查看文字的大小,你會發(fā)現(xiàn)不少頁面都存在這個問題的。
15,網(wǎng)頁中定位對象的方式有許多種,下面先簡單總結(jié)一下,以后再專門寫這個方面的文章的:
1)頁面內(nèi)通用定位方式(這些定位方式適用于后面其它元素的定位)
document.getElementById(objId);//通過對象的id獲取對象,這個是各個瀏覽器都支持的,返回一個對象
document.getElementsByName(objName);//通過對象的name獲取對象,這個是各個瀏覽器都支持的,返回一個數(shù)組
document.getElementsByTagName(tagName);//通過標(biāo)簽名稱獲取對象,這個是各個瀏覽器都支持的,返回一個數(shù)組
document.all.objId;//通過對象id獲取對象,這個是ie支持的,返回一個對象
document.all(objId);//通過對象id獲取對象,這個是ie支持的,返回一個對象
document.layers.objId;//通過對象id獲取對象,這是Netscape支持的,返回一個對象
document.layers(objId);//通過對象id獲取對象,這是Netscape支持的,返回一個對象
window.objName;//通過對象名稱獲取對象,至少在ie中如此
objName;//通過對象名稱獲取對象,至少在ie中如此
2)頁面內(nèi)集合元素的定位方式
我們知道在頁面中有許多集合,例如form、frame、image等等,引用這些集合中某個對象的方式為,舉其中一個為例,其它都差不多,以form為例:
document.formName;//通過表單name獲取表單對象
document.forms[index];//通過索引獲取表單對象,瀏覽器會按順序?qū)㈨撁嬷兴械谋韱渭铣菙?shù)組,可以通過下標(biāo)引用
document.forms(formName);//通過表單name獲取表單對象
3)定位子窗口的方式(定位子窗口對象,不是標(biāo)簽對象,見前面3中的說明)
子窗口是指頁面中frame或iframe窗口,定位方式為:
document.frames[index];//索引定位方式
document.frames(frameName);//通過名稱定位
window.frameName;//通過名稱定位
frameName;//直接通過名稱來定位
4)在子定位父窗口的方式
通過關(guān)鍵字parent來引用即可,同理parent.parent則表示父父窗口,top則表示最上層窗口。
5)原窗口定位open彈出窗口的方式,例如下面代碼:
window.open("test.html");
這里我們要知道window.open將會返回一個彈出窗口的句柄,即可以如下:
var owin=window.open("test.html");
owin即代碼彈出窗口對象,通過改對象可以引用到彈出窗口的各個對象。
6)原窗口定位showModalDialog彈出窗口的方式,例如:
window.showModalDialog("test.html");
注意showModalDialog與open不同,open彈出窗口后,window.open后面的代碼可以繼續(xù)執(zhí)行,而showModalDialog彈出窗口后,原頁面被阻塞,即window.showModalDialog后面的代碼不被執(zhí)行,直到用戶關(guān)閉了彈出窗口才會繼續(xù)往下執(zhí)行,但這時因?yàn)橐呀?jīng)關(guān)閉了彈出窗口,所以已經(jīng)無法再對該窗口進(jìn)行引用。
7)open彈出的窗口對原窗口的定位方式,這個我們一般都知道,在彈出窗口中使用opener即可。
8)showModalDialog彈出的窗口對原窗口的定位方式,這個不是使用opener,而應(yīng)該在彈出窗口中使用parent。
16,編寫頁面代碼盡量使用標(biāo)準(zhǔn)的html、css和javascript,不要以為只要在ie上通過就可以了,要注意最近瀏覽器市場已經(jīng)開始發(fā)生變化了,不知道你是否聽說過Firefox2.0,它的用戶量已經(jīng)不在ie之下了,至少你的代碼要在ie和Firefox上都通過才可以,另外現(xiàn)在linux越來越吃香,保不準(zhǔn)幾年后我們的許多客戶都開始使用linux,到那個時候,我們將不得不對原來已經(jīng)完成的項(xiàng)目進(jìn)行維護(hù),與其這樣的后果,還不如從現(xiàn)在開始就使用標(biāo)準(zhǔn)為好,不要認(rèn)為跨瀏覽器是很虛的話題,覺得沒有必要,要知道這已經(jīng)不是幾年前了,現(xiàn)在形式和市場都在發(fā)生變化,我們的思想也該變一變了。
17,我們的產(chǎn)品或OA系統(tǒng)往往會有許多模塊,例如用戶管理、發(fā)文流程、物品管理等等,我們在為這些模塊命名時往往都是不太講究的,沒有注意名字的結(jié)構(gòu)、字?jǐn)?shù)等的統(tǒng)一,例如在個人事務(wù)模塊下面有三個子模塊,名稱分別如下:待辦事項(xiàng)、已辦事項(xiàng),維護(hù)個人信息。對于字?jǐn)?shù)而言我們往往不會苛求太多,但是對于詞的結(jié)構(gòu),我們還是要講究的,例如上面的三個模塊,前兩個是名詞結(jié)構(gòu),而后一個是謂詞結(jié)構(gòu)(動賓結(jié)構(gòu)),這是不太妥當(dāng)?shù)模苍S你覺得這有些吹毛求疵,當(dāng)然大多數(shù)項(xiàng)目中不會要求這么嚴(yán)格,但是有些客戶的確會有這樣的要求,另外對我們自己而言,這也體現(xiàn)了我們做事認(rèn)真、一絲不茍的品格和態(tài)度。
18,圖標(biāo)與文字的配比要合適,這不僅要求圖標(biāo)能夠正確顯示文字的意思,而且還要求圖標(biāo)不能蓋過文字的顯示與含義,即圖標(biāo)太顯眼而文字無足輕重的情況需要避免,例如下面的情況就是不太合適的:
用戶管理
之所以不合適,主要是因?yàn)閳D標(biāo)的含義與用戶管理關(guān)系不大,圖標(biāo)的含義更接近“XX編輯”的意思,和用戶管理基本沒有什么聯(lián)系。
19,在用戶登錄和表單處理頁面,我們要處理用戶按enter鍵的情況,即用戶按enter鍵也要觸發(fā)提交事件,不要只有用戶點(diǎn)擊“登錄”或“提交”按鈕才觸發(fā)提交操作。
20,如果我們在頁面中使用<a />標(biāo)簽,那么默認(rèn)情況,當(dāng)鼠標(biāo)移到該鏈接時,鼠標(biāo)自動會變?yōu)槭值男螤睿S多時候我們希望鼠標(biāo)移動到其它非鏈接的區(qū)域,也希望鼠標(biāo)變?yōu)槭值男螤睿覀円话愕奶幚矸绞綖樵谠搮^(qū)域的style中加入cursor屬性,如下:
<span style="cursor:hand" onclick="myfunc()">下一頁</span>
或者使用:
<span style="cursor:url('http://webme.bokee.com/inc/mouse118.cur')" onclick="myfunc()">下一頁</span>
但是要注意,只有在ie中才支持cursor:hand,在firefox2.0中的cursor中是沒有hand的,像wait、help等都是支持的,另外firefox中也不支持cursor:url方式。
21,我們有時想通過javascript進(jìn)行跨域頁面的調(diào)用,不過出于安全性的考慮,各個瀏覽器一般都是不支持的,例如下面的代碼:
<iframe src="http://www.google.com"></iframe>
<script>
setTimeout("document.frames[0].window.location.href",3000);
</script>
使用setTimeout是為了可以讓iframe子頁面可以加載完畢,上面的調(diào)用會報安全性警告,例如在ie如下:

那么是不是說只要是跨域就能不能進(jìn)行javascript訪問了呢?不是的,一種比較常用的辦法就是設(shè)置document.domain屬性,這種方式的描述如下:
假設(shè)有兩個頁面
test1.html 所在域:aaa.maindomain.com 訪問協(xié)議:http 端口:8080
test2.html 所在域:bbb.maindomain.com 訪問協(xié)議:http 端口:8080
滿足上面條件的兩個頁面test1.html、test2.html是可以通過javascript相互訪問的,上面的條件即為兩個頁面位于同一個基礎(chǔ)域(例如上面同為maindomain.com),遵循同一個訪問協(xié)議和端口(例如上面同為http 8080)。只要在這樣的兩個頁面中都設(shè)置document.domain為所在基礎(chǔ)域名,就可以相互調(diào)用了,例如:
test1.html 所在域?yàn)閍aa.mydomain.com
<script>
document.domain="mydomain.com";
</script>
<iframe src=http://bbb.mydomain.com/test2.html></iframe>
<script>
setTimeout("document.frames[0].window.location.href",3000);
</script>
test2.html 所在域?yàn)閎bb.mydomain.com
<script>
document.domain="mydomain.com";
</script>
...
這樣一來,test1.html的調(diào)用就是可以的了。一般來說跨域調(diào)用的場景發(fā)生在集團(tuán)型企業(yè)項(xiàng)目或多機(jī)構(gòu)的政務(wù)項(xiàng)目中,而對于這種類型的項(xiàng)目,它們的基礎(chǔ)域基本上是相同的,只是三級域名不同,因此可以使用上面的方式來進(jìn)行跨域調(diào)用。
22,你會頁面中的javascript調(diào)試嗎?也許你還不會使用ie或firefox提供的頁面調(diào)試器或插件,那么沒有關(guān)系,至少你懂得一種最基本的調(diào)試:alert調(diào)試,不要認(rèn)為這是一種很土或很傻的方式,很多時候這種方式都很非常有用的,對于一段很長的javascrip代碼,從頭到尾加入幾個alert,那么立即就能定位錯誤的大概位置,當(dāng)然使用調(diào)試器的斷點(diǎn)也可以很快定位,只是說alert也是一種不錯的方式。當(dāng)然還是希望你能夠掌握更為高級的調(diào)試器的使用,畢竟調(diào)試器帶給我的功能更強(qiáng)大。
23,我們許多時候編寫完網(wǎng)頁之后,發(fā)現(xiàn)最終的顯示效果和我們想象的不太一樣,這有些時候是由于瀏覽器的不同造成的,但除此之外,我們?nèi)绾尉唧w定位到底是頁面的哪塊代碼導(dǎo)致不太理想的頁面效果呢?當(dāng)然你可能會使用Dreamweaver或Frontpage打開出問題的頁面,然后查找原因,但是這些所見即所得的網(wǎng)頁設(shè)計器,并非我們想象的那么完美,例如明明在設(shè)計器種預(yù)覽很好的效果,到了真實(shí)環(huán)境中頁面竟然出現(xiàn)了錯位等等,這里和你介紹一種非常不錯的css的調(diào)試方式,這里就不具體說了,請參看我新寫過的一篇文章【css在html中的調(diào)試作用 】
24,網(wǎng)頁打印我們都知道可以調(diào)用window.print函數(shù),那么如果想打印iframe子窗口中頁面呢,如果你只是獲得子窗口對象,然后調(diào)用子窗口對象的print方法,此時打印機(jī)打印出卻不是子窗口頁面的內(nèi)容,而是父窗口頁面自身,為什么會這樣呢?原來(至少在ie中如此)在父頁面調(diào)用子窗口的print函數(shù)時,因?yàn)榇藭r焦點(diǎn)還在父窗口之中,所以打印機(jī)此時會將獲得焦點(diǎn)的窗口進(jìn)行打印,我們在打印子窗口之前,只需做一件事即可完成對子窗口的打印,如下代碼:
<html>
<head>
<script>
function myprint(){
document.frames("myframe").window.focus();
document.frames("myframe").window.print();
}
</script>
</head>
<body onload="myprint()">
<iframe name="myframe" src="test2.html"></iframe>
</body>
</html>
25,網(wǎng)頁切圖許多人都習(xí)慣于網(wǎng)頁三劍客的配合使用,網(wǎng)頁三劍客就是網(wǎng)頁開發(fā)者都熟悉的Dreamweaver、Fireworks和Flash,一般我們使用使用Flash或Fireworks將動畫或圖切分后輸出成為html頁面,然后通過Dreamweaver編輯輸出后的頁面,這是我們網(wǎng)頁切圖常用的配合方式,但是通過使用比較發(fā)現(xiàn),在圖片的切分方面,使用Photoshop要好于Fireworks,Photoshop不僅定位更加精確,而且由于自身是平面設(shè)計的標(biāo)準(zhǔn),因此它提供了許多圖片編輯的其它功能,這要比fireworks強(qiáng)大得多。目前專業(yè)的網(wǎng)頁設(shè)計師都在開始或一直使用Photoshop進(jìn)行網(wǎng)頁設(shè)計并切分后輸出成為HTML頁面。如果你是三劍客的愛好者也沒有關(guān)系,你可以使用一下看看效果如何,總之我從2000年就開始使用三劍客,現(xiàn)在才逐漸認(rèn)識到Photoshop已經(jīng)不僅僅是平面設(shè)計的標(biāo)準(zhǔn)了。
26,在javascript中有一個方法可以列出當(dāng)前對象所支持的所有屬性、集合和事件,通過使用in關(guān)鍵字來實(shí)現(xiàn),如下樣例代碼:
var str="";
for(var i in document){
str+=i+"\n";
}
alert("document's all attributes:"+str);
27,在一個名稱為myform的表單中,含有一個名稱為mychckbox的復(fù)選框,那么document.myform.mycheckbox所取到的是那個復(fù)選框?qū)ο螅敲创藭r調(diào)用document.myform.mycheckbox.length是錯誤的,如果該表單中含有多個名稱為mycheckbox的復(fù)選框,那么document.myform.mycheckbox返回的是一個數(shù)組,此時調(diào)用document.myform.mycheckbox.length就是正確的。單獨(dú)說這個問題,可能感覺比較簡單,但是在實(shí)際應(yīng)用中我們經(jīng)常會犯與此相關(guān)的錯誤,如下圖所示:

上圖是我們在應(yīng)用中經(jīng)常遇到的“增、刪、改”的邏輯,我們在其中經(jīng)常會對復(fù)選框做操作,經(jīng)常會使用類似document.myform.mycheckbox.length的方式,一般情況不會報錯,這主要是因?yàn)樵谖覀兊牧斜碇幸话銇碚f都不會只有一條記錄,但是當(dāng)列表中只有一條記錄的時候(盡管這種時候不常見),這樣引用就會報錯,因?yàn)榇藭rdocument.myform.mycheckbox返回的不是一個數(shù)組,則對length的引用就沒有意義了,這種錯誤說起來很容易,但是在編程時往往就會忽略,因此在編程時我們建議如下方式:
if(document.myform.mycheckbox.length){
//...
}else{
//...
}
28,在ie中有一個很特別的css語法,如果你聽說過,那說明你的積累真是太豐富了!在css中有一種給漢語注音的語法,如下所示:
<style>
ruby{font-size:13pt;}
rt{font-size:18pt;color:red}
</style>
<ruby>你知道這個語法嗎?<rt>ni zhi dao zhe ge yu fa ma</rt><br>
不知道<rt>bu zhi dao</rt>
</ruby>
你運(yùn)行這段代碼看看什么效果(要在ie中運(yùn)行),我這里效果如下:

29,我們項(xiàng)目中經(jīng)常會遇到頁面打印的需求,許多時候用戶需要只打印頁面某一部分,如果直接調(diào)用window.print則打印的是整個網(wǎng)頁的內(nèi)容。解決辦法不外乎兩種,第一種方式是將整個頁面分為幾個部分,將需要打印的部分放在其中的一個部分,然后定義onbeforeprint和onafterprint兩個操作,即打印之前將不要打印的部分隱藏,打印之后將隱藏的部分顯示,類似代碼如下:
<script>
function beforePrint(){
document.getElementById("hidden1").style.display="none";
document.getElementById("hidden2").style.display="none";
}
function afterPrint(){
document.getElementById("hidden1").style.display="block";
document.getElementById("hidden2").style.display="block";
}
document.onbeforeprint=beforePrint;
document.onafterprint=afterPrint;
</script>
<div id="hidden1" style="display:block">
這里不需要打印
</div>
<div id="printDiv" style="display:block">
這里需要打印
</div>
<div id="hidden2" style="display:block">
這里不需要打印
</div>
<input type="button" value="打印" onclick="window.print()"/>
第二種方式是將需要打印的部分放到iframe之中,然后將焦點(diǎn)移到子窗口,然后調(diào)用子窗口的print方法即可。
30,Javascript中的數(shù)組和我們一般的編程語言中的數(shù)組是不太一樣,一般語言中數(shù)組的長度是固定的,有些語言中數(shù)組中的數(shù)據(jù)類型也要求是一樣的,但是javascript數(shù)組卻不受這些限制,在javascript中數(shù)組基本上是沒有長度限制的,而且類型也沒有限制,例如下面的一些使用方法:
var arr=new Array();
arr[1000]="ok";
arr[300]=255;
arr[200]=new Date();
var date=arr[200];
alert(date.getTime());
因?yàn)閿?shù)組的這種機(jī)制,我們可以使用數(shù)組實(shí)現(xiàn)許多數(shù)據(jù)結(jié)構(gòu),例如列表、哈西表等等。
31,對于XML的處理一般情況下都是在服務(wù)器端處理的,例如在Java中有W3C、JDOM、XPath等許多xml的解析器,但是現(xiàn)在許多時候我們需要在瀏覽器端處理xml字符串,目前在ie和netscape中都有針對xml字符串的解析,如果你喜歡使用,也沒有什么關(guān)系,不過對于Java程序員,我給你介紹一個完全按照W3C Document API實(shí)現(xiàn)的XML解析器,相信你會非常喜歡的,因?yàn)橥耆荍ava的風(fēng)格,請從 http://download.jsjava.com 下載jsjava0.91,在其中的src/jsorg/w3c/dom下有XML各個對象的實(shí)現(xiàn),在頁面中只需引用其中的xmlp.js和i18n.js即可,具體使用可以參考里面的例子:位于下載包的examples/XMLParser/XMLW3CParser下面,也可以直接訪問:http://jsjava.sourceforge.net/examples/XMLParser/XMLW3CParser/W3CXMLParser.html 查看例子。
32,一段文本的首行文本縮進(jìn)兩個漢字,這是中文段落的格式要求,我們可以通過在首行加入多個 來實(shí)現(xiàn),不過還是建議使用css的標(biāo)準(zhǔn)屬性text-indent,例如下面的代碼:
<p style="text-indent:28;font-size:10pt">
這是一段文本,請注意它的格式,<br>
你看到了什么效果?如果你看到首行<br>
縮進(jìn)了,那么說明起作用了。
</p>
顯示效果如下:

33,在Javascript中字符串的替換函數(shù)為replace(regexp, newSubStr),其中第一個參數(shù)是一個正則表達(dá)式,但是我們在實(shí)際使用中,往往習(xí)慣使用為一個字符串,這雖然不會報錯,但是得到的結(jié)果往往是不正確的,例如下面的例子:
var str=“ abbbbacc”;
var rs=str.replace(“a”,”0”);
(A)0bbbbacc (B)0bbbb0cc
正確答案是A,當(dāng)然A可能不是你想要的結(jié)果,你想要的結(jié)果是字符串中所有的“a”都被替換為“0”,可是上面的使用方式只能將第一個“a”替換為“0”,正確的使用方式,在第一個參數(shù)中輸入一個正則表達(dá)式,如下所示:
var str=“ abbbbacc”;
var rs=str.replace(“/a/g”,”0”);//注意如果第一個參數(shù)為/a/,結(jié)果也是不正確的。
(A)0bbbbacc (B)0bbbb0cc
這樣的話答案就是B了,如果你不明白/a/g是什么意思,那么你就需要對Javascript的正則表達(dá)式好好學(xué)習(xí)了,具體可以參看我以前寫過的一篇文章:http://blog.csdn.net/eye_of_back/archive/2006/07/14/922667.aspx
34,無論你使用的是ASP,還是PHP,或者JSP,都不建議在頁面代碼中夾雜著大量的業(yè)務(wù)邏輯代碼。我們應(yīng)該將業(yè)務(wù)邏輯代碼封裝到應(yīng)用服務(wù)器層或者說業(yè)務(wù)層,web端只是進(jìn)行調(diào)用。在JSP和PHP中我們可以將業(yè)務(wù)邏輯封裝到BO(業(yè)務(wù)對象)中,由于支持類、接口等一套面向?qū)ο蟮臋C(jī)制,使得這種封裝顯得很容易,對于ASP,由于ASP.NET和C#的興起,使得它對業(yè)務(wù)封裝也變得相當(dāng)方便。雖然我們都懂得服務(wù)器的三層架構(gòu),但是我們發(fā)現(xiàn)許多的項(xiàng)目之中,開發(fā)人員仍然在頁面中直接編寫業(yè)務(wù)邏輯,甚至直接訪問數(shù)據(jù)庫,面對這種情況,不能不說我們的項(xiàng)目管理是存在很大的問題的,我們的項(xiàng)目經(jīng)理和程序設(shè)計師們,我們應(yīng)該好好反思一下了。
35,有些時候我們在<a/>標(biāo)簽的href中直接加入javascript代碼,通過window.open來打開一個自己可以控制許多屬性的窗口,例如下面的代碼:
<a href="javascript:window.open('http://www.google.com');">打開Google</a>
當(dāng)我們點(diǎn)擊鏈接后,確實(shí)彈出了Google的頁面,但同時原頁面卻變?yōu)榱讼旅娴臉幼樱?br />

這種情況相信有些人遇到過,解決方式如下:
<a href="javascript:window.open('http://www.google.com');window.opener=null;window.close()">打開Google</a>
但是為什么前面的那種方式就會出現(xiàn)那種情況呢,其實(shí)只要做個簡單實(shí)驗(yàn)就會明白了,你運(yùn)行一下下面的代碼,點(diǎn)擊鏈接看看會出現(xiàn)什么結(jié)果:
<a href="javascript:window">打開Google</a>
實(shí)驗(yàn)后你會發(fā)現(xiàn),點(diǎn)擊鏈接后頁面出現(xiàn)的結(jié)果與上面那種結(jié)果相同,然后你再實(shí)驗(yàn)一下下面的代碼:
<a href="javascript:'test'">打開Google</a>
點(diǎn)擊鏈接后,你會發(fā)現(xiàn)頁面中會顯示test字樣。可見對于類似
<a href="javascript:js代碼">點(diǎn)擊</a>
的代碼,如果js代碼執(zhí)行完畢后返回一個對象,那么頁面內(nèi)容會被沖掉,然后將該對象的描述輸出到頁面中,我們知道window.open方法返回的是彈出的頁面的窗口對象(window),因此javascript:window.open將會在彈出一個窗口的同時,原頁面會沖掉原有內(nèi)容并將返回的window對象輸出到原頁面中。如果在window.open后面加入window.opener=null;window.close(),則彈出窗口后,返回給原頁面的對象為空,則原頁面不執(zhí)行任何其它操作。