中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

JavaScript跨瀏覽器獲取頁面中相同class節點的方法
來源:易賢網 閱讀:1149 次 日期:2015-03-06 10:32:00
溫馨提示:易賢網小編為您整理了“JavaScript跨瀏覽器獲取頁面中相同class節點的方法”,方便廣大網友查閱!

這篇文章主要介紹了JavaScript跨瀏覽器獲取頁面中相同class節點的方法,本文講解使用getELementsByClassName函數解決這個需求,并給了一個開源的getELementsByClassName函數實現,功能更加強大,需要的朋友可以參考下

網頁開發時,在很多時候我們需要操作相同類名的元素,即class相同的元素。昨天參加筆試,有一道相關的題目沒答上來:

JavaScript獲取頁面中class為test的節點

于是收集了一些相關的資料,在本文中列舉了兩種我覺得比較好的方法,不足之處,還望大家批評指正。如果大家有更好的方法,希望可以分享。

Solution1 Jeremy Keuth方案

Jeremy Keuth大叔在《JavaScript DOM 編程藝術》(第2版)(英文:DOM Scripting-Web Design with JavaScript and the Document Object Model)一書的第三章第四節中講到了getElementsByClass這個方法,并講到了如何在不支持該屬性的瀏覽器(IE6,IE7和IE8,讓我們鄙視他們)中應用這一方法,摘錄在此,個別地方有修改。

HTML5 DOM中新增了一個方法讓我們通過class屬性中的類名來訪問元素,這就是:getELementsByClassName,由于方法比較新,某些的DOM實現里還沒有,因此在使用的時候要當心。下面我們先來看一看這個方法能幫我們做什么,然后在討論怎么可靠的使用該方法。

與getELementsByTagName方法類似,getElementsByClassName也只接受一個參數,就是類名:

代碼如下:

getElementsByClassName(class)

這個方法的返回值也與getElementsByTagName類似,都是一個具有相同類名的元素的數組,下面這行代碼返回的就是一個數組,其中包含類名為“sale”的所有元素:

代碼如下:

document.getElementsByClassName("sale")

使用這個方法還可以查找那些帶有多個類名的元素。要指定多個類名,只要在字符串參數中用空格分隔類名即可。例如,在<script>標簽中添加下面這行代碼:

代碼如下:

alert(document.getElementsByClassName("sale important").length);

完整代碼

代碼如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>Shopping List</title>

</head>

<body>

<h1>What to buy</h1>

<p title="a gentle reminder">Don't forget to buy this stuff.</p>

<ul id="purchase">

<li>A thin of beans</li>

<li class="sale">Cheese</li>

<li class="sale important">Milk</li>

</ul>

<script>

alert(document.getElementsByClassName("sale important").length);

</script>

</body>

</html>

你會看到警告框中顯示1,表示只有一個元素匹配,因為只有一個元素同時帶有”important”和”sale”類名。注意,即使在元素的class屬性中,類名的順序是”sale important”而非參數中指定的”important sale”,也會照樣匹配該元素。不僅類名的實際順序不重要,就算元素還帶有更多類名也沒有關系。與使用getELementsByTagName一樣,也可以組合使用getElementsByClassName和getElementById。如果你想知道在id為purchase的元素中有多少類名包含test的列表項,可以先找到那個特定的對象,然后再調用getElementsByClassName:

代碼如下:

var shopping=document.getElementById("purchase");

var sales = shopping.getElementsByClassName("sale");

這樣,sales數組中包含的就只是位于”purchase”列表中的帶有”sales”類的元素,運行下面這行代碼,就會看到sales數組包含兩項:

代碼如下:

alert(sales.length);

這個getELementsByClassName方法非常有用,但只有較新的瀏覽器(Safari 3.1,Chorme,Firefox 3 and Opera 9.5以上)才支持它。為了彌補這一不足,DOM腳本程序員需要使用已有的DOM方法來實現自己的getElementsByClassName,有點像成人禮似的。而多數情況下,他們的實現過程都與下面這個getElementsByClassName大致相似,這個函數能適用于新老瀏覽器。

代碼如下:

function getElementsByClassName(node,classname){

if(node.getElementsByClassName){

return node.getElementsByClassName(classname);

}else{

var results = [];

var elems = node.getElementsByTagName("*");

for(var i=0;i<elems.length;i++){

if(elems[i].className.indexOf(classname)!=-1){

results[results.length]=elems[i];

}

}

return results;

}

}

這個getElementsByClassName函數接受兩個參數。第一個node表示DOM樹中的搜索起點,第二個classname就是要搜索的類名了。如果傳入節點上已經存在了適當的getElementsByClassName函數,那么這個新函數就直接返回相應的節點列表。如果getElementsByClassName函數不存在,這個新函數就會循環遍歷所有標簽,查找帶有相應類名的元素。

這個方法的缺點是不適用于多個類名。

如果使用這個函數來模擬前面取得購物列表的操作,就可以這樣寫:

代碼如下:

var shopping=document.getElementById("purchase");

var sales = shopping.getElementsByClassName(shopping,"test");

console.log(sales);

因此,要解決文章開頭的那道題目,所用代碼如下:

代碼如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>Shopping List</title>

</head>

<body>

<h1>What to buy</h1>

<p title="a gentle reminder">Don't forget to buy this stuff.</p>

<ul id="purchase">

<li>A thin of beans</li>

<li class="sale">Cheese</li>

<li class="sale important">Milk</li>

</ul>

<script>

function getElementsByClassName(node,classname){

if(node.getElementsByClassName){

return node.getElementsByClassName(classname);

}else{

var results = [];

var elems = node.getElementsByTagName("*");

for(var i=0;i<elems.length;i++){

if(elems[i].className.indexOf(classname)!=-1){

results[results.length]=elems[i];

}

}

return results;

}

}

var body = document.getElementsByTagName("body")[0];

var sales= getElementsByClassName(body,"sales");

console.log(sales);

</script>

</body>

</html>

Solution2 Robert Nyman方案

搜索匹配的DOM元素的方法還有很多,但真正高效的卻不多,Jeremy Keuth大叔的方法有一個缺點就是不能用于多個類名,2008年,Robert Nyman在文章 The Ultimate GetElementsByClassName, Anno 2008中提供了自己的解決方案。在2005年,Robert大叔就已經給出了自己的getElementsByClassName的函數,在2008年的時候,修改了部分代碼,添加了許多新的功能:

1.如果當前瀏覽器支持getElementsByClassName函數,則調用該原生函數;

2.如果當前瀏覽器支持則使用XPath;//小飛魚:一種瀏覽器內置的定位XML文檔的強大方式,不過瀏覽器支持方面不統一

3.支持多個類名的搜索,不計先后順序;

4.返回真正的節點數組,而不是原生的一個nodelist。//小飛魚:原生的getElementsByClassName方法返回的是一個NodeList對象,它很像數組,有length和數字索引屬性,但并不是數組,不能用pop,push等數組特有的方法,Robert提供的代碼中,將NodeList對象轉成了數組。可以將NodeList對象轉換成數組的方法:

代碼如下:

myList = Array.prototype.slice.call (myNodeList)

這是Robert大叔的方法,有些地方還不太明白,待我研究一下再來更新好了。

代碼如下:

/*

Developed by Robert Nyman,

Code/licensing:

*/

var getElementsByClassName = function (className, tag, elm){

if (document.getElementsByClassName) {

getElementsByClassName = function (className, tag, elm) {

elm = elm || document;

var elements = elm.getElementsByClassName(className),

nodeName = (tag)? new RegExp("" + tag + "", "i") : null,

returnElements = [],

current;

for(var i=0, il=elements.length; i<il; i+=1){

current = elements[i];

if(!nodeName || nodeName.test(current.nodeName)) {

returnElements.push(current);

}

}

return returnElements;

};

}

else if (document.evaluate) {

getElementsByClassName = function (className, tag, elm) {

tag = tag || "*";

elm = elm || document;

var classes = className.split(" "),

classesToCheck = "",

xhtmlNamespace = "",

namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,

returnElements = [],

elements,

node;

for(var j=0, jl=classes.length; j<jl; j+=1){

classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";

}

try {

elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);

}

catch (e) {

elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);

}

while ((node = elements.iterateNext())) {

returnElements.push(node);

}

return returnElements;

};

}

else {

getElementsByClassName = function (className, tag, elm) {

tag = tag || "*";

elm = elm || document;

var classes = className.split(" "),

classesToCheck = [],

elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),

current,

returnElements = [],

match;

for(var k=0, kl=classes.length; k<kl; k+=1){

classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "()"));

}

for(var l=0, ll=elements.length; l<ll; l+=1){

current = elements[l];

match = false;

for(var m=0, ml=classesToCheck.length; m<ml; m+=1){

match = classesToCheck[m].test(current.className);

if (!match) {

break;

}

}

if (match) {

returnElements.push(current);

}

}

return returnElements;

};

}

return getElementsByClassName(className, tag, elm);

};

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
老牛嫩草一区二区三区日本 | 亚洲国产第一页| 伊人夜夜躁av伊人久久| 99国产精品久久久久老师| 久久精品男女| 精品动漫3d一区二区三区免费版| 激情成人av| 亚洲乱码国产乱码精品精98午夜| 亚洲视频图片小说| 久久综合久久久| 国产精品jizz在线观看美国 | 国产精品青草综合久久久久99 | 狠狠爱成人网| 国产精品乱子久久久久| 欧美精品福利视频| 欧美日本二区| 国产精品亚洲第一区在线暖暖韩国| 国产亚洲第一区| 国产一区二区主播在线| 亚洲国产精品99久久久久久久久| 日韩视频精品在线| 亚洲欧美日产图| 欧美日韩中文字幕综合视频 | 欧美连裤袜在线视频| 国产日韩欧美自拍| 激情视频一区二区| 欧美一区=区| 激情av一区二区| 欧美精品免费在线观看| 欧美日一区二区在线观看 | 欧美日韩国产首页| 1024亚洲| 欧美1区免费| 在线观看成人小视频| 夜夜狂射影院欧美极品| 国产精品福利在线观看网址| 国产精品免费视频观看| 欧美经典一区二区三区| 欧美电影在线免费观看网站| 久久久精品国产免费观看同学| 欧美日韩亚洲三区| 欧美高清自拍一区| 久久九九热免费视频| 亚洲欧美激情视频| 亚洲欧美日韩国产一区| 亚洲综合清纯丝袜自拍| 欧美日韩亚洲综合一区| 欧美制服第一页| 亚洲精品国产精品国自产在线| 欧美国产国产综合| 亚洲免费在线精品一区| 激情六月综合| 欧美精品一区视频| 久久亚洲不卡| 99国产精品99久久久久久| 99精品欧美一区| 国产精品毛片a∨一区二区三区| 久久精品国产精品亚洲| 久久精品国产69国产精品亚洲| 在线精品国产成人综合| 欧美专区亚洲专区| 一区二区三区久久| 在线日韩欧美视频| 欧美视频亚洲视频| 欧美精品亚洲一区二区在线播放| 欧美一区二区在线免费观看 | 国产视频观看一区| 欧美精品三级在线观看| 久久一区二区三区四区| 午夜久久美女| 午夜免费电影一区在线观看| 亚洲精品中文字幕有码专区| 亚洲黄色免费电影| 国产日韩在线看片| 国产一区二区三区久久久| 欧美日韩午夜精品| 欧美日精品一区视频| 欧美日韩精品| 国产精品高清一区二区三区| 国产精品丝袜xxxxxxx| 国产日韩视频| 最新国产成人在线观看| 亚洲人成网站影音先锋播放| 亚洲国产日韩欧美在线图片| 亚洲第一在线综合在线| 亚洲人成绝费网站色www| 亚洲免费av电影| 亚洲视频精选| 久久视频一区二区| 欧美精品色网| 国产日韩在线看片| 国产欧美精品日韩| 亚洲国产中文字幕在线观看| 亚洲精品中文字幕有码专区| 亚洲自拍都市欧美小说| 免费日本视频一区| 国产精品你懂的在线欣赏| 加勒比av一区二区| 亚洲综合国产| 欧美日韩国产精品自在自线| 国内精品久久久久久久影视麻豆| 亚洲欧洲在线观看| 久久久亚洲人| 欧美激情精品久久久久久大尺度| 国产精品羞羞答答| 艳妇臀荡乳欲伦亚洲一区| 欧美亚洲视频在线观看| 欧美成人高清| 伊大人香蕉综合8在线视| 亚洲免费一在线| 国产精品你懂的在线| 亚洲欧洲日本mm| 另类成人小视频在线| 狠狠色丁香久久婷婷综合丁香| 午夜精品久久久久久99热| 久久婷婷亚洲| 亚洲一区二区三区中文字幕| 亚洲国产精品小视频| 国产一级精品aaaaa看| 久久综合狠狠| 欧美aa国产视频| 久久综合色影院| 欧美在线免费观看| 亚洲午夜日本在线观看| 国产视频欧美| 国产真实乱子伦精品视频| 国产亚洲精品综合一区91| 国产精品第一页第二页第三页| 欧美久久婷婷综合色| 欧美国产日韩一二三区| 欧美成人综合网站| 日韩午夜在线观看视频| 亚洲精品日产精品乱码不卡| 日韩视频三区| 久久精品日韩| 久久天天躁夜夜躁狠狠躁2022| 欧美激情一区二区久久久| 久久久久国产精品午夜一区| 国产日韩在线看| 99热在这里有精品免费| 亚洲欧美视频| 久久夜色精品国产亚洲aⅴ| 永久91嫩草亚洲精品人人| 性欧美暴力猛交69hd| 亚洲第一网站免费视频| 亚洲国产精品久久久久秋霞不卡| 国产综合在线视频| 一区二区三区高清不卡| 小黄鸭精品aⅴ导航网站入口| 99精品视频免费全部在线| 欧美亚洲自偷自偷| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美精品一区二| 欧美精品久久久久久久免费观看| 国产日韩欧美在线播放| 在线日韩av永久免费观看| 一区二区免费在线视频| 欧美日韩高清区| 亚洲一级片在线观看| 欧美日韩中文字幕日韩欧美| 欧美日韩国产123| 欧美日韩国产精品 | 榴莲视频成人在线观看| 欧美成人午夜影院| 欧美第十八页| 国产一区二区按摩在线观看| 黄色精品网站| 亚洲欧洲在线视频| 国产精品h在线观看| 国内精品亚洲| 国产精品日韩高清| 欧美成人免费在线视频| 久久精品72免费观看| 日韩写真在线| 美女日韩欧美| 欧美有码视频| 久久久www成人免费无遮挡大片| 欧美视频精品在线| 欧美精品一级| 欧美一区二区性| 久久成人精品视频| 久久av一区二区三区| 久久精品卡一| 玖玖视频精品| 欧美怡红院视频| 亚洲自拍偷拍一区| 欧美一区二区精品| 欧美**人妖| 欧美日韩成人综合| 欧美精品乱人伦久久久久久 | 久久久精品视频成人| 老牛国产精品一区的观看方式| 国产精品久久久久久妇女6080| 一区二区三区精密机械公司| 欧美一区二区三区四区视频| 亚洲最新色图| 久久久国产精品一区二区中文| 欧美在线国产精品| 欧美日韩国产麻豆| 国产欧美va欧美va香蕉在|