2012-03-03 11 views
14

Próbuję kierować na nazwy atrybutów, które zawierają określone słowo & nie w sposób, w jaki myślisz.Nazwa atrybutu jQuery zawiera

Powiedzmy mam:

<div data-foo-bar="hello"></div> 

Jak mogę kierować elementy, które mają 'data-foo' w nazwie atrybutu?

+0

Można użyć niestandardowego jQuery selektora: http://stackoverflow.com/a/26657510/1414562 –

Odpowiedz

12

nie sądzę można kierować nazw atrybutów w taki sam sposób kierowania wartości atrybutów. Można jednak użyć .filter() to zrobić dość sprawnie:

$('div').filter(function() { 
    for (var property in $(this).data()) { 
    if (property.indexOf('fooBar') == 0) { 
     return true; 
    } 
    } 

    return false; 
});​ 

Uwaga, data-foo-bar został przerobiony na fooBar.

Demo: http://jsfiddle.net/Tyj49/3/

+0

referencja dla "selektorów atrybutu" http://api.jquery.com/category/selectors/ – charlietfl

+3

Jestem dobrze zaznajomiony z jQuery. Selektory te są zgodne z * wartością * danego atrybutu, a nie nazwą atrybutu. – Blender

+0

Ten wydaje się lepszy. A jeśli chcesz tylko buforować przefiltrowane obiekty na później, możesz to zrobić w ten sposób: http://jsfiddle.net/Tyj49/4/ Podczas gdy będę zgadywał, że ponowne wyobrazienie tego podejścia jest prawdopodobnie lepsze na dłuższą metę (trudno powiedzieć, nie znając przypadku użycia), to dostaje głos na pewno. –

-5

Spróbuj coś takiego

var element = $('div[data-foo-bar=hello]')​; 
+0

nie wiem, dlaczego to ma na stomped z votedowns, wydaje się najprostszym ważnej koncepcji tak daleko od http: // jsfiddle .net/wHuV2/ – charlietfl

+0

Program OP próbuje dopasować atrybut * name *, a nie rzeczywistą wartość. Pytanie było nieco niejednoznaczne. – Blender

+0

zrozumiałe o wartości, ale atrybut jest o wiele prostszy niż 4 filtry liniowe – charlietfl

4

nie jestem pewien, że można to zrobić. Zerknąłem na API i wydaje się, że możesz tylko głębiej dopasować częściowe wartości, a nie samą nazwę atrybutu.

Dam ci potencjalnie frustrującą radę, "nie rób tego". ;-) W skrócie, to, o co nam chodzi, to wiązka elementów div, które pasują do bardziej ogólnej kategorii. Nie tylko data-foo-bar s, ale WSZYSTKIE data-foo s! Dlaczego po prostu nie nadać wszystkim opisom danych nazwy klasy, z której można wybrać, lub osobnego atrybutu, takiego jak data-foo="true"?

Innymi słowy, zamiast trzymać się ściśle zadanego pytania, chciałbym wiedzieć, co to jest przypadek użycia, tak że być może boczny ruch myślenia może równie skutecznie rozwiązać twój problem. Wiele sposobów na skórze kota i tak dalej.

+0

Cóż, moją alternatywą byłoby posiadanie 2 atrybutów danych. Ale pomyślałem, że jeśli istnieje wola, istnieje sposób, więc stackoverflow przyszedł mi do głowy. :) – daryl

+0

możesz napisać to $ ('[data-foo-bar]') zadziała – charlietfl

+0

Wystarczająco fair, Brogrammer. ;-) –

0

Spróbuj

$().ready(function() { 
    var test=$('#div_test').data("foo-bar"); 
    alert(test); 
}); 

HTML:

<div data-foo-bar="hello" id="div_test"></div> 
+0

Przez golly wydaje się działać. Może warto postawić kilka testów na kontrprzykładach, aby sprawdzić, czy są kruche, czy nie, ale tutaj jest w akcji: http://jsfiddle.net/YkTJy/ –

+0

Dzięki @GregPettit – pkachhia

+0

Crazy. Niemal przegłosowałem, dopóki nie zobaczyłem twojego komentarza @GregPettit. To nauczy mnie wyciągać wnioski. – daryl

1

Jest to alternatywne rozwiązania. Jeśli można zapewnić nazwę atrybutu, którego szukasz, nie jest obecny w tekście elementu, co można zrobić, to uzyskanie wartości outerHtml elementu, a następnie dokonać wyszukiwania podciąg:

$("elementsToCheck").each(function() { 
    var elemHtml = $('<div>').append($(this).clone()).html(); //clone to get the outerHTML 
    if (elemHtml.indexOf("attributeName") >= 0) { 
     // current element contains the attribute with name "attributeName" 
    } 
}); 

Nadzieja to pomaga.

0

Użyj .data(), aby uzyskać wszystkie atrybuty danych elementu, a następnie użyj .filter, aby uzyskać elementy, które mają atrybuty data-validation*.

var validated_elements = $("p").filter(function() { 
    var found = false; 
    $.each($(this).data(function(key) { 
     if (key.match(/^data-validation/)) { 
      found = true; 
      return false; 
     } 
    } 
    return found; 
}); 
Powiązane problemy