1. 程式人生 > 實用技巧 >jQuery操作DOM

jQuery操作DOM

文字主要內容

  • 樣式和類操作

  • 節點操作

#樣式操作和類操作

作用:設定或獲取元素的樣式屬性值。

#樣式操作

1、設定樣式:


    //設定單個樣式:  css(屬性,值);
    $("div").css("background-color","red");

    //設定多個樣式:  css(json);
	 $("div").css({"width":100,"height":100,"background-color":"pink"});



2、獲取樣式:

    //獲取樣式:css(屬性);
    //獲取的時候如果有很多個,那麼獲取jquery物件中的第一個
    alert($("div").css("width"));

舉例如下:

#類操作(className)

1、新增類樣式:

	$(selector).addClass("liItem");  //為指定元素新增類className

注意:此處類名不帶點,所有類操作的方法類名都不帶點。

2、移除類樣式:

	$(selector).removeClass("liItem");  //為指定元素移除類 className
	$(selector).removeClass();          //不指定引數,表示移除被選中元素的所有類

3、判斷有沒有類樣式:

	$(selector).hasClass("liItem");   //判斷指定元素是否包含類 className

此時,會返回true或false。jquery物件中,只要有一個帶有指定類名的就是true,所有都不帶才是false。

舉例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background-color: pink;
        }

        .current {
            background-color: red;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {
            $("button").eq(0).click(function () {
                //新增類
                $("div").addClass("current");
                //判斷類
                alert($("div").hasClass("current"));
            });

            $("button").eq(1).click(function () {
                //刪除類
                $("div").removeClass("current");
                //判斷類
                alert($("div").hasClass("current"));
            });
            //alert($("div").hasClass("current"));//jquery物件中只要有一個帶有類名的就是true,所有都不帶才是false。
        })
    </script>
</head>
<body>
<button>新增</button>
<button>刪除</button>
<div></div>
<div></div>
<div></div>
<div class="current"></div>
</body>
</html>

4、切換類樣式:

$(selector).toggleClass(“liItem”);    //為指定元素切換類 className,該元素有類則移除,沒有指定類則新增。

解釋:為指定元素切換類 className,該元素有類則移除,沒有指定類則新增。

如果採用採用正常的思路實現上面這句話,程式碼是:

   if($("div").hasClass("current")){
       //如果有類名,那麼刪除
       $("div").removeClass("current")
   }else{
       //如果沒有類名,那麼新增
       $("div").addClass("current")
   }

現在有了toggleClass()方法,一行程式碼即可實現。

舉例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background-color: green;
        }
        .current {
            background-color: red;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {
            $("button").click(function () {
                //需求:點選按鈕 ,切換背景
                //切換類(toggleCLass)
                $("div").toggleClass("current");
            });
        })
    </script>
</head>
<body>
<button>切換背景</button>
<div></div>
</body>
</html>

實現的效果:

#樣式操作和類操作的比較

  • 操作的樣式非常少,那麼可以通過.css()實現。

  • 操作的樣式很多,建議通過使用類 class 的方式來操作。

  • 如果考慮以後維護方便(把CSS從js中分離出來)的話,推薦使用類的方式來操作。

舉例:addClass+removeClass

程式碼實現:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }

        ul {
            list-style: none;
        }

        .wrapper {
            width: 1000px;
            height: 475px;
            margin: 0 auto;
            margin-top: 100px;
        }

        .tab {
            border: 1px solid #ddd;
            border-bottom: 0;
            height: 36px;
            width: 320px;
        }

        .tab li {
            position: relative;
            float: left;
            width: 80px;
            height: 34px;
            line-height: 34px;
            text-align: center;
            cursor: pointer;
            border-top: 4px solid #fff;
        }

        .tab span {
            position: absolute;
            right: 0;
            top: 10px;
            background: #ddd;
            width: 1px;
            height: 14px;
            overflow: hidden;
        }

        .products {
            width: 1002px;
            border: 1px solid #ddd;
            height: 476px;
        }

        .products .main {
            float: left;
            display: none;
        }

        .products .main.selected {
            display: block;
        }

        .tab li.active {
            border-color: red;
            border-bottom: 0;
        }

    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        jQuery(window).ready(function () {
            //需求:滑鼠放到那個li上,讓該li新增active類,下面的對應的.main的div新增selected
            $(".tab>li").mouseenter(function () {
                //不用判斷,當前的li新增active類,其他的刪除active類
                $(this).addClass("active").siblings("li").removeClass("active");
                //對應索引值的div新增selected類,其他的刪除selected類
                //【重要】根據tab的索引值獲取下方圖片div的索引值
                $(".products>div").eq($(this).index()).addClass("selected").siblings("div").removeClass("selected");
            });
        });
    </script>
</head>
<body>
<div class="wrapper">
    <ul class="tab">
        <li class="tab-item active">國際大牌<span>◆</span></li>
        <li class="tab-item">國妝名牌<span>◆</span></li>
        <li class="tab-item">清潔用品<span>◆</span></li>
        <li class="tab-item">男士精品</li>
    </ul>
    <div class="products">
        <div class="main selected">
            <a href="###"><img src="images/guojidapai.jpg" alt=""/></a>
        </div>
        <div class="main">
            <a href="###"><img src="images/guozhuangmingpin.jpg" alt=""/></a>
        </div>
        <div class="main">
            <a href="###"><img src="images/qingjieyongpin.jpg" alt=""/></a>
        </div>
        <div class="main">
            <a href="###"><img src="images/nanshijingpin.jpg" alt=""/></a>
        </div>
    </div>
</div>

</body>
</html>

上方程式碼中,我們注意,tab欄和下方圖片欄的index值,一一對應,這裡用得很巧妙。

效果:

#jQuery 的節點操作

#動態建立元素

原生 js 有三種動態建立元素的方式。這裡我們學一下 jQuery 動態建立元素。注意,建立的是 jQuery 物件。

方式一:

	var $spanNode1 = $("<span>我是一個span元素</span>");  // 返回的是 jQuery物件

此方法類似於 原生 js 中的document.createElement("標籤名");

方式二:(推薦)

	var node = $("#box").html("<li>我是li</li>");

此方法類似於 原生 js 中的innerHTML

舉例:

    //方式一:      $("標籤")             :類比於js中的document.createElement("li");
    console.log($("<li class='aaa'>我是li標籤</li>"));

    //方式二:      $("ul").html("");     :類比innerHTML屬性。因為此屬性,識別標籤。
    $("ul").html("<li>我是html方法穿件出來的li標籤</li>")

#新增元素

jQuery 新增元素的方法非常多,最重要的方法是append()。格式如下:

// 方式一:在$(selector)中追加$node
$(selector).append($node);   //引數是 jQuery物件

// 方式二:在$(selector)中追加div元素,
$(selector).append('<div></div>');  //引數是 htmlString

作用:在被選元素內部的最後一個子元素(或內容)後面插入內容(存在或者創建出來的元素都可以)。

通俗的解釋:在盒子裡的最末尾新增元素。

  • 如果是頁面中存在的元素,那呼叫append()後,會把這個元素放到相應的目標元素裡面去;但是,原來的這個元素,就不存在了。

  • 如果是給多個目標追加元素,那麼方法的內部會複製多份這個元素,然後追加到多個目標裡面去。

舉例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="jquery-1.11.1.js"></script>
    <script>
        jQuery(document).ready(function () {
            $("button").click(function () {
                //建立一個新的jquery物件li
                var jqNewLi = $("<li>我是jquery創建出來的li。用的是append方法新增</li>");

                //append();  在盒子裡的最末尾新增與嚴肅
                $("ul").append(jqNewLi);    //把新建立的 li 塞進已知的 ul 中
                //jqNewLi.appendTo($("ul")); //方式二:把新建立的li塞進ul中。作用同上
            })
        });
    </script>
</head>
<body>
<button>新增li</button>

<ul>
    <li>我是土著li</li>
</ul>

</body>
</html>

效果:

其他的新增元素的方法:

方法2:

	$(selector).appendTo(node);

作用:同append(),只不過是反著寫的。

方法3:

	$(selector).prepend(node);

作用:在元素的第一個子元素前面追加內容或節點。

方法4:

	$(selector).after(node);

作用:在被選元素之後,作為兄弟元素插入內容或節點。

方法5:

	$(selector).before(node);

作用:在被選元素之前,作為兄弟元素插入內容或節點。

#清空元素

方式一:沒有引數

	$(selector).empty();
	$(selector).html("");

解釋:清空指定元素的所有子元素(光桿司令)。

方式二:

//

	$(selector).remove();

解釋:“自殺” 。把自己以及所有的內部元素從文件中刪除掉。

#複製元素

格式:

	複製的新元素 = $(selector).clone();

解釋:複製$(selector)這個元素。是深層複製。

#總結

推薦使用html("<span></span>")方法來建立元素或者html("")清空元素。

#案例:選擇水果

完整版程式碼:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        select {
            width: 170px;
            height: 240px;
            font-size: 18px;
            background-color: #a4ff34;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {

            //步驟:
            //1.將左側的子標籤全部移動到右側。
            $("button").eq(0).click(function () {
                //右側標籤.append(左側標籤);
                $("#sel2").append($("#sel1 option"));
            });

            //2.將右側的子標籤全部移動到左側。
            $("button").eq(1).click(function () {
                //左側標籤.append(右側標籤);
                $("#sel1").append($("#sel2 option"));
            });

            //第二步:獲取子元素的時候要注意,獲取的必須是,被選中的元素。
            //技術點:怎麼獲取被選中的子元素呢???答案:option:selected;
            //1.將左側被選中的子標籤移動到右側
            $("button").eq(2).click(function () {
                //右側標籤.append(左側標籤);
                $("#sel2").append($("#sel1 option:selected"));
            });

            //2.將右側被選中的子標籤移動到左側
            $("button").eq(3).click(function () {
                //右側標籤.append(左側標籤);
                $("#sel1").append($("#sel2 option:selected"));
            });

        })
    </script>
</head>
<body>
<select id="sel1" size="10" multiple>
    <option value="0">香蕉</option>
    <option value="1">蘋果</option>
    <option value="2">鴨梨</option>
    <option value="3">葡萄</option>
</select>
<button>>>></button>
<button><<<</button>
<button>></button>
<button><</button>
<select id="sel2" size="10" multiple>

</select>
</body>
</html>

效果:

#案例:動態新增表格項

程式碼如下:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        table {
            border-collapse: collapse;
            border-spacing: 0;
            border: 1px solid #c0c0c0;
        }

        th,
        td {
            border: 1px solid #d0d0d0;
            color: #404060;
            padding: 10px;
        }

        th {
            background-color: #09c;
            font: bold 16px "微軟雅黑";
            color: #fff;
        }

        td {
            font: 14px "微軟雅黑";
        }

        tbody tr {
            background-color: #f0f0f0;
        }

        tbody tr:hover {
            cursor: pointer;
            background-color: #fafafa;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {
            // 模擬從後臺拿到的資料
            var data = [{
                name: "部落格園",
                url: "http://www.cnblogs.com/smyhvae/",
                type: "程式設計師的精神家園"
            }, {
                name: "簡書",
                url: "https://www.jianshu.com/u/4d2e6b4bf117",
                type: "寫作平臺"
            }, {
                name: "百度",
                url: "https://www.baidu.com/",
                type: "你就知道"
            }];

            //需求:點選按鈕,然後生成tr裡面生成三個td.陣列元素個數個tr。然後放入tbody中
            //步驟:
            //1.繫結事件
            //2.利用for迴圈,把陣列中的所有資料組合成一個字串。
            //3.把生成的字串設定為html內容新增進tbody中。


            //1.繫結事件
            $("input").click(function () {
                //寫入到click事件中,每次點選以後把之前的str清空【重要】
                var str = "";
                //2.利用for迴圈,把陣列中的所有資料組合成一個字串。
                for(var i=0;i<data.length;i++){
                    //如何生成3組???
//                    str += "<tr><td>1</td><td>2</td><td>3</td></tr>";
                    //data[i] = 陣列中的每一個json
                    //data[i].name = 陣列中的每一個json的name屬性值
                    str += "<tr><td>"+data[i].name+"</td><td>"+data[i].url+"</td><td>"+data[i].type+"</td></tr>";
                }

                //3.把生成的字串設定為html內容新增進tbody中。
                $("#j_tbData").html(str);
            })
        })
    </script>
</head>

<body>
<input type="button" value="獲取資料" id="j_btnGetData"/>
<table>
    <thead>
    <tr>
        <th>標題</th>
        <th>地址</th>
        <th>說明</th>
    </tr>
    </thead>
    <tbody id="j_tbData">
    <!--<tr>-->
    <!--<td>1</td>-->
    <!--<td>2</td>-->
    <!--<td>3</td>-->
    <!--</tr>-->
    </tbody>
</table>
</body>

</html>

實現的效果:

程式碼解釋:每次生成字串str之前,記得先把之前的str清空,不然每次點選按鈕,都會繼續新增表格項。

#將上一個案例進一步提升:點選按鈕,新增資料

暫略。

#jQuery 設定和獲取屬性

jQuery 無法直接操作節點的屬性和src等,我們需要藉助attr()方法。下面介紹。

#屬性操作

(1)設定屬性:

	$(selector).attr("title", "生命壹號");

引數解釋:第一個引數表示:要設定的屬性名稱。第二個引數表示:該屬性名稱對應的值。

(2)獲取屬性:

	$(selector).attr("title");

引數為:要獲取的屬性的名稱,返回指定屬性對應的值。

總結:兩個引數是給屬性賦值,單個引數是獲取屬性值。

(3)移除屬性:

	$(selector).removeAttr("title");
1

引數為:要移除的屬性的名稱。

(4)form表單中的prop()方法:

針對checked、selected、disabled屬性,要使用prop()方法,而不是其他的方法。

prop方法通常用來影響DOM元素的動態狀態,而不是改變的HTML屬性。例如:input和button的disabled特性,以及checkbox的checked特性。

總結:細節可以參考:http://api.jquery.com/prop/

以上四項的程式碼演示:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .aaa {
            border: 1px solid red;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {
            //獲取元素,繫結屬性
            var jqinp = $("input").eq(0);
            var jqinp2 = $("input:checkbox");
            var jqbtn = $("button");

            jqbtn.click(function () {
                //是繫結到jquery的衣服上,而不是標籤上。所以沒達到效果
//                jqinp.title = 111;
//                console.log(jqinp.title);

                //繫結到標籤上
                jqinp.attr("title", 111);
                console.log(jqinp.attr("title"));

                jqinp.attr("aaa", 111);
                console.log(jqinp.attr("aaa"));

                //兩個引數是給屬性賦值,單個引數是獲取屬性值。
                jqinp.attr("class", "aaa");
                console.log(jqinp.attr("class"));

                jqinp.removeAttr("class");
                console.log(jqinp.attr("class"));

                //form中的特殊屬性,用prop
                jqinp2.prop("checked", true);
//                jqinp2.attr("checked",true);//一次性的。滑鼠多點選幾次,就失效了。

            });
        })
    </script>
</head>
<body>
<button>繫結</button>
<input type="text"/>
<input type="checkbox"/>

</body>
</html>

效果:

案例:表格案例全選反選

完整版程式碼:

<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        .wrap {
            width: 300px;
            margin: 100px auto 0;
        }

        table {
            border-collapse: collapse;
            border-spacing: 0;
            border: 1px solid #c0c0c0;
        }

        th,
        td {
            border: 1px solid #d0d0d0;
            color: #404060;
            padding: 10px;
        }

        th {
            background-color: #09c;
            font: bold 16px "微軟雅黑";
            color: #fff;
        }

        td {
            font: 14px "微軟雅黑";
        }

        tbody tr {
            background-color: #f0f0f0;
        }

        tbody tr:hover {
            cursor: pointer;
            background-color: #fafafa;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {
            //需求1:點選上面的多選按鈕,下面的所有多選按鈕都和上面的一致
            //需求2:點選下面的多選按鈕,判斷下面的所有多選按鈕都是否全部被選定只有全部被選定上面的才被選定


            //需求1:點選上面的多選按鈕,下面的所有多選按鈕都和上面的一致
            //步驟:繫結事件,直接讓下面的所有按鈕和上面的按鈕屬性值一模一樣
            $("#j_cbAll").click(function () {
                //直接讓下面的所有按鈕和上面的按鈕屬性值一模一樣
                $("#j_tb input:checkbox").prop("checked", $(this).prop("checked"));
            });

            //需求2:點選下面的多選按鈕,判斷下面的所有多選按鈕都是否全部被選定只有全部被選定上面的才被選定
            //需求2:點選下面的多選按鈕,判斷下面的所有多選按鈕都是否全部被選定只有全部被選定上面的才被選定
            $("#j_tb input:checkbox").click(function () {
                //判斷,只有所有都背選定,上面的才被選定
                //技術點:帶有checked屬性的標籤和checkbox個數一樣多的時候
                if ($("#j_tb input:checkbox").length === $("#j_tb input:checked").length) {
                    //只有所有的都有checked屬性,上面的才被選定
                    $("#j_cbAll").prop("checked", true);
                } else {
                    $("#j_cbAll").prop("checked", false);
                }
            });


        })
    </script>
</head>

<body>
<div class="wrap">
    <table>
        <thead>
        <tr>
            <th>
                <input type="checkbox" id="j_cbAll"/>
            </th>
            <th>課程名稱</th>
            <th>所屬團隊</th>
        </tr>
        </thead>
        <tbody id="j_tb">
        <tr>
            <td>
                <input type="checkbox"/>
            </td>
            <td>JavaScript</td>
            <td>千古壹號</td>
        </tr>
        <tr>
            <td>
                <input type="checkbox"/>
            </td>
            <td>css</td>
            <td>千古壹號</td>
        </tr>
        <tr>
            <td>
                <input type="checkbox"/>
            </td>
            <td>html</td>
            <td>千古壹號</td>
        </tr>
        <tr>
            <td>
                <input type="checkbox"/>
            </td>
            <td>jQuery</td>
            <td>千古壹號</td>
        </tr>
        </tbody>
    </table>
</div>
</body>

</html>

#val()方法和 text()方法

	$(selector).val();

作用:設定或返回 form 表單元素的value值,例如:input、select、textarea 的值。

	$(selector).text();

作用:設定或獲取匹配元素的文字內容。不帶引數表示,會把所有匹配到的元素內容拼接為一個字串,不同於其他獲取操作。

	$(selector).text("我是內容");

作用:設定的內容包含html標籤,那麼text()方法會把他們當作純文字內容輸出。

總結:

  • text() 不識別標籤。

  • html() 識別標籤。

舉例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="jquery-1.11.1.js"></script>
    <script>
        jQuery(document).ready(function () {
            //val();   獲取標籤中的value屬性的值。帶有引數是賦值(類比js中的value屬性)
            console.log($("input").val());

            $("input").val("我是value()賦值的input內容");
            console.log($("input").val());

            console.log("-----------------");

            //text();  獲取雙閉合標籤中的文字值。(不識別標籤)(類比js中的innerText)
            console.log($("div").text());
            $("div").text("<li>我是text()賦值的</li>")
            console.log($("div").text());

            console.log("-----------------");

            //html();  獲取雙閉合標籤中的文字值。(識別標籤)(類比js中的innerHTML)
            console.log($("div").html());
            $("div").html("<li>我是html()賦值的</li>");
            console.log($("div").html());
        })
    </script>
</head>
<body>
<input type="text" value="我是input中已存在的 value內容"/>
<div>
    <li>你好</li>
</div>
</body>
</html>

列印結果: