




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
DOM教材
DOM是DocumentObjectModel的縮寫,是對(duì)XML文檔的內(nèi)容進(jìn)行表示的模型。它把
XML文檔看作是一系列node和node間的關(guān)系,并且把每一個(gè)node都當(dāng)作一個(gè)對(duì)象,所以
叫文檔對(duì)象模型。
DOM還提供了一系列的方法(API),允許開發(fā)人員添加、編輯、移動(dòng)或刪除樹中任
意位置的節(jié)點(diǎn),從而創(chuàng)建一個(gè)引用程序。
在網(wǎng)頁中,我們可以把DOM理解為不僅是對(duì)網(wǎng)頁中各個(gè)元素關(guān)系的描述(把每個(gè)元素
或文本都視為一個(gè)節(jié)點(diǎn),既node。關(guān)系是指每一個(gè)節(jié)點(diǎn)之間是兄弟還是父子等關(guān)系。),并
且還可以把每一個(gè)網(wǎng)頁元素或一段文字,都當(dāng)成一個(gè)可操作的對(duì)象。比如說:html元素和
body元素是什么關(guān)系(父節(jié)點(diǎn)和子節(jié)點(diǎn)的關(guān)系),body中某一個(gè)div和某一個(gè)p是什么關(guān)系。
如何刪除body中的某一個(gè)div,如何給body里添加一個(gè)新的div等等,這些都是DOM里
規(guī)定的。
配套視頻請(qǐng)見《DOM專題》視頻部分。
1獲取節(jié)點(diǎn)
1.1通過document獲取節(jié)點(diǎn)
表1獲取節(jié)點(diǎn)方法索引表
Item內(nèi)容
通過元素ID獲取節(jié)點(diǎn):
getElementByld
document.getElementByld(元素ID名)
通過元素的name屬性獲取節(jié)點(diǎn):document.getElementByName(元素
getElementByName
name屬性)
通過元素的標(biāo)簽名獲取節(jié)點(diǎn):documenl.getELemenlByTagName(元素標(biāo)
getElementByTagName簽);
它返回的是nodeList對(duì)象
通過類名獲取節(jié)點(diǎn):getElemenlByClassName(元素類名)。IE6/7/8不支
getElemenlByClassName
持
querySelectorjQuery風(fēng)格的元素查找方法,獲得一個(gè)DOM元素。從1E8開始支持
querySelectorAlljQuery風(fēng)格的元素查找方法,獲得一組DOM元素。從IE8開始支持
1.2通過節(jié)點(diǎn)指針獲取節(jié)點(diǎn)
表2節(jié)點(diǎn)屬性索引表
Item名稱內(nèi)容
節(jié)點(diǎn)D0M1級(jí)定義的node接口,js中所有的節(jié)點(diǎn)類型均繼承自
Node
node類型
nodeValue節(jié)點(diǎn)值Text節(jié)點(diǎn)或conment節(jié)點(diǎn)的文本內(nèi)容,可進(jìn)行讀寫操作
續(xù)表2節(jié)點(diǎn)屬性索引表
Item名稱內(nèi)容
nodeName節(jié)點(diǎn)名稱元素的標(biāo)簽名,以大寫形式表示
節(jié)點(diǎn)類型表示該節(jié)點(diǎn)的類型。如1代表Element節(jié)點(diǎn)、2代表Attribute
nodeType
節(jié)點(diǎn)等,具體見表2內(nèi)容
子節(jié)點(diǎn)每個(gè)節(jié)點(diǎn)都有childNodes屬性,它是只讀的類數(shù)組對(duì)象,
childNodes
實(shí)時(shí)動(dòng)態(tài)的保存該節(jié)點(diǎn)的子節(jié)點(diǎn)
子節(jié)點(diǎn)Children只包含element元素,它的功能和childNodes類
Children似,不同的是,children是非標(biāo)準(zhǔn)屬性,由IE提出,在部
分瀏覽器不兼容
節(jié)點(diǎn)列表nodeList是類數(shù)組對(duì)象,用于動(dòng)態(tài)的保存一組有序的節(jié)點(diǎn)
nodeList
(理解nodeList是透徹理解DOM的關(guān)鍵)
父節(jié)點(diǎn)該節(jié)點(diǎn)的父節(jié)點(diǎn),但類似document這樣的對(duì)象沒有父節(jié)
parentNode
點(diǎn),它的parentNode屬性為null
上一個(gè)兄弟節(jié)點(diǎn)該節(jié)點(diǎn)的兄弟節(jié)點(diǎn)中的上一個(gè),和該節(jié)點(diǎn)具有相同的父節(jié)
previousSibling
點(diǎn)
下一個(gè)兄弟節(jié)點(diǎn)該節(jié)點(diǎn)的兄弟節(jié)點(diǎn)中的下一個(gè),其中,具有相同父節(jié)點(diǎn)的
nextSibling
兩個(gè)節(jié)點(diǎn)成為兄弟節(jié)點(diǎn)
第一個(gè)子節(jié)點(diǎn)該節(jié)點(diǎn)的子節(jié)點(diǎn)的第一個(gè)節(jié)點(diǎn),該節(jié)點(diǎn)沒有子節(jié)點(diǎn)則為
firstChild
null
最后一個(gè)子節(jié)點(diǎn)該節(jié)點(diǎn)的子節(jié)點(diǎn)的最后一個(gè)節(jié)點(diǎn),該節(jié)點(diǎn)沒有子節(jié)點(diǎn)則為
lastChild
null
表3節(jié)點(diǎn)信息索引
Item名稱nodeTypenodeNamenodeValue
Element元素1元素的標(biāo)簽名Null
Attribute屬性2屬性的名稱屬性值
Text文本3#text節(jié)點(diǎn)內(nèi)包含的文本
Comment注釋8#comment注釋的內(nèi)容
Document文檔9#documentNull
Fragment文檔碎片11#document-fragmentNull
2節(jié)點(diǎn)操作
2.1創(chuàng)建節(jié)點(diǎn):createElement()、createAttibute()、createTextNode()
a)createElement()
此方法可創(chuàng)建元素節(jié)點(diǎn),返回的是一個(gè)Element節(jié)點(diǎn),具有指定的標(biāo)簽名。創(chuàng)建出來的
新元素節(jié)點(diǎn)不會(huì)被自動(dòng)添加到文檔里,既然沒添加到文檔里,說明它還是一個(gè)游離的狀態(tài)。
所以它也沒有nodeParent屬性。如果想把它添加到文檔里,可以使用appendChild。或者
insertBefore。方法或者replaceChild()方法。
請(qǐng)練習(xí)一下代碼:
1.document.createElement():〃創(chuàng)建節(jié)點(diǎn)的方法
2.varoDiv=document.createElement(“div”);
3.document.body.appendChild(oDiv);
b)createAttribute()和createTextNode()
createAttitude()方法用于創(chuàng)建一個(gè)新的Attri節(jié)點(diǎn),給元素添加屬性。createTextNode
()是用于創(chuàng)建一個(gè)文本節(jié)點(diǎn),所以nodeType等于3。oTextNode.nodeName將返回#text;
跟createElement。一樣,用createTextNode。創(chuàng)建的節(jié)點(diǎn)也不會(huì)自動(dòng)添加到文檔里。需要使
用appendChild?;蛘遡nsertBefbre。方法或者replaceChild。方法。它經(jīng)常與createElement()
配合使用,知道為什么嗎?(一個(gè)元素節(jié)點(diǎn),一個(gè)文本節(jié)點(diǎn)。)
4.varoDiv=document.createElement(“div”);
5.oDiv.setAttribute("title","mydemo");
6.document.body.appendChild(oDiv);
7.如果需要添加文字,則需要createTextNode。這個(gè)方法了。
8.varoTextNode=document.createTextNode(umydemo");
9.varmes=document.createTextNode(lthelIoworld");
10.varcontainer=document.createElement("p");
11.container.appendChild(mes);
12.document.body.appendChild(container);
?注意:一定要理解好元素節(jié)點(diǎn)和文本節(jié)點(diǎn)的區(qū)別。元素節(jié)點(diǎn)是沒有nodeValue的,只
有文本節(jié)點(diǎn)才有nodeValue。在IE9以下的ie瀏覽器中,回車換行不算一個(gè)文本節(jié)點(diǎn),
但標(biāo)準(zhǔn)瀏覽器中這是個(gè)文本節(jié)點(diǎn)。
c)createFragment
此方法用于創(chuàng)建文檔片段,雖然不能把文檔片段直接添加到文檔中,但是它可以作為
一個(gè)“倉庫”來使用,將可能需要添加到文檔中的節(jié)點(diǎn)保存在這里,需要添加時(shí)可以一次
性將需要添加的節(jié)點(diǎn)添加到文檔中,避免瀏覽器的反復(fù)渲染,提高性能
請(qǐng)練習(xí)以下代碼:
1.<body>
2.<ulid=,myList,x/ul>
3.</body>
4.<script>
5.varoFragment=document.crcateDocumentFragment();
6.varul=document.getElementById(€myList,);
7.varoLi=null;
8.fbr(vari=0;i<10;i++){
9.oLi=document.createElement(*li,);
10.oLi.appendChildCdocument.createTextNodeCitem^Ci+l)));
11.oFragmcnt.appcndChild(oLi);
12.)
13.ul.appendChild(oFragment);
14.</script>
2.2插入節(jié)點(diǎn):appendChild()和insertBefore()
appendChild(node):在指定元素節(jié)點(diǎn)的最后一個(gè)子節(jié)點(diǎn)之后添加節(jié)點(diǎn),需要注意的是,
該方法返回的是新的子節(jié)點(diǎn)。它經(jīng)常跟createElement()和createTextNode。、cloneNode。配
合使用。另外appendChild。不僅可以用來追加新的元素,也可以你挪動(dòng)文檔中現(xiàn)有的元素。
請(qǐng)練習(xí)一下代碼:
1.varcontainer=document.createElement("pn);
2.vart=document.createTextNode(nzhufengH);
3.container.appendChild(t);
4.document.body.appendChild(container);
5.<pid=',msgn>msg</p>
6.<pid="content">content</p>
7.<pid=',aaa,,>aaaaaaaa</p>
8.<script>
9.varmes=document.getElementByld(nmsg");
10.varcontainer=document.getElementByld("content**);
11.container.appendChild(mes);
12.</script>
13.//發(fā)現(xiàn)msg放至Ucontent后面去了。
14.<pid="content">
15.content
16.<pid="msg”>珠峰培訓(xùn)專注js前端開發(fā)培訓(xùn)</p>
17.</p>
18.<pid='匕aa”>珠峰培訓(xùn)的js課程中包含html5的內(nèi)容</p>
insertBefore(newNode,oldNode):在已有的子節(jié)點(diǎn)前插入一個(gè)新的子節(jié)點(diǎn)。使用該方法
需要注意以下兩點(diǎn):第二個(gè)參數(shù)是可選,如果第二個(gè)參數(shù)不寫,將默認(rèn)添加到文檔的最后,
相當(dāng)于appendChikl。;此方法可返回新的子節(jié)點(diǎn)。
請(qǐng)練習(xí)以下代碼:
19.<divid="parent">
20.<pid="content”>珠峰培訓(xùn),專注前端面向未來</p>
21.<divid=nmsgn>msg<div>test</divX/div>
22.<pid=**content">222</p>
23.<pid="aaa">aaaaaaaa</p>
24.</div>
25.<script>
26.varmsg=document.getElementByld(Hmsgn);
27.varaaa=document.getElementByld("aaa");
28.varparent=document.getElementByld(nparentn);
29.parent.insertBefore(msg,aaa);//這個(gè)方法由父元素調(diào)用
30.</script>
31.//我們發(fā)現(xiàn)工D為msg的插入到了aaa的前面。
2.3替換節(jié)點(diǎn):replaceChild()
replaceChild(newNode,oldNode)方法是刪除一個(gè)子節(jié)點(diǎn)并用一個(gè)新的節(jié)點(diǎn)代替原
來節(jié)點(diǎn)的位置,使用時(shí)需要注意以下幾點(diǎn):
該方法接受兩個(gè)參數(shù):第一個(gè)參數(shù)是新節(jié)點(diǎn),第二個(gè)參數(shù)是需要被代替的節(jié)點(diǎn);被替換
的節(jié)點(diǎn)沒有消失,只是在文檔樹中被移除了,沒有了它的位置,但還存在于文檔中;這個(gè)
方法需要在父節(jié)點(diǎn)上調(diào)用,如替換成功則返回被替換的節(jié)點(diǎn);如替換失敗則返回null。
請(qǐng)練習(xí)以下代碼:
32.ele.repalceChild(newNode,oldNode):〃這個(gè)方法也是由父級(jí)元素來調(diào)用
33.
34.<body>
35.<divid="zhufengn>
36.<divid=nan>a</div>
37.<divid=nb">b</div>
38.<divid=ncH>c</div>
39.</div>
40.</body>
41.<script>
42.varzhufeng=document.getElementByld("zhufeng");
43.varmsg=document.getElementByld("bn);
44.varpara=document.createElement("pn);
45.zhufeng.replaceChild(para,msg);
46.</script>
2.4復(fù)制節(jié)點(diǎn):cloneNode()
cloneNode(boolean):此方法接受一個(gè)布爾值參數(shù),用于復(fù)制節(jié)點(diǎn)操作,使用時(shí)需注
意以下幾點(diǎn):
參數(shù)boolean為false時(shí),表示執(zhí)行淺復(fù)制,即只復(fù)制節(jié)點(diǎn)本身;參數(shù)boolean為true
時(shí),表示執(zhí)行深復(fù)制,即會(huì)復(fù)制節(jié)點(diǎn)本身及其整個(gè)子節(jié)點(diǎn)樹;復(fù)制后返回的節(jié)點(diǎn)沒有指定
的父節(jié)點(diǎn),不會(huì)被自動(dòng)插入到文檔,在文檔中處于游離狀態(tài);如果克隆后,id一樣,不要
忘記用setAttribute("id","another_id");改變新的節(jié)點(diǎn)的ID。
請(qǐng)練習(xí)以下代碼:
15.varmes=document.createTextNode("helloworld");
16.varcontainer=document.createElement("pn);
17.container.appendChild(mes);
18.document.body.appendChild(container);
19.varnewpara=container.cloneNode(true);//true和false的區(qū)另U
20.document.body.appendChild(newpara);
2.5刪除節(jié)點(diǎn):removeChild()
removeChild(node)方法可以從子節(jié)點(diǎn)列表中刪除某個(gè)節(jié)點(diǎn)。如刪除成功,則此方法返回
被刪除的節(jié)點(diǎn),如刪除失敗則返回null。你如果想把某個(gè)節(jié)點(diǎn)從一處移動(dòng)到另一個(gè)地方,不
必使用removeChild(),可以使用前面的appendChild。和insertBefore(),他們都會(huì)自動(dòng)先刪除
節(jié)點(diǎn),然后移動(dòng)到你指定的地方。
請(qǐng)練習(xí)以下代碼
47.<body>
48.<divid="parentn>
49.<divid=naH>a</div>
50.<divid=nb">b</div>
51.<divid=ncH>c</div>
52.</div>
53.</body>
54.<script>
55?varparent=document.getElementByld(nparentn);
56.varb=document.getElementByld(nb");
57.parent.removechild(b);//這個(gè)方法也是由父元素來調(diào)用
58.</script>
如果不知道要?jiǎng)h除的節(jié)點(diǎn)的父節(jié)點(diǎn)是什么,可以使用parentNode屬性。比如:
59.<body>
60.<divid=nzhufengH>
61.<divid=ua">a</div>
62.<divid="b">b</div>
63.<divid=ncH>c</div>
64.</div>
65.</body>
66.<script>
67.varb=document.getElementByld("b");
68.varc=b.parentNode;
69.c.removeChild(b);
70.</script>
2.6判斷節(jié)點(diǎn):hasChildNodes()
此方法可判斷指定節(jié)點(diǎn)是否存在子節(jié)點(diǎn),若存在一個(gè)或多個(gè)子節(jié)點(diǎn),則返回值為true,否則返回值
為false,請(qǐng)練習(xí)以下綜合代碼:
1.varps=document.getElementsByTagName(''p,z);
2.for(vari=0;i<ps.length;i++){
3.ps[i].setAttribute(''title","hell。");
4.//也可以使用:ps.item(i).setAttribute(Htitle",Hhellon);
5.)
6.<body>
7.<divid=,,zhufengn>
8.<divid=na">a</div>
9.<divid=nbH>b</div>
10.<divid=,,c">c</div>
11.</div>
12.</body>
13.<script>
14.varps=document.getElementByld("zhufeng")
15.if(ps.hasChildNodes){
16.alert(ps.childNodes.length);
17.)
18.</script>
3.屬性操作
3.1獲取屬性、設(shè)置屬性和刪除屬性
a)getAttribute():該方法用于獲取節(jié)點(diǎn)的屬性,獲取的時(shí)候,如果屬性不存在,則返
回空,注意ie和ff返回不同,返回雖然不同,但是可以用一個(gè)方法來判斷:
if(a.getAttribute("title"))
b)setAttribute():該方法用于設(shè)置節(jié)點(diǎn)的屬性
c)removeAttribute():該方法用于移除節(jié)點(diǎn)的屬性
請(qǐng)練習(xí)以下代碼:
19.setAttribute();//15?
20.vara=document.createElement(''p,z);
21.a.setAttribute(''titlez,,^mydemo");
22.
23.vara=document.getElementByld(''zhufeng,z);
24.varb=a.getAttribute(''title"");
25.console.log(b);
26.varc=b.removeAttribute('title7);
27.console.log(c);
3.4判斷屬性
hasAttributeO:該方法用于判斷一個(gè)元素是否具有指定的屬性,如果當(dāng)前元素節(jié)點(diǎn)擁
有指定屬性,則返回true,否則返回false,但是不返回那個(gè)屬性的值。若文檔中明確設(shè)置
了指定的屬性,或是文檔類型聲明為該屬性設(shè)置了默認(rèn)值,則hasAttributeO方法都返回true。
4.DOM應(yīng)用:珠峰培訓(xùn)的DOM庫【最新版本請(qǐng)?jiān)谌汗蚕砝锵螺d:3354715131
/*DOM庫中方法索引表:
^l.getChildNodes獲取指定元素下的所有指定元素節(jié)點(diǎn)
*2.getNextEle獲取指定元素的下一個(gè)兄弟節(jié)點(diǎn)(用遞歸的思路)
*3.getNextOne獲取指定元素的上一個(gè)兄弟元素節(jié)點(diǎn)(用循環(huán)的方法)
M.getNextAll獲取指定標(biāo)簽名ele下面的所有標(biāo)簽名為tagName的弟弟元素節(jié)點(diǎn)
*5.getPreEle獲取指定元素的上一個(gè)兄弟元素節(jié)點(diǎn)
*6.getPreAll獲取指定標(biāo)簽名ele下面的所有標(biāo)簽名為tagName的哥哥元素節(jié)點(diǎn)
*7.siblings獲取指定元素的所有兄弟節(jié)點(diǎn)(哥哥節(jié)點(diǎn)和弟弟節(jié)點(diǎn)相加的思路)
*8.getSiblings獲取指定元素的所有兄弟節(jié)點(diǎn)(取到父節(jié)點(diǎn)后再取父節(jié)點(diǎn)下子節(jié)點(diǎn)的思路)
*9.getEleChildren獲得元素ele下指定標(biāo)記名為tagName的所有子元素(第二個(gè)參數(shù)可選)
*10.getLastEle在所有的元素節(jié)點(diǎn)集eles中找出最后元素節(jié)點(diǎn)
*11.getFirstEle在所有的元素節(jié)點(diǎn)集eles中找出第一個(gè)元素節(jié)點(diǎn)
*12.insertAfter把要插入的元素newEle追加在目標(biāo)元素oldEle的后面
*13.prepend把newNode這個(gè)節(jié)點(diǎn),當(dāng)成第一個(gè)子節(jié)點(diǎn)追加給parentEle元素
*14.text獲取或設(shè)置元素節(jié)點(diǎn)文本值(只傳第一個(gè)參數(shù)是獲取,傳兩個(gè)參數(shù)是設(shè)置)
*15.getElesByClass獲取具有多個(gè)類名的目標(biāo)元素
*16.getEle獲取只有一個(gè)類名的目標(biāo)元素(處理正中不能寫多個(gè)類名的情況)
*17.addClass增加類樣式的方法
*18.removeClass移除類的方法
*19.hasClass判斷某元素上是不是有某個(gè)類
*20.getIndex獲取元素的索引值(從父元素往下逐一判斷的思路)
*2I.getIndexNum獲取元素的索引值(獲取哥哥元素個(gè)數(shù)的思路)
*22.1istToArray將nodeList類型轉(zhuǎn)化為數(shù)組
*23.getPos獲取元素相對(duì)于屏幕距離
*24.getCss獲取網(wǎng)頁元素的CSS屬性值
*25.setCss給元素設(shè)置CSS屬性的方法
*26.setGrounpCss批量設(shè)置css屬性的方法
*/
*1、函數(shù)名稱:getEleChildren()
*功能描述:獲取指定元素下的所有指定元素節(jié)點(diǎn),當(dāng)?shù)诙€(gè)參數(shù)不傳時(shí)則返回obj下的所有子元素節(jié)
點(diǎn)
*思路:獲取所有節(jié)點(diǎn),判斷是否是元素節(jié)點(diǎn),標(biāo)簽名是否為指定標(biāo)簽名
**/
functiongetEleChildren(obj,node){
vara=[];
varoChild=obj.childNodes;
if(node&&node.tagName==1){
for(vari=0;i<oChild.length;i++){
if(oChildfi].nodeType==l&&oChild[i].tagName==node.toUpperCase()){
a.push(oChild[i]);
}
)
returna;
)
else{〃如果第二個(gè)參數(shù)沒傳,則將obj下的所有元素節(jié)點(diǎn)獲取并返回
for(vari=0;i<oChild.length;i++){
if(oChild[i].nodeType==1){
a.push(oChild[i]);
)
)
returna;
*2、函數(shù)名稱:getNextEle()功能同下一個(gè)方法,思路不同
*功能描述:獲取指定元素的下一個(gè)兄弟節(jié)點(diǎn)
*思路:利用遞歸思路,循環(huán)調(diào)用方法本身,直到查找到下一個(gè)兄弟節(jié)點(diǎn)
*/
functiongetNextEle(node){
varnode=node.nextSibling;
if(node.nodeType==1){
returnnode;
)
if(node.nextSibling){
returnarguments.callee(node);//遞歸一下,就是再調(diào)用自己去運(yùn)算。不要忘了return
)
returnnull;//如果一個(gè)方法應(yīng)該有返回值,但又無法計(jì)算出結(jié)果,則應(yīng)該返回nulL
*3、函數(shù)名稱:getNextOne()功能同上一個(gè)方法,思路不同
*功能描述:獲取指定元素的下一個(gè)兄弟元素節(jié)點(diǎn)
*思路:利用循環(huán)方法,直到查找到下一個(gè)兄弟元素節(jié)點(diǎn)
**/
functiongetNextOne(ele){
varnext=ele.nextSibling;
while(next){
if(next.nodeType===1){
returnnext;
)
next=next.nextSibling;
)
returnnull;
*4、函數(shù)名稱:getNextAll()
*功能描述:獲取指定標(biāo)簽名ele下面的所有標(biāo)簽名為tagName的弟弟元素節(jié)點(diǎn),
*思路:
*
functiongetNextAll(ele,tagName){
vara=[];
varnext=getNextOne(ele);〃調(diào)用公共方法,獲得此元素的下一個(gè)(弟弟)元素節(jié)點(diǎn)
if(tagName&&typeoftagName=='string,){
while(next){
if(next.tagName.toLowerCase()==tagName.toLowerCase()){
a.push(next);
)
next=getNextOne(next);
}
}else{
while(next){
a.push(next);
next=getNextOne(next);
returna;
*5、函數(shù)名稱:getPreEleO
*功能描述:獲取指定元素的上一個(gè)兄弟元素節(jié)點(diǎn)
*思路:利用遞歸思路,循環(huán)調(diào)用方法本身,直到查找到上一個(gè)兄弟元素節(jié)點(diǎn)
**/
functiongetPreEle(preNode){
preNode=preNode.previousSibling;
if(preNode){
if(preNode.nodeType===1){
returnpreNode;
}else{
returnarguments.callee(preNode);
)
}else{
returnnull;
*6、函數(shù)名稱:getPreAII()
*功能描述:獲取指定標(biāo)簽名ele下面的所有標(biāo)簽名為tagName的哥哥元素節(jié)點(diǎn),
*思路:
**/
functiongetPreAll(ele,tagName){
vara=[];
varpre=getPreEle(ele);
if(tagName&&typeoftagName==,string,){
while(pre){
if(pre.tagName.toLowerCase()==tagName.toLowerCase()){
a.push(pre);
)
pre=getPreEle(pre);
)
}else{
while(pre){
a.push(pre);
pre=getPreEle(pre);
)
)
returna;
*7、函數(shù)名稱:siblings。
*功能描述:獲取指定元素的所有兄弟節(jié)點(diǎn),
*思路:先獲取哥哥元素節(jié)點(diǎn),存進(jìn)數(shù)組后反轉(zhuǎn),保證順序正常,再獲取所有弟弟元素節(jié)點(diǎn),拼接
即可
*________________*/
functionsiblings(ele){
vara=[];
varprevious=ele.previousSibling;
while(previous){
if(previous.nodeType===1){
a.push(previous);
)
previous=previous.previousSibling;
}
a.reverse();〃如果用unshift方法,則不用反轉(zhuǎn)
varnext=ele.nextSibling;
while(next){
if(next.nodeType===1){
a.push(next);
)
next=next.nextSibling;
)
returna;
*8、函數(shù)名稱:siblings。
*功能描述:獲取指定元素的所有兄弟節(jié)點(diǎn),
*思路:先獲取指定元素節(jié)點(diǎn)的父節(jié)點(diǎn),再往下取該父元素下除本元素外的所有子節(jié)點(diǎn)
*________________
functionsiblings(objName){
vara=[];
varsib=objName.parentNode.children;
for(vari=O;i<sib.length;i++){
if(sib[i]!=objName&&sib[i].nodeType==l){
a.push(sib[i]);
)
)
returna;
*9、函數(shù)名稱:getEleChildren()
*功能描述:獲得元素ele下指定標(biāo)記名為tagName的所有子元素,第二個(gè)參數(shù)可選,表示的是指定標(biāo)
簽名的子元素
*思路:
*________________*/
functiongetEleChildren(ele,tagName){
if(ele&&ele.nodeType&&ele.nodeType===1){
if(tagName&&typeoftagName=='string'){
tagName=tagName.toUpperCase();
vara=[];
varch=ele.childNodes;
for(vari=O;i<ch.length;i++){
if(ch[i].nodeType===l&&ch[i].tagName==tagName){
a.push(ch[i]);
}
)
returna;
}else{〃如果第二個(gè)參數(shù)沒有傳
vara=[];
varch=ele.childNodes;
for(vari=O;i<ch.length;i++){
if(ch[i].nodeType===1){
a.push(ch[i]);
)
)
returna;
)
}else{〃判斷第一個(gè)參數(shù)
alert('argumentserror!');
*10、函數(shù)名稱:getLastEle()
*功能描述:在所有的元素節(jié)點(diǎn)集eles中找出最后元素節(jié)點(diǎn),在引用此方法時(shí)注意取獲得的數(shù)組的第一個(gè)
值
*思路:調(diào)用判斷最后元素的方法,循環(huán)判斷后將最后一個(gè)元素放進(jìn)數(shù)組中返回
**/
functiongetLastEle(eles){
if(eles&&eles.length&&eles.length>O){
vara=[];
for(vari=O;i<eles.length;i++){〃先判斷這一組元素里,有沒有不是元素節(jié)點(diǎn)
if(eles[iJ&&eles[iJ.nodeType&&eles[i].nodeType===1){//獲取當(dāng)前元素的下一個(gè)弟弟元素
varele=getNextOne(eles[i]);
if(ele==null){〃如果它不存在弟弟,則說明它就是老小
a.push(eles[i]);
)
}else{
alert,參數(shù)中的第,+i4個(gè)對(duì)象,不符合條件!);
thrownewError。參數(shù)中的第,+i+,個(gè)對(duì)象,不符合條件!,);
)
)
returna;
)
11、函數(shù)名稱:getFirstEle()
*功能描述:在所有的元素節(jié)點(diǎn)集eles中找出第一個(gè)元素節(jié)點(diǎn),在引用此方法時(shí)注意取獲得的數(shù)組的第一
個(gè)值
*思路:判斷元素的哥哥節(jié)點(diǎn)是否存在,如果不存在,即是第一個(gè)元素節(jié)點(diǎn)
**/
functiongetFirstEle(eles){
if(eles&&eles.length&&eles.length>O){
vara=[];
for(vari=O;i<eles.length;i++){
if(eles[i]&&eles[i].nodeType&&eles[i].nodeType===l){
varele=getPreEle(eles[i]);
if(ele==null){〃如果它不存在弟弟,則說明它就是老小
a.push(eles[i]);
)
)else{
aler(參數(shù)中的第二i4個(gè)對(duì)象,不符合條件!)
thrownewError,參數(shù)中的第四+,個(gè)對(duì)象,不符合條件!,);
returna;
)
*12、函數(shù)名稱:insertAfter。
*功能描述:此方法和appendChild方法對(duì)應(yīng),把要插入的元素追加在目標(biāo)元素的后面,oldEle會(huì)被移除
*思路:
**/
functioninsertAfter(oldEle,newEle){
if(oldEle&&oIdEle.nodeType&&oldEle.nodeType===l&&newEle&&newEle.nodeType&&newEle.node
Type===l){
if(oldEle.nextSibling){//如果okiEle對(duì)象有弟弟節(jié)點(diǎn),則追加在它弟弟的前面
oldEle.parentNode.insertBefore(newEle,oldEle.nextSibling);
}else{
oldEle.parentNode.appendChild(newEle);
)
}else{
thrownewError('參數(shù)錯(cuò)誤');
*13、函數(shù)名稱:prepend()
*功能描述:此方法和nsertBefore功能對(duì)應(yīng),把newNode這個(gè)節(jié)點(diǎn)插入到parentEle元素前面
*思路:
**/
functionprepend(newNode,oldEle){
varchild=oldEle.firstChild;
if(child){
oldEle.insertBefore(newNode,oldEle.firstChild);
}else{
oldEle.appendChild(newNode);
*14、函數(shù)名稱:text。
*功能描述:獲取或設(shè)置網(wǎng)頁元素節(jié)點(diǎn)文本值的方法,只傳ele參數(shù)是獲取ele元素中的文本值,傳str
是設(shè)置ele的文本值
*思路:主要處理火狐不支持innerText這個(gè)屬性的問題
**/
functiontext(ele,str){〃如果第一個(gè)參數(shù)是元素類型
if(ele&&ele.nodeType&&ele.nodeType===1){//如果第二個(gè)參數(shù)沒有傳過來
if(str===undefined){〃判斷瀏覽器是否支持textContent屬性,若支持則此屬性的類型為string,
否則為undefined
if(typeofele.textContent=-string1){
returnele.textContent;//標(biāo)準(zhǔn)瀏覽器都支持,DOM2的屬性
}else{
returnele.innerText;//火狐不支持
)
)
elseif(typeofstr=='string,){
〃如果傳了第二個(gè)參數(shù),并且第二個(gè)參數(shù)的類型正確,則給此元素設(shè)置文本值
if(typeofele.textContent=-string1){
ele.textContent=str;
}else{
ele.innerText=str;
)
}else{
alert('第二個(gè)參數(shù)str有誤');
thrownewError,第二個(gè)參數(shù)str有誤');
)
}else{
alert('M一個(gè)參數(shù)ele誤!);
thrownewError('第二個(gè)參數(shù)str有誤');
*15、函數(shù)名稱:getElesByClass()
*功能描述:解決IE6/7/8不支持document.getElementsByClassName,通過此方法可以獲取指定元素ele
下具有多個(gè)類名的目標(biāo)元素
*思路:此方法運(yùn)用正則匹配類名,再獲取對(duì)應(yīng)元素。這是用兩個(gè)方法來實(shí)現(xiàn)的,是為了降低難度
**/
functiongetElesByClass(sti-Class,ele){
varregl=/Ns+|\s+$/g;〃此正則去首尾空格,就是把首屬多余的空格去掉,以免下面的循環(huán)有空操作
strClass=strClass.replace(reg1
ele=ele||document;〃判斷ele參數(shù)是否傳了,如果沒傳ele,則讓ele為docuemtn
if(ele.getElementsByClassName){
returnele.getElementsByClassName(strClass);
}else{
varaClass=strClass.split(八s+/);〃以空格為格為分隔符,把各個(gè)類名字符串分解到成數(shù)組
vareles=ele.getElementsByTagName(**');//
vara=[];
for(vari=O;i<aClass.length;i++){
eles=getEle(aClass[i],eles);〃調(diào)用getEle方法循環(huán)篩選滿意條件的元素。其實(shí)就是
找到類名的交集。這個(gè)方法在下面定義的
)
returneles
*16、函數(shù)名稱:getEleO這個(gè)方法僅供上面的getElesByClass方法用。是獨(dú)立出來的核心模塊
*功能描述:在一組DOM對(duì)象集合(參數(shù):eles)里通過單一類名(參數(shù)strClass)獲取元素。
*思路:注意獲取后的目標(biāo)元素是放在一個(gè)數(shù)組中,使用時(shí)應(yīng)注意
*_______________*/
functiongetEle(strClass,eles){
vara=[];
for(vari=0,1en=eles.length;i<len;i++){〃注意這個(gè)正則不要定義在循環(huán)外邊
varreg=newRegExp("(?”|)"+strClass+"(?:|$)");〃這個(gè)iE貝!J是修正之后的
if(reg.test(eles[i].className)){〃滿意這個(gè)正則驗(yàn)證的,說明此元素中類名中肯定有strClass這個(gè)
變量指定的類名,則放到數(shù)組里
a.push(eles[i]);
returna;
*17、函數(shù)名稱:addClass()
*功能描述:增加類樣式的方法
*思路:每個(gè)新增加的類名都是一個(gè)字符串,用空格將其和前名的類名隔開就好
*_______________*/
functionaddClass(ele,className){
if(ele&&ele.nodeType&&ele.nodeType===l&&className&&typeofclassName==,string,){
〃判斷參數(shù)類型對(duì)不對(duì)前三個(gè)是判斷第一個(gè)參數(shù)是否正確,后兩個(gè)是判斷第二個(gè)參數(shù)是否正確
varreg=newRegExp("(?:八|)"+strClass+"(?:|$)");〃這個(gè)正則是修正之后的
if(!reg.test(ele.className)){〃如果原來沒有這個(gè)類樣式,則加上
ele.className+=""+className;〃注意這里是在空格后再累加上此類名。前名是空格,不是
空字符串
)
*18、函數(shù)名稱:removeClass()
*功能描述:移除類的方法
*思路:定義一個(gè)正則表達(dá)式,將正則匹配到的單詞,用空字符串替換掉
*_______________*/
functionremoveClass(ele,className){
if(ele&&ele.nodeType&&ele.nodeType===1&&className&&typeofclassName==,string,){
varreg=newRegExp(M(?:A|)"+strClass+"(?:l$)"Jg"):〃這個(gè)正則是修正之后的。注意第二個(gè)參數(shù)g
//定義一個(gè)匹配單詞邊界的正則,并且是全文匹配(加了模式符g)
ele.className=ele.className.replace(regJ);
*19、函數(shù)名稱:hasClass()
*功能描述:判斷某元素上是不是有某個(gè)類
*思路:用正則表達(dá)式匹配類型,判斷元素的類名和傳入的字符串是否一致即可判斷
*_______________*/
functionhasClass(ele,strClass){〃確定傳入的ele為元素,strClass為字符串
if(ele&&ele.nodeType==l&&(typeofstrClass=='string')){
varreg=newRegExp"?:八|)"+strClass+"(?:|$)");〃這個(gè)正則是修正之后的
if(reg.test(ele.className)){
returntrue;
}else{
returnfalse;
)
*20、函數(shù)名稱:getlndex()【第一種思路】
*功能描述:獲取元素的索引值的方法
*思路:先得到這個(gè)元素父元素的所有元素節(jié)點(diǎn),逐一比較并讓計(jì)數(shù)器加1,如果有和自己相同的元
素,則返回當(dāng)前的記數(shù)
*_______________*/
functiongetlndex(ele){
if(ele&&ele.nodeType&&ele.nodeType===1){
varparent=ele.parentNode;〃獲得此元素的父親節(jié)點(diǎn)
vareles=getEleChildren(parent);〃獲得包括自己在內(nèi)的所有兄弟節(jié)點(diǎn)
for(vari=O;i<eles.length;i++)
{//一一對(duì)比,如果發(fā)現(xiàn)自己和某個(gè)節(jié)點(diǎn)對(duì)比是一樣的,那么當(dāng)前的i就是自己的索引值
if(ele==eles[i]){
returni;
)
)
}else{
alert('argumenterror!');
*21、函數(shù)名稱:getIndexNum()【第二種思路】
*功能描述:獲取元素的索引值的方法
*思路:通過獲取哥哥元素節(jié)點(diǎn)的方法來獲取當(dāng)前元素索引值
**/
functiongetlndexNum(ele){
vam=0;
varpre=ele.previousSibling;
while(pre){〃總是去判斷有沒有哥哥
if(pre.nodeType==1){〃如果哥哥是個(gè)元素
n++;〃則n累加一下
)
pre=pre.previousSibling濰續(xù)判斷下一個(gè)哥哥
)
returnn;
*22、函數(shù)名稱:listToArray。
次功能描述:將nodeList類型轉(zhuǎn)化為數(shù)組
*思路:
**/
functionlistToAnay(eles){
try(
returnAtotype.slice.call(eles,0);
〃或用[].slice.caH(eles,0)這樣的方式。
}catch(e){
在IE/6/7里,DOM集合不是JS對(duì)象,不能用n.slice.call(eles,O)這樣的操作,會(huì)出異常
vara=[];
for(vari=O;i<eles.length;i++){
a.push(eles[i])
)
returna;
*23、函數(shù)名稱:getPos()
*功能描述:獲取元素相對(duì)于屏幕距離
*思路:
**/
functiongetPos(ele){
varx=ele.offsetLeft;
vary=ele.offsetTop;
varp=ele.offsetParent;//一定要理解好offsetParent是什么
while(p&&p!=document.body){〃解決IE8中的BUG
if(window.navigator.userAgent.indexOf('MSIE{〃判斷是不是IE8
x+=p.offsetLeft;
y+=p.offsetTop;
}else{
x+=p.offsetLeft+p.clientLeft;//clientLeft是左這框的寬。偏移量不包括邊框的寬,所以要加進(jìn)
去(IE8除外)
y+=p.offsetTop+p.clientTop;
)
p=p.offsetParent;
)
varobj={);
obj.x=x;
obj.y=y;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit 1 My day PartB(教學(xué)設(shè)計(jì))-2023-2024學(xué)年人教PEP版英語五年級(jí)下冊(cè)
- 股權(quán)劃轉(zhuǎn)合同范本
- 12 早睡早起 第1課時(shí) 教學(xué)設(shè)計(jì)-2023-2024學(xué)年道德與法治一年級(jí)上冊(cè)統(tǒng)編版
- 3主動(dòng)拒絕煙酒與毒品 第一課時(shí) 教學(xué)設(shè)計(jì)-2024-2025學(xué)年道德與法治五年級(jí)上冊(cè)統(tǒng)編版
- 廣東律師合同范本
- 2023-2024學(xué)年天津市中小學(xué)生mixly創(chuàng)意編程 第14課 走8字的小車-教學(xué)設(shè)計(jì)
- 安全教育家長(zhǎng)會(huì)演講稿
- 10《青山處處埋忠骨》教學(xué)設(shè)計(jì)-2024-2025學(xué)年五年級(jí)下冊(cè)語文統(tǒng)編版
- 4 平平安安回家來 第一課時(shí) 教學(xué)設(shè)計(jì)-2024-2025學(xué)年道德與法治一年級(jí)上冊(cè)(統(tǒng)編版五四制)
- 7 散文詩二首2024-2025學(xué)年新教材七年級(jí)上冊(cè)語文新教學(xué)設(shè)計(jì)(統(tǒng)編版2024)
- 2024年牛排行業(yè)分析報(bào)告及未來發(fā)展趨勢(shì)
- 車間維修現(xiàn)場(chǎng)安全操作規(guī)程范文
- 【全套】醫(yī)院智能化系統(tǒng)報(bào)價(jià)清單
- 北師大版五年級(jí)數(shù)學(xué)上冊(cè)典型例題系列之期中專項(xiàng)練習(xí):分段計(jì)費(fèi)問題(解析版)
- 1到六年級(jí)古詩全部打印
- 新聞學(xué)概論(復(fù)習(xí)重點(diǎn)內(nèi)容)
- 功率測(cè)量模塊的軟件設(shè)計(jì)方案與實(shí)現(xiàn)
- 火龍罐療法經(jīng)典課件
- 核島通風(fēng)系統(tǒng)介紹
- 我見證改革開放三十年課件
- xxxx智能化工程施工進(jìn)度計(jì)劃表
評(píng)論
0/150
提交評(píng)論