2013-05-07 14 views
8

Widziałem to banda:jQuery '#' + dane ("target") wzór

<a href="#" id="trigger" data-target="content">Click me</a> 
<div id="content">And something will happen here</div> 

z JS tak:

$("#trigger").click(function(){ 
    $("#" + $(this).data("target")).hide(); 
}) 

Wygląda to trochę dziwnie mi się robienie tego łączenia ciągów w celu utworzenia selektorów, które są następnie używane do uzyskania elementu docelowego. Czy istnieje lepszy wzór w JavaScript (z dostępnym jQuery) do ustawiania procedur obsługi jednego elementu, który musi wiedzieć o innym elemencie docelowym?

+1

Może wydawać się nieco niezręczne, ale nie ma w tym nic złego. – j08691

+1

@ j08691 Wiem, że to działa, szukając pewnych doświadczonych argumentów na temat dobrych praktyk od osób, które utrzymywały większe projekty JS. – spike

Odpowiedz

20

Dlaczego robisz ciąg konkatenacji prostu przechowywania identyfikatora z #

<a href="#" id="trigger" data-target="#content">Click me</a> 

$("#trigger").click(function(){ 
    $($(this).data("target")).hide(); 
}) 

Podobnie można przechowywać dowolne selektorów jak w data-target powiedzieć ex: - .tab1 etc, dzięki czemu nie trzeba ponownie wykonać ciąg konkatenacji wewnątrz kliknięcia lub dowolnego wydarzenia.

+1

Po prostu z ciekawości: czy '$()' wokół '$ (this) .data (" cel ") jest naprawdę potrzebne? – SirDerpington

+3

@SirDerpington Tak, 'this' jest elementem DOM i nie ma funkcji' data'. 'data' jest funkcją jquery, więc musisz użyć' $ ', aby utworzyć obiekt jquery. –

+1

Inną zaletą tego podejścia jest to, że nie jestem już ograniczony do identyfikatora. Każdy selektor zadziała. – spike

2

Dlaczego nie zrobić coś takiego, o wiele lepsze podejście moim zdaniem:

// Set the target 
$("#trigger").data('target', $('#content')); 

// Get the target 
$("#trigger").click(function(){ 
    $(this).data("target").hide(); 
}) 

Jeśli ustawienie go od zaplecza, bym to hash z wartością atrybutu jak inni sugerowali.

<a href="#" id="trigger" data-target="#content">Click me</a> 

$("#trigger").click(function(){ 
    var target = $(this).data("target"); 
    $(target).hide(); 
}) 
+0

Ilekroć to widziałem, atrybut danych jest używany, ponieważ jest ustawiony z zaplecza. –

+0

Wystarczająco uczciwe, to dobra uwaga. – Gabe

+0

Dobrze, chciałbym, aby JS był ogólny, aby móc określić cele w moim znaczniku i wszystko płynie. Chyba pytanie brzmi, jak najlepiej przejść od napisów w HTML do obiektów w javascript.Ustawienie celu danych do rzeczywistego obiektu jquery jest idealne, ale jak to zrobić ogólnie? – spike

1

Zawsze masz możliwość zbudowania selektora, wygląda trochę ładniej niż konkatenacja ciągu wewnątrz selektora.

$("#trigger").click(function(){ 
    var selector = "#" + $(this).data("target"); 
    $(selector).hide(); 
}); 

Trochę ładniej, nie jestem pewien, czy tego właśnie szukasz.

+1

Tak, to może być bardziej czytelne w zależności od kontekstu. – spike

0

Pominęłabym dane - całkowicie, umożliwiając tym samym pełną grację degradację.

<a href="#content" id="trigger" data-target="">Click me</a> 
<div id="content">And something will happen here</div> 

z

$("#trigger").click(function(e){ 
    e.preventDefault(); 
    $($(this).attr("href")).show(); 
    // note, i'm purposly not using this.href due to a bug in IE that would return the entire href rather than just the hash 
}) 
2

można po prostu użyć

$('#content').modal('toggle'); 

Obojętnie gdzie jesteś kod, aby rozpocząć pokaz modalne i ukryć, Można używać nawet "show"/"ukryj" funkcjonalność bezpośrednio.

Zakładam, że używasz Bootstrap i jednej z najnowszych wersji jQuery.

Ciesz się!

+0

to nie odpowiada na moje pytanie. Nie chodzi o to, jak ukryć lub pokazać rzeczy za pomocą JS, chodzi o wzory osadzania dynamicznych selektorów w HTML. – spike

0

$ (this) .attr ("cel danych", "#myTarget");

to zadziałało dla mnie