亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

JavaScript跨瀏覽器獲取頁面中相同class節點的方法

2024-05-06 16:15:47
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了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 style="border-left-color: rgb(0, 153, 204); border-left-width: 1px; border-left-style: solid; padding: 0px 3px; margin: 3px auto 0px; width: 640px; background-color: rgb(242, 246, 251); clear: both; border-top-color: rgb(0, 153, 204); border-top-width: 1px; border-top-style: solid; border-right-color: rgb(0, 153, 204); border-right-width: 1px; border-right-style: solid;"> 復制代碼代碼如下:

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 style="border-left-color: rgb(0, 153, 204); border-left-width: 1px; border-left-style: solid; padding: 0px 3px; margin: 3px auto 0px; width: 640px; background-color: rgb(242, 246, 251); clear: both; border-top-color: rgb(0, 153, 204); border-top-width: 1px; border-top-style: solid; border-right-color: rgb(0, 153, 204); border-right-width: 1px; border-right-style: solid;"> 復制代碼代碼如下:

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

 

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

 

復制代碼代碼如下:

/*
Developed by Robert Nyman, http://www.robertnyman.com
Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/
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("//b" + tag + "//b", "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 = "http://www.w3.org/1999/xhtml",
                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] + "(//s|$)"));
            }
            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);
};

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区免费视频| 午夜精品福利在线观看| 久久99久久久久久久噜噜| 久久久国产91| 亚洲另类xxxx| 九色精品免费永久在线| 91精品国产高清久久久久久| 亚洲视频综合网| 国产亚洲欧美日韩精品| 高清欧美性猛交xxxx| 欧美日韩亚洲激情| 九九热这里只有在线精品视| 亚洲少妇激情视频| 欧美中文字幕在线观看| 国产欧美日韩中文字幕在线| 欧美成人第一页| 日本免费在线精品| 亚洲国产免费av| 日韩成人小视频| 97在线视频免费看| 欧美日韩亚洲精品内裤| 91美女高潮出水| 日本精品va在线观看| 日韩高清欧美高清| 欧美美最猛性xxxxxx| 亚洲一区二区三区四区在线播放| 日韩中文字幕不卡视频| 97超碰蝌蚪网人人做人人爽| 久久久免费在线观看| 国产精品久久久久久av福利| 国产欧美一区二区白浆黑人| 在线观看视频99| 国产精品午夜一区二区欲梦| 国产一区视频在线| 国产一区二区三区毛片| 91精品国产91久久久久久最新| 成人免费大片黄在线播放| 亚洲天堂2020| 欧美小视频在线观看| 中文字幕久久久av一区| 欧美在线视频在线播放完整版免费观看| 91老司机在线| 国产日韩欧美在线| 最近更新的2019中文字幕| 成人性教育视频在线观看| 国产精品极品美女在线观看免费| 在线电影欧美日韩一区二区私密| 亚洲视频在线观看免费| 国产精品久久久久久久久| 日韩美女视频在线观看| 九九热精品视频国产| 亚洲淫片在线视频| 亚洲伊人久久综合| 国产亚洲激情视频在线| 亚洲伦理中文字幕| 热久久免费视频精品| 久久国产精彩视频| 色爱av美腿丝袜综合粉嫩av| 久久偷看各类女兵18女厕嘘嘘| 91黑丝在线观看| 精品国产91久久久久久老师| 国产综合久久久久久| 97色在线视频| 国产乱肥老妇国产一区二| 亚洲精品视频网上网址在线观看| 亚洲在线免费看| 国产成人激情小视频| 在线观看国产欧美| 91av在线影院| 欧美老女人性生活| 国产成人+综合亚洲+天堂| 国产精品视频免费在线| 欧美日韩第一视频| 按摩亚洲人久久| 亚洲自拍偷拍色片视频| 91在线中文字幕| 国产日产久久高清欧美一区| 久久久久久久成人| 国产美女搞久久| 欧美人交a欧美精品| 久久伊人精品一区二区三区| 亚洲第一综合天堂另类专| 66m—66摸成人免费视频| 国模吧一区二区| 国产精品丝袜久久久久久不卡| 精品久久久久久久久久ntr影视| 丝袜美腿精品国产二区| 精品亚洲一区二区三区在线播放| 色无极亚洲影院| 青青久久aⅴ北条麻妃| 久久久av免费| 欧美国产亚洲视频| 中文字幕日本精品| 国产女同一区二区| 亚洲第一精品夜夜躁人人躁| 庆余年2免费日韩剧观看大牛| 久久福利视频导航| 日韩精品高清视频| 亚洲精品日韩欧美| 久久久久久久久久久免费精品| 色噜噜狠狠色综合网图区| 久久成年人免费电影| 永久免费毛片在线播放不卡| 亚洲福利精品在线| 欧美裸身视频免费观看| 欧洲成人免费aa| 黑人巨大精品欧美一区二区三区| 国产精品嫩草影院一区二区| 日韩激情在线视频| 亚洲成人亚洲激情| 全球成人中文在线| 欧美亚洲一区在线| 国产情人节一区| 最近2019中文字幕第三页视频| 欧美日韩福利在线观看| 欧美综合在线第二页| 国产欧美日韩精品专区| 日日噜噜噜夜夜爽亚洲精品| 亚洲福利在线视频| 亚洲国产精品悠悠久久琪琪| 欧美一级片久久久久久久| 日韩视频永久免费观看| 国产精品成人在线| 成人国产精品色哟哟| 国产精品成人在线| 久久亚洲精品一区| 日韩精品视频在线| 日日骚av一区| 国产日本欧美一区二区三区在线| 国产在线日韩在线| 久久午夜a级毛片| 国产精品久久91| 精品亚洲va在线va天堂资源站| 中文一区二区视频| 国产精品免费网站| 欧美自拍大量在线观看| 亚洲综合中文字幕在线观看| 人人澡人人澡人人看欧美| 韩国美女主播一区| 欧美日韩爱爱视频| 91精品国产网站| 这里只有精品丝袜| 久久综合九色九九| 成人国产精品久久久久久亚洲| 日本精品视频在线观看| 欧美乱人伦中文字幕在线| 国产福利精品在线| 亚洲一级一级97网| 精品国产欧美成人夜夜嗨| 精品亚洲一区二区三区| 亚洲的天堂在线中文字幕| 欧美在线欧美在线| 亚洲国产日韩精品在线| 2019中文字幕免费视频| 尤物九九久久国产精品的特点| 精品一区二区亚洲| 亚洲国产日韩欧美在线图片| 久久久久久国产三级电影| 亚洲精品在线不卡| 久久久久久国产免费| 亚洲丁香久久久| 亚洲精品一区中文字幕乱码| 欧美限制级电影在线观看| 亚洲第五色综合网|