2016-03-18 18 views
5

jestem zmaga się z tego, co jest prawdopodobnie bardzo prosty kawałek jQueryJak uzyskać dostęp do danych za pomocą atrybutu jQuery

Mam html tak:

<div class="star-rating" data-star-rating="5.0"></div> 
<div class="star-rating" data-star-rating="2.0"></div> 

Mam skrypt, który musi coś zrobić na podstawie ratingu gwiazdą każdego z tych elementów i obecnie wygląda tak:

$('.star-rating').jRate({ 
    startColor : '#ccc', 
    endColor : '#ccc', 
    readOnly : true, 
    rating : <value of data-star-rating> 
}); 

Chcę zastąpić <value of data-star-rating> z wartością atrybutu danych odnoszących do elementu aktualnie przetwarzanego

myślałem, że to będzie działać $(this).data('starRating') ale nie wydaje się, aby

Jak mogę uzyskać dostęp do wartości atrybutu danych w tej sytuacji?

+0

Czy próbowałeś '$ (this) .data ('star-rating')'? – j08691

+0

co to jest 'console.log ((" .star-rating "). Danych (" gwiazda-rating "))' return? Nawet nie przechodzisz przez elementy, które powinno się dostać? 5.0 lub 2.0? –

+0

@ksno zwraca to, co pierwsze jest ... nie jest tak naprawdę istotne, chociaż – Edd

Odpowiedz

4

$(this) nie odnosi się do elementu, na którym funkcja jRate jest nazywany.

Można użyć selektora jeśli istnieje tylko jeden element mający tę klasę

$('.star-rating').jRate({ 
    startColor : '#ccc', 
    endColor : '#ccc', 
    readOnly : true, 
    rating : $('.star-rating').data('star-rating') 
}); 

Dla wielu elementów:

iteracyjne nad wszystkich elementów mających klasę star-rating i dołączyć wtyczkę jRate indywidualnie z wartością rating odpowiedniego elementu.

$('.star-rating').each(function() { 
    $(this).jRate({ 
     startColor: '#ccc', 
     endColor: '#ccc', 
     readOnly: true, 
     rating: $(this).data('star-rating') 
    }); 
}); 

JSFiddle DemoNie znaleziono CDN link do tej wtyczki, więc dodaje kod minified w okienku JavaScript sama

1

Musisz użyć tego:

$(this).attr('data-star-rating'); 
+0

To nie jest prawda o 'data()'. Będzie i zwróci atrybuty danych HTML. – toomanyredirects

5

Można to wykorzystać też:

$(this).data('star-rating'); 

EDIT

Po ponownym przeczytaniu pytanie. Komentarze są poprawne, powinieneś iterować za pomocą tablicy .star-rating, aby zastosować jRate do każdego elementu, przepraszam za moje nieporozumienie.

$('.star-rating').each(function() {  
    $(this).jRate({ 
     startColor: '#ccc', 
     endColor: '#ccc', 
     readOnly: true, 
     rating: $(this).data('star-rating') 
    }); 
}); 
+0

Od wersji jQuery 1.4.3 Atrybuty danych HTML 5 będą automatycznie pobierane do obiektu danych jQuery. Traktowanie atrybutów z osadzonymi myślnikami zostało zmienione w jQuery 1.6, aby było zgodne ze specyfikacją W3C HTML5. – Pradeep

+1

Nie wiem, dlaczego to ma 5 przegranych, ponieważ to nie odpowiada na pytanie? Dlaczego '$ (this) .data ('starRating');' nie zadziałało, ponieważ jest to absolutnie poprawne. – Jai

+0

Po prostu mówię, po ostatniej edycji wygląda to dokładnie jak [moja odpowiedź] (http://stackoverflow.com/a/36085321/2025923) – Tushar

2

Ponieważ istnieje więcej niż jeden elementy posiadające klasę „Star-rating”, więc trzeba będzie pętli przez elemets i pętli foreach uczyni prąd elementem Iteracja dostępny do pętli, dzięki czemu można używać tego elementu. I zastosuj JRate.

$('.star-rating').forEach(function(dateRating){ 
    $(dateRating).jRate({ 
    startColor : '#ccc', 
    endColor : '#ccc', 
    readOnly : true, 
    rating : $(dateRating).attr("data-star-rating") 
}); 
}); 
+1

Podczas gdy ta odpowiedź jest prawdopodobnie poprawna i użyteczna, jest to korzystne, jeśli [dołączasz wyjaśnienie z nim) (http://meta.stackexchange.com/q/114762/159034), aby wyjaśnić, w jaki sposób pomaga rozwiązać problem. Staje się to szczególnie przydatne w przyszłości, jeśli nastąpi zmiana (prawdopodobnie niezwiązana ze sobą), która powoduje, że przestaje działać, a użytkownicy muszą zrozumieć, w jaki sposób działał. Dzięki! – Hatchet

+0

Dodano opis. Myślę, że jest to tak ogólny kod, który każdy może zrozumieć, jeśli używa JavaScript i JQuery. – dsk

0

$(this).data('star-rating') będzie działać, jeśli go zwrócić z funkcji.

$('.star-rating').jRate({ 
    startColor : '#ccc', 
    endColor : '#ccc', 
    readOnly : true, 
    rating : function() { return $(this).data('star-rating'); } 
}); 
Powiązane problemy