国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > 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);
};

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

圖片精選

主站蜘蛛池模板: 平潭县| 南昌县| 嘉禾县| 张家港市| 洛隆县| 武定县| 奉节县| 青川县| 繁峙县| 吉安市| 水城县| 富平县| 禹州市| 黄石市| 乐清市| 乡城县| 页游| 汕头市| 铜陵市| 青州市| 漳平市| 和林格尔县| 湛江市| 青冈县| 屏山县| 沁水县| 永兴县| 乐至县| 炉霍县| 安塞县| 拉萨市| 庆阳市| 大方县| 遂平县| 黄浦区| 灌阳县| 滦平县| 鹤壁市| 电白县| 中山市| 尉氏县|