JavaScript更改class和id的方法
更新時(shí)間:2008年10月10日 22:15:12 作者:
JavaScript允許你更改元素的class或id。當(dāng)你更改之后,瀏覽器會(huì)自動(dòng)更新元素的樣式。
是className,可不是class
注意JavaScript使用的是className去訪問(wèn)class屬性,因?yàn)閏lass是一個(gè)保留關(guān)鍵字,因?yàn)閷?lái)JavaScript可能開(kāi)始支持像Java一樣的類。
我們?cè)谟懻搒tyle屬性時(shí)遇到了棘手的細(xì)節(jié)問(wèn)題和瀏覽器差異性帶來(lái)的麻煩,正如同經(jīng)歷一場(chǎng)驚濤駭浪。而class和id的更改則像是沙漠里一片平靜的綠洲,瀏覽器們?cè)谶@里和諧相處。思考這個(gè)例子:
p {
color: #000000; /* black */
}
p.emphasis {
color: #cc0000; /* red */
}
<p id="test">Test</p>
最初,該段落沒(méi)有定義class,所以它的字體顏色是黑色。不過(guò),一行JavaScript就足以改變它的樣式:
document.getElementById('test').className = 'emphasis';
瞬間文字變成了紅色。如果想要改變回來(lái),你可以按如下操作:
document.getElementById('test').className = '';
你移除了樣式,該段落恢復(fù)到默認(rèn)的p{}規(guī)則。
對(duì)于一個(gè)實(shí)際應(yīng)用中的例子,看看“限長(zhǎng)的文本輸入?yún)^(qū)”。計(jì)數(shù)器有這樣的結(jié)構(gòu)和呈現(xiàn)樣式(該結(jié)構(gòu)由JavaScript動(dòng)態(tài)生成,不過(guò)那不影響這個(gè)例子):
<div class="counter"><span>12</span>/1250</div>
div.counter {
font-size: 80%;
padding-left: 10px;
}
span.toomuch {
font-weight: 600;
color: #cc0000;
}
當(dāng)腳本發(fā)現(xiàn)用戶輸入的文字一定達(dá)到了最大長(zhǎng)度,它修改作為計(jì)數(shù)器的<span>的class為toomuch:
[限長(zhǎng)的文本輸入?yún)^(qū),第20~23行]
if (currentLength > maxLength)
this.relatedElement.className = 'toomuch';
else
this.relatedElement.className = '';
現(xiàn)在,作為計(jì)數(shù)器的<span>字體變成粗體和紅色。
id的變更以幾乎完全一樣的方式工作:
p {
color: #000000; /* black */
}
p#emphasis {
color: #cc0000; /* red */
}
<p>Test</p>
document.getElementsByTagName('p')[0].id = 'emphasis';
該段落的文字再次變成了紅色。但是,我建議你不要過(guò)多改變id。除了作為CSS的鉤子,它們也常常作為JavaScript的鉤子,改變它們可能存在不確定的副作用。
增加class
通常,你不會(huì)給一個(gè)元素的class設(shè)置新值,而只是添加一個(gè)class。因?yàn)槟悴幌M瞥匾呀?jīng)擁有的任何樣式。因?yàn)镃SS允許復(fù)合樣式,新class所包含的樣式被添加到元素上,不會(huì)移除任何已經(jīng)存在的class的CSS指令。
“表單驗(yàn)證”中的writeError()和removeError()函數(shù)是一個(gè)很好的例子。一般來(lái)說(shuō)我會(huì)給表單域應(yīng)用好幾個(gè)class,因?yàn)閳D形設(shè)計(jì)師經(jīng)常對(duì)輸入框使用兩個(gè)甚至三個(gè)寬度。當(dāng)一個(gè)表單域包含錯(cuò)誤的時(shí)候,我希望添加一個(gè)特別的警告樣式,但我不希望攪亂該元素已經(jīng)擁有的樣式。所以,我不能簡(jiǎn)單地覆蓋舊的class值,那樣我將失去已經(jīng)指定的寬度。
看這樣的情形:
<input class="smaller" name="name" />
input.smaller {
width: 75px;
}
input.errorMessage {
border-color: #cc0000;
}
最開(kāi)始,輸入框的寬度是75px。如果腳本設(shè)置class為'errorMessage'并且刪除舊值,表單域會(huì)得到一個(gè)紅色的邊框,但也失去了它的寬度,而那樣的話可能會(huì)讓用戶感到非常迷惑。
因此,我是添加了errorMessage class:
[表單驗(yàn)證,第105~106行]
function writeError(obj,message) {
obj.className += ' errorMessage';
這段代碼取得已存在的className并在其后附加一個(gè)新的class,在它之前加一個(gè)空格。這個(gè)空格分隔新的class和任何對(duì)象可能已經(jīng)擁有的class值?,F(xiàn)在輸入框除了擁有75px寬度之外,如我們所愿地得到了紅色邊框。該表單域現(xiàn)在應(yīng)用了兩個(gè)class,HTML就好像這樣:
<input class="smaller errorMessage" name="name" />
Class在Mozilla中的名稱與空白
你可能注意到removeError()移除class的值errorMessage的時(shí)候沒(méi)有前置的空格。那是因?yàn)橐粋€(gè)瀏覽器的bug。當(dāng)你添加errorMessage到一個(gè)原來(lái)沒(méi)有值的class的時(shí)候,Mozilla會(huì)刪除前置空格。如果我們隨后執(zhí)行replace(/ errorMessage/,''),Mozilla不能移除class,它找不到字符串errorMessage,因?yàn)榍爸每崭褚呀?jīng)不在了。
移除class
一旦用戶修正了她的錯(cuò)誤,class的值errorMessage應(yīng)該被移除,但任何原來(lái)的class,比如smaller,不應(yīng)該受到影響。removeError()函數(shù)提供了這個(gè)功能:
[表單驗(yàn)證,第119~120行]
function removeError() {
this.className = this.className.replace(/errorMessage/,'');
它先取得元素的class然后替換字符串'errorMessage'為''(一個(gè)空字符)。errorMessage從class的值中被取走,但對(duì)其他的值沒(méi)有影響。表單域失去了紅色的邊框顏色,但依然維持75px的寬度。
注意JavaScript使用的是className去訪問(wèn)class屬性,因?yàn)閏lass是一個(gè)保留關(guān)鍵字,因?yàn)閷?lái)JavaScript可能開(kāi)始支持像Java一樣的類。
我們?cè)谟懻搒tyle屬性時(shí)遇到了棘手的細(xì)節(jié)問(wèn)題和瀏覽器差異性帶來(lái)的麻煩,正如同經(jīng)歷一場(chǎng)驚濤駭浪。而class和id的更改則像是沙漠里一片平靜的綠洲,瀏覽器們?cè)谶@里和諧相處。思考這個(gè)例子:
p {
color: #000000; /* black */
}
p.emphasis {
color: #cc0000; /* red */
}
<p id="test">Test</p>
最初,該段落沒(méi)有定義class,所以它的字體顏色是黑色。不過(guò),一行JavaScript就足以改變它的樣式:
document.getElementById('test').className = 'emphasis';
瞬間文字變成了紅色。如果想要改變回來(lái),你可以按如下操作:
document.getElementById('test').className = '';
你移除了樣式,該段落恢復(fù)到默認(rèn)的p{}規(guī)則。
對(duì)于一個(gè)實(shí)際應(yīng)用中的例子,看看“限長(zhǎng)的文本輸入?yún)^(qū)”。計(jì)數(shù)器有這樣的結(jié)構(gòu)和呈現(xiàn)樣式(該結(jié)構(gòu)由JavaScript動(dòng)態(tài)生成,不過(guò)那不影響這個(gè)例子):
<div class="counter"><span>12</span>/1250</div>
div.counter {
font-size: 80%;
padding-left: 10px;
}
span.toomuch {
font-weight: 600;
color: #cc0000;
}
當(dāng)腳本發(fā)現(xiàn)用戶輸入的文字一定達(dá)到了最大長(zhǎng)度,它修改作為計(jì)數(shù)器的<span>的class為toomuch:
[限長(zhǎng)的文本輸入?yún)^(qū),第20~23行]
if (currentLength > maxLength)
this.relatedElement.className = 'toomuch';
else
this.relatedElement.className = '';
現(xiàn)在,作為計(jì)數(shù)器的<span>字體變成粗體和紅色。
id的變更以幾乎完全一樣的方式工作:
p {
color: #000000; /* black */
}
p#emphasis {
color: #cc0000; /* red */
}
<p>Test</p>
document.getElementsByTagName('p')[0].id = 'emphasis';
該段落的文字再次變成了紅色。但是,我建議你不要過(guò)多改變id。除了作為CSS的鉤子,它們也常常作為JavaScript的鉤子,改變它們可能存在不確定的副作用。
增加class
通常,你不會(huì)給一個(gè)元素的class設(shè)置新值,而只是添加一個(gè)class。因?yàn)槟悴幌M瞥匾呀?jīng)擁有的任何樣式。因?yàn)镃SS允許復(fù)合樣式,新class所包含的樣式被添加到元素上,不會(huì)移除任何已經(jīng)存在的class的CSS指令。
“表單驗(yàn)證”中的writeError()和removeError()函數(shù)是一個(gè)很好的例子。一般來(lái)說(shuō)我會(huì)給表單域應(yīng)用好幾個(gè)class,因?yàn)閳D形設(shè)計(jì)師經(jīng)常對(duì)輸入框使用兩個(gè)甚至三個(gè)寬度。當(dāng)一個(gè)表單域包含錯(cuò)誤的時(shí)候,我希望添加一個(gè)特別的警告樣式,但我不希望攪亂該元素已經(jīng)擁有的樣式。所以,我不能簡(jiǎn)單地覆蓋舊的class值,那樣我將失去已經(jīng)指定的寬度。
看這樣的情形:
<input class="smaller" name="name" />
input.smaller {
width: 75px;
}
input.errorMessage {
border-color: #cc0000;
}
最開(kāi)始,輸入框的寬度是75px。如果腳本設(shè)置class為'errorMessage'并且刪除舊值,表單域會(huì)得到一個(gè)紅色的邊框,但也失去了它的寬度,而那樣的話可能會(huì)讓用戶感到非常迷惑。
因此,我是添加了errorMessage class:
[表單驗(yàn)證,第105~106行]
function writeError(obj,message) {
obj.className += ' errorMessage';
這段代碼取得已存在的className并在其后附加一個(gè)新的class,在它之前加一個(gè)空格。這個(gè)空格分隔新的class和任何對(duì)象可能已經(jīng)擁有的class值?,F(xiàn)在輸入框除了擁有75px寬度之外,如我們所愿地得到了紅色邊框。該表單域現(xiàn)在應(yīng)用了兩個(gè)class,HTML就好像這樣:
<input class="smaller errorMessage" name="name" />
Class在Mozilla中的名稱與空白
你可能注意到removeError()移除class的值errorMessage的時(shí)候沒(méi)有前置的空格。那是因?yàn)橐粋€(gè)瀏覽器的bug。當(dāng)你添加errorMessage到一個(gè)原來(lái)沒(méi)有值的class的時(shí)候,Mozilla會(huì)刪除前置空格。如果我們隨后執(zhí)行replace(/ errorMessage/,''),Mozilla不能移除class,它找不到字符串errorMessage,因?yàn)榍爸每崭褚呀?jīng)不在了。
移除class
一旦用戶修正了她的錯(cuò)誤,class的值errorMessage應(yīng)該被移除,但任何原來(lái)的class,比如smaller,不應(yīng)該受到影響。removeError()函數(shù)提供了這個(gè)功能:
[表單驗(yàn)證,第119~120行]
function removeError() {
this.className = this.className.replace(/errorMessage/,'');
它先取得元素的class然后替換字符串'errorMessage'為''(一個(gè)空字符)。errorMessage從class的值中被取走,但對(duì)其他的值沒(méi)有影響。表單域失去了紅色的邊框顏色,但依然維持75px的寬度。
您可能感興趣的文章:
- js中設(shè)置元素class的三種方法小結(jié)
- 用原生JS獲取CLASS對(duì)象(很簡(jiǎn)單實(shí)用)
- js獲取class的所有元素
- js實(shí)現(xiàn)class樣式的修改、添加及刪除的方法
- 原生js實(shí)現(xiàn)addClass,removeClass,hasClass方法
- js獲取某元素的class里面的css屬性值代碼
- js判斷樣式className同時(shí)增加class或刪除class
- javaScript給元素添加多個(gè)class的簡(jiǎn)單實(shí)現(xiàn)
- vue.js入門教程之綁定class和style樣式
- 深入理解JavaScript和TypeScript中的class
相關(guān)文章
javascript實(shí)現(xiàn)點(diǎn)擊產(chǎn)生隨機(jī)圖形
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)點(diǎn)擊產(chǎn)生隨機(jī)圖形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
使用canvas繪圖音樂(lè)頻譜示例及技術(shù)分析
這篇文章主要為大家介紹了使用canvas實(shí)現(xiàn)音樂(lè)頻譜示例及技術(shù)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
完美解決js傳遞參數(shù)中加號(hào)和&號(hào)自動(dòng)改變的方法
下面小編就為大家?guī)?lái)一篇完美解決js傳遞參數(shù)中加號(hào)和&號(hào)自動(dòng)改變的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10
javascript性能優(yōu)化之事件委托實(shí)例詳解
這篇文章主要介紹了javascript性能優(yōu)化之事件委托用法,結(jié)合實(shí)例形式對(duì)比分析了JavaScript中事件委托的具體用法與優(yōu)點(diǎn),需要的朋友可以參考下2015-12-12
深入學(xué)習(xí)JS?XML和Fetch請(qǐng)求
這篇文章主要介紹了深入學(xué)習(xí)JS?XML和Fetch請(qǐng)求,文章通過(guò)圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
深入探討JavaScript中parseInt與Number數(shù)字轉(zhuǎn)換方法的區(qū)別
在Javascript編程中,數(shù)字是一種常見(jiàn)的數(shù)據(jù)類型,經(jīng)常需要在不同的情境下進(jìn)行不同類型的操作,本文將深入探討parseInt()和Number()的區(qū)別,通過(guò)代碼示例和詳細(xì)解釋,幫助大家更好地理解它們的用途,需要的朋友可以參考下2023-08-08
識(shí)別操作系統(tǒng)是不是vista的js代碼
識(shí)別操作系統(tǒng)是不是vista的js代碼...2007-08-08
取消Bootstrap的dropdown-menu點(diǎn)擊默認(rèn)關(guān)閉事件方法
今天小編就為大家分享一篇取消Bootstrap的dropdown-menu點(diǎn)擊默認(rèn)關(guān)閉事件方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08

