2016年5月7日 星期六

一般屬性操作 (jQuery 16)

官網連結

目前有5個:
.attr():塞屬性
.prop():塞屬性
.removeAttr():移除attr,官網說 IE 6~8 移除oncick會有問題,要用removeProp
.removeProp():移除prop設定的屬性,且不能移除內鍵的屬性
.val():塞value、取value

1.6版後,attr和prop對特定的方法,回傳的不一樣,prop回傳的大部分都是布林值;attr回傳的是屬性



※.attr()、.prop()基本用法

$(function() {
    $('input').prop('readonly', 'readonly');
    var $prop = $('input').prop('readonly');
    alert('prop=' + $prop); // true
       
    $('input').attr('readonly', 'readonly');
    var $attr = $('input').attr('readonly');
    alert('attr=' + $attr); //readonly
    
    // $('input').attr('value', 'xxx').attr('disabled', 'disabled');
    // $('input').attr({value:'xxx', disabled:'disabled'});
----------
<input />

※使用兩個參數是設定,attr和prop在設定時都一樣

※使用一個參數是取值,這時attr和prop回傳結果不同,prop回傳的是boolean值


※.attr()、.prop()的function用法

$(function() {
    $('p').attr('id', function(i, j) {
        alert(j);
        return "xxx" + i;
    }).each(function () {
        $('span', this).text($(this).attr('id'));
    });
});
----------
<p>p1 <span></span></p>
<p>p2 <span></span></p>
<p>p3 <span></span></p>

※j取到的是id值,看第一個參數是什麼決定的



※.attr()、.prop()差異一

$(function() {
    $('#b1').click(function() {
        $('#ooo').attr('readonly', true);
        alert($('#ooo').attr('readonly'));
    });
    
    $('#b2').click(function() {
        $('#ooo').prop('readonly', true);
        alert($('#ooo').prop('readonly'));
    });
    
    $('#b3').click(function() {
        var $checkbox = $('input[name="xxx"]').eq(0);
        alert($checkbox.attr('checked'));
        alert($checkbox.prop('checked'));
    });
});
----------
<input id="ooo" />
<button id="b1">B1</button>
<button id="b2">B2</button>
<br />
<input type="checkbox" name="xxx" id="c1" checked="checked"/>
<label for="c1">a</label>
<input type="checkbox" name="xxx" id="c2" />
<label for="c2">b</label>
<input type="checkbox" name="xxx" id="c3" />
<label for="c3">c</label>
<button id="b3">B3</button>

※B1回傳的是「readonly」,是屬性名稱;B2回傳的是true,是布林值

※B3用attr回傳的是「checked」,用prop回傳的是true



※.attr()、.prop()差異二

$(function() {
    $('select').prop('selectedIndex', 1);
    alert($('select').prop('selectedIndex'));
    
    $('input[type="checkbox"]').prop('defaultChecked', true);
    alert($('input[type="checkbox"]').prop('defaultChecked'));
});
----------
<select>
    <option>A</option>
    <option>B</option>
    <option>C</option>
    <option>D</option>
    <option>E</option>
</select>
    
<input type="checkbox" name="xxx" />
<input type="checkbox" name="xxx" />
<input type="checkbox" name="xxx" />

※用attr和prop回傳的都是1和true,但是用prop真的有選到B,checkbox也都有勾;而attr就是個初始值而已

※官方還有說 selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked, or defaultSelected 都要用prop,我這裡示範兩個而已

※總之使用prop有以下兩個的,就用prop比較好
1.屬性值是true/false
2.只增加屬性名稱,而不增加屬性值就可以的


個人經驗:
「$('xxx').attr('disabled', true);」有些瀏覽器不行,
但用「$('xxx').attr('disabled', 'disabled');」就可以;readonly也是一樣



※.removeAttr()、.removeProp()

$(function() {
    $('input').removeAttr('readonly');
    // $('input').removeProp('readonly');
});
----------
<input readonly="readonly"/>

※使用removeProp無效

※remove範例二

$(function() {
    $('input').prop('readonly', 'readonly');
    $('input').removeAttr('readonly');
    // $('input').removeProp('readonly');
});
----------
<input />

※這次用jQuery的prop塞屬性,removeAttr是有用的,但removeProp還是無效

※官網有說不要用prop移除內鍵的屬性,所以無效是很正常的

※remove範例三

$(function() {
    $('span').prop('xxx', 'x');
    alert($('span').prop('xxx'));
    $('span').removeProp('xxx');
    alert($('span').prop('xxx'));
});
----------
<span>span</span>

※此時xxx不是內鍵的屬性,所以運作正常,全部改成attr也是ok的,但如果是將removeProp改成removeAttr是不行的

※兩個最好不要混用,因為很少人會去記哪些可以混用;都不混用一定可以就對了



※.val()基本用法

$(function() {
    $('input').val('xxx');
    alert($('input').val());
    $('input').val('');
    alert($('input').val());
});
----------
<input />

※取的是value,不是text



※.val()的function用法

$(function() {
    $('input').change(function() {
        $(this).val(function(i, v) {
            return v.toUpperCase() + ' success!';
        });
    });
});
----------
<input />

※i是index;v就是打字的內容了

事件物件 (jQuery 15)

官網連結

目前有19個:
preventDefault():使事件的預設行為不觸發
isDefaultPrevented():判斷有沒有執行過 preventDefault()

stopPropagation():停止父輩層傳播,也就是停止冒泡
isPropagationStopped():判斷有沒有執行過 stopPropagation()

stopImmediatePropagation():停止同輩層傳播
isImmediatePropagationStopped():判斷有沒有執行過 stopImmediatePropagation()

target:一開始的DOM元素
currentTarget:當前DOM元素
delegateTarget:正在調用jQuery事件的元素
relatedTarget:相關連的DOM元素,這個我試的結果,只有滑鼠事件才會觸發

data:回傳可選的…,我也不太會解釋,看下面的範例
metaKey:是否按下Meta鍵,一般不會有這個鍵,回傳布林值
namespace:回傳命名空間
pageX:左右的數字(最左邊是0,右邊要看解析度而定)
pageY:上下的數字(最上面是0,下面要看解析度而定)
result:回傳被觸發事件的最後返回值,沒有就回傳undefined
timeStamp:回傳1970年1月1日到現在的毫秒數
type:回傳事件名稱
which:回傳按鍵或滑鼠的數字
  ※滑鼠用mousedown,左、中、右鍵,分別回傳1、2、3;click事件只抓到左和中鍵,右鍵沒抓到,其他都回傳0
  ※keypress:回傳ASCII的數字,但ctrlKey、shiftKey、altKey抓不到
  ※keydown、keyup:回傳的英文是大寫的ASCII,數字左邊的和keypress一樣,都是回傳ASCII,但右邊的數字鍵盤回傳的是 96~105
  ※ctrlKey、shiftKey、altKey抓的到,但keyup都是顯示false;keydown回傳的很正確,不曉得和瀏覽器有沒有關係



※preventDefault、isDefaultPrevented



$(function(){
    $( "input" ).keydown(function(e) {
        alert(e.isDefaultPrevented());
        e.preventDefault();
        alert(e.isDefaultPrevented());
    });
});
----------
<input />

※按下鍵盤後,好像沒按一樣,因為取消了原本的行為



※stopPropagation、isPropagationStopped


$(function(){
    $( "div" ).click(function(e) {
        alert('div');
    });
    
    $( "p" ).click(function(e) {
        alert('p');
    });
    
    $( "span" ).click(function(e) {
        alert(e.isPropagationStopped());
        e.stopPropagation();
        alert(e.isPropagationStopped());
    });
});
----------
<div>
    div
    <p>
        p
        <span>span</span>
    </p>
</div>

※原本的行為是按span後,會跳出span、p、div,加了以後只會執行自己的



※stopImmediatePropagation、isImmediatePropagationStopped


$(function(){
    $('span').click(function(e) {
        alert(e.isPropagationStopped());
        e.stopImmediatePropagation();
        alert('span1');
        alert(e.isPropagationStopped());
    });
    
    $('span').click(function(e) {
        alert('span2');
    });
});
----------
<span>span</span>

※原本span2會執行的,但加了stop就不會了,這個是以在html的順序為執行的順序,所以將span2放在span1前面還是會執行



※target

$(function(){    
    $("div").click(function(e) {
        alert(e.target.nodeName);
    });
    
    $("p").click(function(e) {
        alert(e.target.nodeName);
        alert($(e.target).is('SPAN'));
    });
    
    $("span").click(function(e) {
        alert(e.target.nodeName);
    });
});
----------
<div>
    div
    <p>
        p
        <span>span</span>
    </p>
</div>

※因為是一開始的元素,所以往上冒泡時,都是一開始的那一個元素,如點span,執行到p和div都會出現span;點p,執行到div,也是出現p


※currentTarget、delegateTarget

$(function(){
    $("div").click(function(e) {
        alert(e.currentTarget.nodeName === e.delegateTarget.nodeName);
    });
    
    $("p").click(function(e) {
        alert(e.currentTarget.nodeName === e.delegateTarget.nodeName);
    });
    
    $("span").click(function(e) {
        alert(e.currentTarget.nodeName === e.delegateTarget.nodeName);
    });
});
----------
<div>
    div
    <p>
        p
        <span>span</span>
    </p>
</div>

※和target不一樣的地方在按p或div時,按的是p就是p,是div就是div;而target都是按的那一個

※兩者差別我分不出,官方也寫說這兩個總是一樣


※relatedTarget

$(function(){
    $('span').mouseover(function(e) {
        console.log(e.relatedTarget.nodeName);
    });
});
----------
<div>
    div
    <p>
        p
        <span>
            span
            <input />
        </span>
    </p>
</div>

※這個物件我試的結果很奇怪,結果不太一定,大部分是BODY,有時候又會出現HTML、P、SPAN



※which

$(function() {
    $('input').keyup(function(e){
        alert(e.which);
    });
});
----------
<input />

※ctrlKey、shiftKey、altKey雖然官網沒寫,但javascript有,回傳布林值,可以用debugger查看,會看到非常多,官網可能只訂一些較常用的而已


※data

$(function() {
    for (var i = 0; i < $('div').length; i++) {
        $('div').eq(i).click({xxx: i}, function(e) {
            alert(e.data.xxx);
        });
    }
});
----------
<div>A</div>
<div>B</div>
<div>C</div>

※xxx名稱要對應好


※type

$(function() {
    $('div').click(function(e) {
        alert(e.type);
    });
});
----------
<div>A</div>
<div>B</div>
<div>C</div>

※回傳click


※namespace

$(function() {
    $('div').on('aaa.bbb.ccc', function(e) {
        alert(e.namespace);
    });
});
    
function testCustomEven(){
    $('div').trigger('aaa.bbb.ccc');
}
----------
<div>div</div>
<button onclick="testCustomEven()">fire</button>

※回傳bbb.ccc


※result

$(function() {
    $('div').click(function() {
        return 'xxx';
    });
    
    $('div').click(function(e) {
        alert(e.result);
    });
});
----------
<div>div</div>

※回傳xxx;如果沒有寫第一個click,回傳undefined


※pageX、pageY

$(function() {
    $('html').click(function(e) {
        alert(e.pageX + ':' + e.pageY);
    });
});

※javascript是叫clientX、clientY,所以結果也是一樣

※javascript還有一組叫screenX、screenY,是包含整個螢幕的,所以數字和解析度一樣

2016年5月4日 星期三

瀏覽器事件、鍵盤事件、表單事件、滑鼠事件 (jQuery 14)

這篇都是上一篇的快速寫法,例如$('xxx').on('click', function(){});
快速寫法變成$('xxx').click(function(){});


※瀏覽器事件

官網連結

目前有三個:
.error():載入錯誤時
.resize():將視窗大小改變時
.scroll():右邊或下面有捲軸時,去按或用滑鼠的滾輪時


※.error()

$("img").error(function(){
    alert('我錯了!');
    $(this).hide();
}).attr("src", "Koala.bmp");
----------
<img src="xx.jpg" />

※img裡的src故意寫抓不到的名稱,這時會到attr抓圖,再沒有就會觸發


※.resize()

$(window).resize(function() {
    $('body').prepend('<div>' + $(window).height() + ':' + $(window).width() + '</div>');
});


※.scroll()

$(window).scroll(function () {
    $("div").css('color', 'red');
});
----------
<div>divdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdiv</div>

※移動視窗大小,使右邊或下面出現捲軸,去按或滾動滑鼠滾輪會觸發(沒出現捲軸沒用)



※鍵盤事件

官網連結

目前有三個:
.keydown():按下按鍵時觸發
.keypress():按下按鍵,按鍵到最底部時觸發
.keyup():按下按鍵,並彈回來時觸發


$("input").keypress(function(){
    alert('keypress');
});
    
$("input").keydown(function(){
    alert('keydown');
});
    
$("input").keyup(function(){
    alert('keyup');
});
    
$("input").keyup(function(){
    alert('keyup');
}).keydown(function(){
    alert('keydown');
}).keypress(function(){
    alert('keypress');
});
----------
<input />

※在IE 11和Chrome測試的結果一樣,keyup和其他兩個一起執行都不會觸發
只有寫一個keyup才會觸發

※最下面的寫法是將三個合起來寫,效果也是一樣,當然keyup也還是不會觸發



※表單事件

官網連結

目前有7個:
以下三個是一組的,都是聚焦時觸發,如進入input時,滑鼠游標會在裡面
.focus():最基本的
.focusin():最先執行
.focusout():最後執行

.blur():離開焦點時觸發,如離開input時,游標也不會在裡面
.change():很像.blur(),但只有內容改變時才會觸發

.select():就文字選起來時,如用滑鼠拖曳使背景變色就是選取,按兩下是選一個單字,也會觸發
.submit():表單提交時觸發


※.focus()相關

$(function(){
    $('input').focusin(function(){
        alert('1');
    });
    
    $('input').focus(function(){
        alert('2');
    });
    
    $('input').focusout(function(){
        alert('3');
    }); 
    
    $('input').blur(function(){
        alert('4');
    });
});
----------
<input />

※我將這四個順序弄亂,還是會按照1234的順序執行



※.select()

$(function(){
    $('form').submit(function(){
        alert('1');
    });
});
----------
<form>
    <input type="submit" />
</form>

※$('input').submit()是不會觸發的



※滑鼠事件

因為和其他事件差不多用法,就不貼範例了(hover例外)
.toggle():1.8過時;1.9移除了

.click():滑鼠按一下時觸發
.dblclick():滑鼠按二下時觸發
.contextmenu():按滑鼠右鍵時觸發

以下兩個比click還快
.mousedown():滑鼠按下時觸發
.mouseup():滑鼠按下並彈回時觸發

.mousemove():滑鼠移動時觸發
.hover():滑鼠進入離開時都會觸發

.mouseenter():滑鼠進入時觸發
.mouseover():滑鼠進入時觸發

.mouseleave():滑鼠離開時觸發
.mouseout():滑鼠離開時觸發


※滑鼠進入快到慢:mousemove-->hover-->mouseenter-->mouseover

※滑鼠離開快到慢:mousemove-->hover-->mouseleave-->mouseout


※.hover()

$(function() {
    $("p").hover(function () {
        $(this).css({'background-color' : 'green', 'color' : 'red'});
    }, function () {
        $(this).css({'background-color' : 'red', 'color' : 'green'});
    });
});
----------
<p>
    p
    <span>span</span>
    <span>span</span>
    <span>span</span>
</p>

※第一個function是進入時觸發,第二個是離開時觸發
如果只寫一個,則進入離開都觸發同一個

事件處理 (jQuery 13)

事件就是做了特定的事以後,會自動觸發的程式

除了複製程式碼外,比較不會錯的寫法:
1.$('xxx').xxxEventName();
2.在()裡面寫「function(){}」
3.在{}裡面按enter


官網連結
目前有12個:

以下4組都是挷定事件和解除事件,因版本的差異才會看起來這麼多
.live():1.7過時,1.9移除,舊版要使用delegate()來代替
.die():1.7過時,1.9移除,舊版要使用undelegate()來代替

.bind():效能比.on()慢
.unbind():效能比.off()慢

.delegate():1.7版被on()取代,可是並沒有寫過時和移除,但我試的結果是無效的,我用1.10.2測的
.undelegate():1.7版被off()取代,可是並沒有寫過時和移除,但我試的結果是無效的,我用1.10.2測的

.on():很像bind,但多個selector參數
.off():很像unbind,但多個selector參數


.one():和上面一樣,但只執行一次,所以也不會有解除事件的方法
.trigger():自定義的事件,會抓全部的自定名稱
.triggerHandler():自定義的事件,只會抓第一次的自定名稱
.jQuery.proxy():接收函數,返回新的函數



※.bind()、.unbind()、.on()、.off()

※基本使用

$(function() {
    $('button').on('click', function(){
        alert(this.tagName);
    });
});
    
function removeEvent(){
    $('button').off('click');
}
----------
<button>click me</button>
<input type="button" value="remove" onclick="removeEvent()" />

※也可以用bind配合off和on配合unbind


※參數

$(function() {
    $('button').on(
        'click', 
        {key1 : $('p:eq(0)').text(), key2 : $('p:eq(1)').text()}, 
        function(e){
            alert(e.data.key1 + ':' + e.data.key2);
        }
    );
});
----------
<button>click me</button>
<p>p1</p>
<p>p2</p>


※事件裡的元素

$(function() {
    $('div').on(
        'click', 
        'span', 
        function(e){
            alert($(this).text());
        }
    );
    
    $('div').on(
        'click', 
        'p', 
        function(e){
            alert($(this).text());
        }
    );
});
    
function removeDiv(){
    $('div').off('click');
}
    
function removeSpanOfDiv(){
    $('div').off('click', 'span');
}
----------
<span>span1</span>
<div>
    div1
    <p>
        p1
        <span>span2</span>
    </p>
</div>
<div>
    div2
    <p>
        p2
        <span>span3</span>
    </p>
</div>
<input type="button" value="removeDiv" onclick="removeDiv()" />
<input type="button" value="removeSpanOfDiv" onclick="removeSpanOfDiv()" />

※bind()的參數沒有什麼selector可以用,所以它會忽略這個參數


※多個事件

$(function() {
    $('input').on(
        {
            click : function(){
                alert('click');
            },
            mouseout : function(){
                alert('mouseout');
            },
            keydown :function(){
                alert('keydown');
            }
        }
    );
});
----------
<input />



※.trigger()

※和內鍵事件配合使用

$(function(){
    $('div').on('click', function() {
        alert($(this).text());
    });
});
    
function testCustomEven(){
    $('div').trigger('click');
}
----------
<div>div</div>
<button onclick="testCustomEven()">fire</button>

※除了點一下會觸發外,按下按鈕也會觸發


※自定名稱

$(function(){
    $('div').on('xxx', function() {
        alert($(this).text());
    });
});
    
function testCustomEven(){
    $('div').trigger('xxx');
}
----------
<div>div</div>
<button onclick="testCustomEven()">fire</button>

※xxx是自定義的,所以只剩按下按鈕會觸發


※傳參數

$(function(){
    $('div').on('xxx', function(e, p1, p2) {
        alert(p1 + ':' + p2);
    });
});
    
function testCustomEven(){
    $('div').trigger('xxx', ['ooo', 'xxx']);
}
----------
<div>div</div>
<button onclick="testCustomEven()">fire</button>



※.triggerHandler()

$(function(){
    $('#o').on('click', function() {
        alert('o');
    });
    
    $('#x').on('click', function() {
        alert('x');
    });
});
    
function testCustomEven(){
    $('[id]').trigger('click');
    // $('[id]').triggerHandler('click');
}
----------
<input id="o" value="ooo" />
<input id="x" value="xxx" />
<button onclick="testCustomEven()">fire</button>

※按下按鈕後,會發現用triggerHandler只會傳回一筆,我試的結果是抓到HTML的順序排在前面的;而trigger會全部都抓

※官網還有說,用了triggerHandler後,原本的行為就不會觸發了
如click是按一下觸發,但用了triggerHandler後,原本的行為不會觸發(就好像上面的例子可以自定名稱,但想要定的名稱內鍵剛好也有),可是我試的結果用IE 和 Chrome按一下(click)都還是會觸發



※$.proxy()

$(function(){
    $('button').on('click', $.proxy(a.a2, a));
    $('button').on('click', $.proxy(a, 'a2'));
    
    $('button').on('click', $.proxy(b.b2, b, {ooo:'o', xxx:'x'}));
    $('button').on('click', $.proxy(b, 'b2', {ooo:'o', xxx:'x'}));
});
    
var a = {
    a1: "a1",
    a2: function(event) {
        alert(this.a1);
    }
};
    
var b = {
    b1: "b1",
    b2: function(p, event) {
        alert(p.ooo);
        alert(p.xxx);
    }
};
----------
<button>click me</button>

※一共有四種用法
$.proxy(function, context)
$.proxy(context, name):name是個字串,是context的屬性
context其實就是一個物件;另外兩種是1.6才加的,就是在最後面多個傳參數

※1.9版後,context給null或undefined,會轉換成this

2016年5月1日 星期日

開發常會用到的 checkbox、radio、select (jQuery 12)

※checkbox和radio

尤於Web開發的checkbox和radio常常會用到,下面就寫一個判斷、取值的範例
裡面有些方法還沒介紹到,後面還會再介紹


function displayCheckbox(){
    var count = $("input[name='alphabeta']:checked").length;
    alert('checkbox勾了' + count + '個!');
    // alert($("input[name='alphabeta']:checked").val());
    
    alert($("input[name='alphabeta']").eq(0).val());
    alert($("input[name='alphabeta']:eq(0)").val());
    
    var $alphabeta = $("input[name='alphabeta']");
    for(var i=0; i<$alphabeta.length; i++){
        if($alphabeta.get(i).checked == 1){
            alert('是' + $alphabeta.get(i).value);
            alert('是' + $("input[name='alphabeta']:eq(" + i +")").val());
        }
    }
}
    
function displayRadio(){
    var count = $("input[name='zoo']:checked").length;
    
    if(count != 0){
        alert('選的是' + $("input[name='zoo']:checked").val());
    } else {
        alert('沒選radio!');
    }
}
----------
<input type="checkbox" name="alphabeta" value="A" checked="checked">
<input type="checkbox" name="alphabeta" value="B">
<input type="checkbox" name="alphabeta" value="C">
    
<input type="radio" name="zoo" value="monkey" id="m">
<input type="radio" name="zoo" value="dog" id="d">
<input type="radio" name="zoo" value="pig" id="p">
    
<input type="button" value="checkCheckbox" onclick="displayCheckbox()">
<input type="button" value="checkRadio" onclick="displayRadio()">

※註解那一行只會取到第一筆,radio的name一樣只會取到一筆,所以可以用;但checkbox就不適合了

※寫法有很多種



※select

※select單選

$(function($) {
    $('option').eq(2).prop('selected', 'selected');
    $('option').eq(3).hide();
    $('option').each(function(){
        if($(this).is(':selected')){
            alert($(this).text());
        }
    });
});
----------
<select>
    <option value="a">A</option>
    <option value="b">B</option>
    <option value="c">C</option>
    <option value="d">D</option>
    <option value="e">E</option>
</select>


※select多選

$('option').each(function(i){
    if(i % 2 == 0){
        $(this).prop('selected', 'selected');
        // $(this).hide();
    }
});
----------
<select  multiple="multiple">
    <option value="a">A</option>
    <option value="b">B</option>
    <option value="c">C</option>
    <option value="d">D</option>
    <option value="e">E</option>
</select>

雜項遍歷 (jQuery 11)

官網連結
目前有6個:

.not():基本過濾器 (jQuery 6)已講過
.add():增加選擇的結果
.addBack():增加上一個選擇的結果
.contents():取得元素的子元素,和內容過濾器的「:contents」不一樣,裡面不能放參數
.end():回上一層
.andSelf():包括自己,1.8把它標識為過時了,是過時不是移除,所以還能用


※.add()

$('span, p').css('color', 'red');
$('span').add('p').css('color', 'red');
$('span').css('color', 'red').add('p').css('background-color', 'green');
----------
<div>
    <span>A</span>
    <span>B</span>
    <span>C</span>
</div>
<p>p</p>

※第一行是抓元素是span和p;第二行是抓span,然後將p抓進來,所以效果一樣

※第三行抓span先設定顏色再將p抓進來,所以p沒有變紅,一直到後面的綠底會針對全部的元素設定,如果css裡的屬性一樣,後者會蓋前者



※.addBack()

$("div.a").find("p").css('background-color', 'green');
$("div.a").find("p").addBack().css('background-color', 'green');
----------
<div class="A">
    <p>
        <strong>
            1
            <code>2</code>
        </strong>
    </p>
    
    <div class="a">
        3
        <p>4</p>
        <p>5</p>
    </div>
</div>

※第一行還沒加addBack()時,只抓到4和5

※加了之後,會抓到345,也就是抓到$('div.a'),所以才叫addBack



※.contents()

$(function($) {
    $('div').contents().filter(function(){
        alert($(this).text());
        return true;
    }).css('background-color', 'green');
});
----------
<div>
    div1
    <span class="a">span</span>
    div2
    <p class="b">p</p>
    div3
    <ul>
        <ol>1</ol>
        <ol>2</ol>
    </ul>
    div4
</div>

※取得div的子元素,所以div1~4不會被選中,其他都會



※.end()

$("div").find("p").find('span').css('color', 'red');
$("div").find("p").find('span').end().css('color', 'red');
$("div").find("p").find('span').end().end().css('color', 'red');
----------
<div>
    div
    <p>
        p
        <span>span</span>
    </p>
</div>

※.end()是回上一層

※第一行沒用end()時,抓到的是span而已

※第二行用了一個end(),所以回到上一層p,抓到的是p和span

※第三行用了兩個end(),所以回到上兩層div,抓到的是div、p、span



※.andSelf()

$('span:eq(2)').nextAll().andSelf().css('color', 'red');
----------
<span>A</span>
<span>B</span>
<span>C</span>
<span>D</span>
<span>E</span>

※結果是CDE;若沒加andSelf(),結果會是DE

遍歷樹 (jQuery 10)

官網連結
目前有以下14種:

.next():取同輩的下一個
.prev():取同輩的上一個
.nextAll():取同輩的下一個到最後面
.prevAll():取同輩的上一個到最前面
.siblings():取自己同輩的,但不包括自己,也就是.nextAll()+prevAll()
.parent():從上一層父輩到自己同輩的最後面全取
.parents():從全部的父輩到自己同輩的最後面全取
.children(): 取自己的兒孫輩

.nextUntil():有nextAll()的功能,而且多一個參數,可以更細的過濾
.prevUntil():有prevAll()的功能,而且多一個參數,可以更細的過濾
.parentsUntil():有parents()的功能,而且多一個參數,可以更細的過濾

.offsetParent():整個樹的最上層
.find():找下層的選擇器、元素
.closest():很像parents(),但回傳的是0或1組

以下用.css( "background-color", "red" )來測


※HTML

<div class="a m">
    祖父母
    <div class="b n">
        父母
        <div class="c y">大兄<span>A</span></div>
        <p class="d">大姊<span>B</span></p>
        <div class="e">小兄<span>C</span></div>
        <div class="f">小姊<span>D</span></div>
        <div id="I">
            我
            <div class="g">
                我兒
                <span>孫子</span>
                <span>孫女</span>
            </div>
            <div class="h">
                我女
                <span>孫子</span>
                <span>孫女</span>
            </div>
        </div>
        <p class="i">大妹<span>a</span></p>
        <div class="j">大弟<span>b</span></div>
        <div class="k">小妹<span>c</span></div>
        <div class="l">小弟<span>d</span></div>
    </div>
</div>



※.prev()、.prevAll()、.next()、.nextAll()、.children()、.siblings()、.parent()、.parents()

※結果:
$('#I').prev(): 小姊D
$('#I').prevAll(): 大兄A、大姊B、小兄C、小姊D
$('#I').next(): 大妹a
$('#I').nextAll(): 大妹a、大弟b、小妹c、小弟d
$('#I').children(): 我兒、孫子、孫女、我女、孫子、孫女
$('#I').siblings(): 大兄A、大姊B、小兄C、小姊D、大妹a、大弟b、小妹c、小弟d
$('#I').parent(): 父母~小弟d
$('#I').parents(): 祖父母~小弟d

※這8個都可以加一個參數,放選擇器,如.children('#xxx'),以上面children的例子,結果的6個中,還要有id是xxx的才選取



※.nextUntil()、parentsUntil()、.prevUntil():

※結果:
$('.g').parentsUntil():等同parents(),所以是全部
$('.g').parentsUntil($('div.a')):父母~小弟d
$('.g').parentsUntil($('div.b')):我、我兒、孫子、孫女、我女、孫子、孫女
$('.g').parentsUntil($('div.b'), 'div'):我、我兒、孫子、孫女、我女、孫子、孫女

$('#I').nextUntil():等同nextAll(),所以是大妹a、大弟b、小妹c、小弟d
$('#I').nextUntil($('div.k')):大妹a、大弟b
$('#I').nextUntil($('div.k'), 'p'):大妹a

$('#I').prevUntil():等同prevAll(),所以是大兄A、大姊B、小兄C、小姊D
$('#I').prevUntil($('div.c')):大姊B、小兄C、小姊D
$('#I').prevUntil($('div.c'), 'div'):小兄C、小姊D



※.offsetParent()、.find()、.closest()

※結果:
$('.y').offsetParent():祖父母~小弟d,這個我不太懂,參考官方的範例
$('.b').find('div'):大兄A~小弟d,但大姊B、大妹a沒有被選中(因為是p)
$('.b').find('.h'):我女、孫子、孫女
$('.b').find('.i, .e'):小兄C、大妹a
$('.g').closest('.b'):父母~小弟d(此範例的結果會和parents()一樣)



※.closest()和.parents()的區別

<div>
    A
    <p>
        B
        <div>
            C
            <p>
                D
                <span>E</span>
            </p>
        </div>
    </p>
</div>

※結果:
$('span').parents('div'):ABCDE
$('span').closest('div'):CDE