12個很棒的jQuery選擇器擴展

fmms 12年前發布 | 25K 次閱讀 jQuery Ajax框架

我最近開始編寫自己的jQuery選擇器,我越來越開始意識到這是一種不錯而簡潔的完成某些特定任務的方式,而以往我使用的是迭代器。

這些選擇器中如果不是你一直在尋找的,你也許根本將不會碰到。所以我決定寫下一個簡單的教程來告知你用jQuery寫出自己的選擇器是一件相當輕松的事。

下面是一個用jQuery編寫選擇器的模版文件,你需要的全都在這里:

$.extend($.expr[':'],
{
    selectorName: function(el, i, m)
    {
        return true/false;
    },

selectorName2: function(el, i, m)
{
    return true/false;
}

});</pre>

下面是兩種調用一個選擇器的方法,一種帶有一個參數而另一種則沒有參數:

$("#container :selectorName");
$("#conainert :selectorName(#element)");
$("#conainert :selectorName(>300)");

i與m參數可以是缺省的,當傳入一個集合,他們只是用來匹配一個參數的當前元素的索引。當你傳入一個參數時,匹配器便開始工作了,這是一個正則表達式匹配器,返回類似如下信息:

[":width(>100)", "width", "", ">100"]

你會經常使用到m[3]的值,至此,便由你決定如何處理傳入的參數。下面給出了一系列的例子。

我們可以與jQuery已有的選擇器一起進行鏈式的調用,這是相當有意思的:

$("#container :isBold:even");
$("#container :leftOf(#element):width(>100):height(>100)");

你可以在此下載該庫和文檔

以下列出12個自定義的選擇器實例,你可以在這些選擇器中放入任何內容,只要你根據當前元素是否通過選擇器測試返回true或者false值即可。

1、:loaded

選擇所有加載完的圖片:

$.extend($.expr[':'],
{
    loaded: function(el)
    {
        return $(el).data('loaded');
    }
}

$('img').load(function(){ $(this).data('loaded', true); }); $('img:loaded');</pre>

2、:width

選擇所有寬度大于或小于指定值的元素:

$.extend($.expr[':'],
{
    width: function(el, i, m)
    {
        if(!m[3]||!(/^(<|>)\d+$/).test(m[3])) {return false;}
        return m[3].substr(0,1) === '>' ? 
            $(el).width() > m[3].substr(1) : $(el).width() < m[3].substr(1);
    }
}

$('#container :width(>100)');</pre>

3、:height

選擇所有高度大于或小于指定值的元素:

$.extend($.expr[':'],
{
    height: function(el, i, m)
    {
        if(!m[3]||!(/^(<|>)\d+$/).test(m[3])) {return false;}
        return m[3].substr(0,1) === '>' ? 
            $(el).height() > m[3].substr(1) : $(el).height() < m[3].substr(1);
    }
}

$('#container :height(<100)');</pre>

4、:leftOf

選擇在指定元素左邊的所有元素

$.extend($.expr[':'],
{
    leftOf: function(el, i, m)
    {
        var oe = $(el).offset();
        var om = $(m[3]).offset();

    return oe.left + $(el).width() < om.left;
}

}

$('#container :leftOf(#element)');</pre>

5、:rightOf

選擇在指定元素右邊的所有元素

$.extend($.expr[':'],
{
    rightOf: function(el, i, m)
    {
        var oe = $(el).offset();
        var om = $(m[3]).offset();

    return oe.left > om.left + $(m[3]).width();
}

}

$('#container :rightOf(#element)');</pre>

6、:external

選擇所有帶外站鏈接的錨點標簽

$.extend($.expr[':'],
{
    external: function(el)
    {
        if(!el.href) {return false;}
        return el.hostname && el.hostname !== window.location.hostname;
    }
}

$('#container :external');</pre>

7、:target

選擇指定target屬性的錨點標簽

$.extend($.expr[':'],
{
    target: function(el, i, m)
    {
        if(!m[3]) {return false;}
        return (m[3] === '_self' && ($(el).attr('target') == '' || !el.target)) || 
            (m[3] === $(el).attr('target'));
    }
}

$('#container :target(_self)');</pre>

8、:inView

選取位于可視窗口內的所有元素

$.extend($.expr[':'],
{
    inView: function(el)
    {
        var offset = $(el).offset();

    return !(
        (offset.top > $(window).height() + $(document).scrollTop()) || 
        (offset.top + $(el).height() < $(document).scrollTop()) || 
        (offset.left > $(window).width() + $(document).scrollLeft()) || 
        (offset.left + $(el).width() < $(document).scrollLeft())
    )
}

}

$('#container :inView');</pre>

9、:largerThan

選取比指定元素大的所有元素

$.extend($.expr[':'],
{
    largerThan: function(el, i, m)
    {
        if(!m[3]) {return false;}
        return $(el).width()  $(el).height() > $(m[3]).width()  $(m[3]).height();
    }
}

$('#container :largerThan(#element)');</pre>

10、:isBold

選擇font-weight為700的所有元素

$.extend($.expr[':'],
{
    isBold: function(el)
    {
        return $(el).css("fontWeight") === '700';
    }
}

$('#container :isBold');</pre>

11、:color

選擇顏色為指定RGB值的所有元素

$.extend($.expr[':'],
{
    color: function(el, i, m)
    {
        if(!m[3]) {return false;}
        return $(el).css('color') === m[3];
    }
}

$("#container :color(rgb(255, 0, 0))");</pre>

12、:hasId

選擇存在id屬性的所有元素

$.extend($.expr[':'],
{
    hasId: function(el)
    {
        return $(el).attr('id') !== undefined && $(el).attr('id') !== '';
    }
}

$("#container :hasId");</pre>

via:websanova.com,OSChina原創編譯

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!