Traversing-Filtering

 

Traversing Filtering 的方法有

.eq()、.filter()、.first()、.has()、.is()、

.last()、.map()、.not()、.slice()

 

一、.eq()

其結果跟Selectors-Basic Filter的 :eq() Selector 是一樣的,

都是用來找尋第n個元素(zero-based)。

只不過一個是jQuery method,另一個是jQuery Selectors Extensions。

註:「:eq() Selector」在 jQuery 3.4 已被 deprecated 了。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"
        integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
</head>

<body>
    <ul>
        <li class="first-item">list item 1</li>
        <li class="second-item">list item 2</li>
        <li class="third-item">list item 3</li>
        <li class="fourth-item">list item 4</li>
        <li class="fifth-item">list item 5</li>
    </ul>

    <script>
        console.log($("li").eq(1));       
    </script>
</body>

</html>

結果為

 

二、.filter()

根據 selector 所找出的結果,再利用 .filter(selector) 繼續二次平面找尋。

有四種多載方法

1、.filter( Selector  selector )

例如:$( "li" ).filter( ":even" )

2、.filter( Function  function )

例如:

$("li").filter(function (index) {
    return $("strong", this).length === 1;
}).css("background-color", "red");

3、.filter( Element  elements )

4、.filter( jQuery selection )

 

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <script src="https://code.jquery.com/jquery-3.4.1.min.js"
        integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
</head>

<body>
    <ul class="level-1">
        <li class="item-i">I</li>
        <li class="item-ii">
            II
            <ul class="level-2">
                <li class="item-a">A</li>
                <li class="item-b">
                    B
                    <ul class="level-3">
                        <li class="item-1">1</li>
                        <li class="item-2">2</li>
                        <li class="item-3">3</li>
                    </ul>
                </li>
                <li class="item-c">C</li>
            </ul>
        </li>
        <li class="item-iii">III</li>
    </ul>
</body>

</html>

 

$(".level-1>li").filter(".item-ii");

結果為

 

可以跟 .find() 方法比較

 

三、.first()

其結果跟Selectors-Child Filter的 :first-child Selector 是一樣的,

都是用來選擇第一個子元素。

 

四、.has()

其結果跟Selectors-Content Filter的 :has() Selector 是差不多的,

找出指定元素底下是否擁有某元素。

有兩個多載方法

.has( Selector selector )

.has( Element element)

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>has demo</title>
    <style>
        .full {
            border: 1px solid red;
        }
    </style>
    <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
    <ul><li>Does the UL contain an LI?</li></ul>

    <script>
        $("ul").append("<li>" +
          ($("ul").has("li").length ? "Yes" : "No") +
          "</li>");
        $("ul").has("li").addClass("full");
    </script>
</body>
</html>

 

五、.is()

用來判斷某條件是否成立。

有四種多載方法

1、.is( Selector selector )

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="https://code.jquery.com/jquery-3.0.0.js"></script>
    <meta name="viewport" content="width=device-width">
</head>
<body>
    <ul>
        <li>list <strong>item 1</strong></li>
        <li><span>list item 2</span></li>
        <li>list item 3</li>
    </ul>

    <script>
        $("ul").click(function (event) {
            var target = $(event.target);
            if (target.is("li")) {
                target.css("background-color", "red");
            }
        });
    </script>
</body>
</html>

用來判斷event.target是否有包含該元素。

 

2、.is( Function function )

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <script src="https://code.jquery.com/jquery-3.0.0.js"></script>
</head>
<body>
    <ul>
        <li><strong>list</strong> item 1 - one strong tag</li>
        <li>
            <strong>list</strong> item <strong>2</strong> -
            two <span>strong tags</span>
        </li>
        <li>list item 3</li>
        <li>list item 4</li>
        <li>list item 5</li>
    </ul>

    <script>
        $("li").click(function () {
            var li = $(this),
              isWithTwo = li.is(function () {
                  return $("strong", this).length === 2;
              });
            if (isWithTwo) {
                li.css("background-color", "green");
            } else {
                li.css("background-color", "red");
            }
        });
    </script>
</body>
</html>

判斷條件交由function來判斷。

 

3、.is( jQuery selection )

4、.is( Element elements )

 

六、.last()

其結果跟Selectors-Child Filter的 :last-child Selector 是一樣的,

都是用來選擇最後一個子元素。

 

七、.map()

將selector選到的集合再經由.map()自訂function組出新的jQuery object。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="https://code.jquery.com/jquery-3.0.0.js"></script>
    <meta name="viewport" content="width=device-width">
    <title>JS Bin</title>
</head>
<body>
    <form method="post" action="">
        <fieldset>
            <div>
                <label for="two">2</label>
                <input type="checkbox" value="2" id="two" name="number[]">
            </div>
            <div>
                <label for="four">4</label>
                <input type="checkbox" value="4" id="four" name="number[]">
            </div>
            <div>
                <label for="six">6</label>
                <input type="checkbox" value="6" id="six" name="number[]">
            </div>
            <div>
                <label for="eight">8</label>
                <input type="checkbox" value="8" id="eight" name="number[]">
            </div>
        </fieldset>
    </form>
    <p></p>

    <script>
        var aWord = $(":checkbox").map(function () {
            return this.id;
        }).get().join();
        $("p").text(aWord);
    </script>
</body>
</html>

 

八、.not()

用來移除指定的元素。

有三種多載方法

.not( Selector selector ) Selector Type: Selector or Element or Array

.not( Function function )

.not( jQuery selection )

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="https://code.jquery.com/jquery-3.0.0.js"></script>
    <meta name="viewport" content="width=device-width">
</head>
<body>
    <ul>
        <li>list item 0</li>
        <li>list item 1</li>
        <li>list item 2</li>
        <li>list item 3</li>
        <li>list item 4</li>
    </ul>
    <script>
        $("li").not(":even").css("background-color", "red");
        $("li:even").css("background-color", "yellow");
    </script>
</body>
</html>

 

九、.slice()

.slice( start [, end ] )

用來指定要保留的範圍(zero-based)。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="https://code.jquery.com/jquery-3.0.0.js"></script>
    <meta name="viewport" content="width=device-width">
</head>
<body>
    <ul>
        <li>list item 0</li>
        <li>list item 1</li>
        <li>list item 2</li>
        <li>list item 3</li>
        <li>list item 4</li>
    </ul>
    <ul>
        <li>list item 0</li>
        <li>list item 1</li>
        <li>list item 2</li>
        <li>list item 3</li>
        <li>list item 4</li>
    </ul>
    <script>
        $("ul:eq(0) > li").slice(2).css("background-color", "red");
        $("ul:eq(1) > li").slice(2, 4).css("background-color", "yellow");
    </script>
</body>
</html>

例如:

1、.slice( 2 )則表示第0~第1不保留,而第2以後皆保留。

2、.slice( 2 , 4)則表示第2~第3保留,其餘不保留。