2011-08-25 65 views
4

我想寫一個jQuery選擇器,將選擇具有相同的值爲他們的兩個屬性的對象。如何使用jquery檢查兩個屬性是否具有相同的值?

事情是這樣的:

$('div[attr1=attr2]') 

考慮:

<div attr1="foo" attr2="bar">A</div> 
<div attr1="bar" attr2="bar">B</div> 
<div attr1="foo" attr2="bar">C</div> 
<div attr1="foo" attr2="foo">D</div> 

我想它返回鏈接到B和d的div。

有什麼想法?

回答

7

你可以用custom selectors with arguments做到這一點。

$('div:attrEqual(attr1 attr2)') 

您定義自定義選擇這樣的:

$.expr[':'].attrEqual = function(obj, index, meta, stack) { 
    var attrs = meta[3].split(" "); 
    return $(obj).attr(attrs[1]) == $(obj).attr(attrs[0]); 
}; 

對於性能,增加[attr1][attr2]的選擇,使本機DOM過濾掉不具有兩個屬性節點。

+0

我認爲這正是他想要的。 –

+0

非常性感。我完全明白了:這是否會工作,無論attr的名稱是什麼? – meo

+0

但它什麼也沒有返回:http://jsfiddle.net/EGMw2/2/ – meo

0

使用雙等號(==)來檢查語句中的相等性。單個等於(=)用於分配。所以如果($('div [attr1] == div [attr2]'){do something});

+0

屬性等於在jQuery選擇只使用一個等號。請參閱http://api.jquery.com/attribute-equals-selector/ –

+0

是的,選擇器使用一個等號,但問題似乎表明它正在尋找多個屬性值之間的平等檢查。也許我誤解了文檔,但看起來單個等於是用來關聯屬性和它的值,而不是兩個值之間的相等性檢查。 – Evan

4

我認爲屬性選擇器只允許你比較一個常量值。但是你可以使用.filter()功能做比較:

$('div[attr1][attr2]').filter(function(index) { 
    return $(this).attr('attr1') == $(this).attr('attr2'); 
}) 
+0

你需要刪除你的示例中的前導'$('''以使其工作。 – meo

+0

謝謝,我編輯了我的答案。 –

1

像這樣的事情會做的伎倆(The Fiddle):

function GetWithSameAttributes (parID) 
{ 
    var output = new Array(); 

    $('#'+parID).children().each(function() 
    { 
     if ($(this).is('[attr1="'+$(this).attr('attr2')+'"]')) 
      output.push($(this).html()); 
    }); 
    return output; 
} 

$(function() 
{ 
    for (val in GetWithSameAttributes('Items')) 
     document.writeln(val + ' has the same attributes<BR/>'); 
}); 

與HTML類似:

<div id="Items"> 
    <div attr1="foo" attr2="bar">A</div> 
    <div attr1="bar" attr2="bar">B</div> 
    <div attr1="foo" attr2="bar">C</div> 
    <div attr1="foo" attr2="foo">D</div> 
</div> 
1

如果我得到你的權利,你想知道的任何屬性具有相同的價值,不管它的名字。你可以做這樣的:

http://jsfiddle.net/zuwZh/2/

$("div").filter(function(){ 
var attributes = this.attributes, 
    i = attributes.length, 
    attrValues = [], 
    $that = $(this); 
    if(i !== 1) { 
    while(i--) { 
     var attr = attributes[i]; 
     attrValues.push(attr.value); 
    } 
    attrValues = attrValues.sort(); 
    if(attrValues[0] === attrValues[1]) { 
     return $that; //only checks between two attributes, but you could extend that 
    } 
}) 
相關問題