2011-11-11 11 views
10

Próbuję użyć atrybutów danych w tabeli HTML do przechowywania danych dotyczących elementu, który będzie później używany w wywołaniu ajax, ale mam problem z zaznaczeniem jQuery, gdy Próbuję odzyskać dane.Wyszukiwanie wiersza nadrzędnego wprowadzania tekstu w formularzu

to działa:

var listItemId = $(this).parent().parent().attr('data-id'); 

Jednak selektor .parent().parent() jest zbyt kruchy - it'll złamać jeśli kiedykolwiek zmienić swoją strukturę HTML.

To, co chciałbym zrobić, ale jest zwrócenie niezdefiniowane:

var listItemId = $(this).parent('.list-item').attr('data-id'); 

Moje HTML wygląda następująco:

<tr class="list-item" data-id="1"> 
    <td> 
    <input value="Some text entered by the user" type="text" > 
    </td> 
</tr> 

Czego mi brakuje?

+0

$ (this) podany jest w javascript? Bądź klarowny. –

Odpowiedz

22

wewnętrznie, jquery używa .closest dla tego rodzaju rzeczy.

var listItemId = $(this).closest('tr').attr('data-id'); 

ponadto jeśli zagnieżdżone tabele (które nigdy nie widziałem, ale nigdy nie wiadomo), trzeba wybrać pierwszą „tr” zbyt. (Jest to bardziej przydatne przy szukaniu div niż w wierszach). Jednak do unifikacji kodu nigdy nie używam rodziców, kiedy potrzebuję najbliższego. W ten sposób, nazwy funkcji implikuje to znaczy dokładnie (najbliżej rodzic), natomiast .parents() pozostawia więcej miejsca do interpretacji, a tym samym zmniejszenia czytelności kodu (imo)

wydajność mądry, są równoważne (sprawdź this jsperf)

wreszcie, można rozważyć czystego javasrcipt approache tOO: parentNode (Miles szybciej niż cokolwiek innego, jeśli naprawdę potrzebujesz prędkości)

w przypadku:

var listItemId = $(this.parentNode.parentNode).attr('data-id'); 

lub

var listItemId = this.parentNode.parentNode.attributes['data-id'].value; 

Uwaga: czyste metody javascript wymagają poprawnego html do pracy, w przeciwieństwie do tego, którego dotyczy pytanie (zamknij swój tag wejściowy i dodaj tabelę).

here is a little fiddle

+0

Dzięki za szczegółową odpowiedź. Rozważam twój punkt widzenia na wyrażanie intencji. Może wybrać tę trasę ... –

+0

Chciałbym użyć .data ("id") zamiast .attr ("identyfikator-danych"); – RubbelDeCatc

+0

Ja też lub parentNode.dataset.id. Domyślam się, że .data() była błędna w 2011 r. ... tak: http://stackoverflow.com/questions/5309926/how-to-get-the-data-id-attribute – roselan

4

spróbować

var listItemId = $(this).parents('.list-item').attr('data-id'); 

parents() idzie w górę w drzewie aż pasuje selektora

2

Proponuję:

var listItemId = $(this).parents('tr').data('id'); 

Selektor klasy jest najwolniejszy ze wszystkich selektorów jQuery i należy unikać, chyba że nie ma innego sposobu na uzyskanie potrzebnych informacji.

UPDATE

Naprawiłem składnię skorzystać z metody .data() poprawnie. W ten sposób działa tylko w wersji 1.4.3 lub nowszej.

+0

Ta odpowiedź w większości zadziałała. Jeśli wykonuję '$ (this) .parents ('tr'). Attr ('id-danych');" działa idealnie. Każdy pomysł, dlaczego forma '.data.id' nie będzie działać? –

+1

Opps. Moja składnia była błędna. Zamiast tego wypróbuj '.data ('id')'. Zakłada to, że używasz jQuery w wersji 1.4.3 lub nowszej. – arb

0
$(this).closest('tr').attr('data-id'); 

To będzie najlepsze rozwiązanie dla Twojego problemu. Kod nie będzie zależał od twojej struktury html, chyba że wprowadzisz nowy tag pomiędzy

Powiązane problemy