2010-08-02 16 views
7

jQuery zapewnia mi teraz zabawne wprowadzenie do Javascript po 12 latach bezowocnego życia. Jestem na etapie, na którym staram się nauczyć jak najwięcej o optymalizacji kodu, który piszę i chociaż znalazłem dużo dobrego materiału referencyjnego, jest coś podstawowego, co mnie zastanawia i nie byłem w stanie aby znaleźć cokolwiek na ten temat w dowolnym miejscu.

Kiedy przywiązuję coś do elementu, jak powinienem odnosić się do tego elementu w funkcji. Na przykład, gdy dołączasz funkcję do elementu za kliknięcie imprezy:

$('#a_button',$('#a_list_of_buttons')).click(function() { 
    // NOW WHAT'S THE BEST WAY TO REFER TO '#a_button' ? 
}); 

nie wiem zachować re-wybierając go jak tak przeglądarka musi przeszukać cały DOM ponownie od zera, aby znaleźć to, co już stwierdzono raz :

$('#a_button').click(function() { 
    // I KNOW THAT THIS IS NAUGHTY 
    var buttonValue = $('#a_button').val(); 
    $('#a_button').addClass('button_has_been_clicked'); 

}); 

Obecnie używam jednego z następujących ale nie jestem do końca pewien, co każdy z nich jest rzeczywiście robi:

$('#a_button').click(function() { 
    // USING this 
    var buttonValue = $(this).val(); 
    $(this).addClass('button_has_been_clicked'); 
}); 

ale jest to po prostu ponownie wybierając jak w jodeł t "niegrzeczny" przykład?

Wygląda na to, że może być lepiej, ale czy można wielokrotnie odwoływać się do "event.target"?

$('#a_button').click(function(event) { 
    // USING A LOCAL VARIABLE 
    var thisButton = $(this); 

    // OR SHOULD THAT BE 
    var thisButton = $(event.target); 

    var buttonValue = thisButton.val(); 
    thisButton.addClass('button_has_been_clicked'); 
}); 

Rozumiem wydajności wydajności przechodząc do rzeczy zmiennych, ale jestem pewien, czy w takich sytuacjach za pomocą $ (this) lub $ (event.target) dostarcza mi już i tak przez te same wydajności ustawianie nowej zmiennej Robię więcej pracy, której potrzebuję.

Dziękuję.

Odpowiedz

4

Mogę się mylić, ale this i event.target są po prostu różnymi odniesieniami do tego samego elementu.

this i event.target nie są zawsze odniesienia do tego samego elementu. Ale w odpowiedzi na twoje pytanie, zdecydowanie wygrywa var thisButton = $(this);. Jeśli zostały pisanie kodu C#, nigdy nie należy wykonać następujące czynności:

this.Controls[0].Controls[0].Text = "Foo"; 
this.Controls[0].Controls[0].Controls.Clear(); 

Można by to zrobić:

var control = this.Controls[0].Controls[0]; 

Więc prawdopodobnie nigdy nie powinny ponownego wykorzystania $(this) więcej niż raz albo. Mimo, że konwersja this z elementu DOM na obiekt jQuery jest banalnie trywialna, nadal jest niepotrzebnym narzutem.

Czasami trzeba jednak cofnąć się od optymalizacji, aby upewnić się, że kod zachowuje czytelność.

Inną opcją jest oczywiście zmiana tego, co jest this. To javascript afteral:

this = $(this); // Now `this` is your jQuery object 

Zastrzeżone: ja dopiero próbowałem powyżej i wydawało się do pracy. Może jednak mieć pewne problemy.

+2

Opcja 'target' własność obiektów zdarzeń jest znormalizowana w jQuery i będzie działać tak samo we wszystkich przeglądarkach że to wspiera. To nie zawsze jest takie samo jak "to". –

+0

@GenericTypeTea - twoja metoda wygrywająca jest tym, co widziałem w prawie wszystkich materiałach referencyjnych, które przeczytałem, ale nie - gdzie wyjaśniono, dlaczego użyli tej metody, poza tym używając odpowiednika $ ('# a_button ") należy unikać, ponieważ wymaga świeżego wyszukiwania DOM, gdy jest używany. –

+0

@Tim - zaktualizowano odpowiedź. Dzięki. – GenericTypeTea

0

Z mojego doświadczenia wynika, że ​​idę z następujących czynności:

$('#a_button').click(function() { 
    // USING this 
    var buttonValue = $(this).val(); 
    $(this).addClass('button_has_been_clicked'); 
}); 

this w kontekście metodę click zwrotnego jest odniesienie do zdarzenia DOM. Ponieważ masz już odniesienie do obiektu DOM, to jest trival, aby przekonwertować go do obiektu jQuery, ponieważ wyszukiwanie nie jest wymagane.

Ale na marginesie, jeśli nie potrzebujesz używać jQuery w swoim oddzwonieniu, to nie rób tego. Możesz po prostu uzyskać wartość przycisku za pomocą standardowego JS this.currentTarget.value.

Inne wymienione przykłady wymagają wyszukiwania DOM, a w zależności od złożoności selektora może to potrwać dłużej. Używanie wyszukiwania opartego na identyfikatorze, takiego jak '#a_button', będzie działać lepiej niż klasa oparta na klasie wyglądającej na .myClass.

+0

Aby to wyjaśnić, czy użycie "event.target" wymaga dodatkowego wyszukiwania DOM? Aha, i uczenie się o standardowym Javascriptu dla niektórych rzeczy jQuery jest zdecydowanie na mojej liście rzeczy do zrobienia dzięki za notatkę. –

+0

@Chris Stevenson - Nie, event.target zawiera już element DOM, który podniósł wydarzenie i nie wymaga dodatkowego wyszukiwania. Więc '$ (this)' będzie takie samo jak '$ (event.target)' w twoich przykładach. –

5

i event.target nie zawsze są takie same. this odnosi się do elementu, któremu przypisano słuchacza (w tym przypadku "#a_ przycisk"). event.target jest jednak elementem, który faktycznie wywołał zdarzenie, które może być węzłem podrzędnym z #a_button.

Tak więc $(this) jest tym, czego szukasz.

See referencyjny: http://api.jquery.com/event.target/

+0

To właśnie sytuacje, w których "ten" i "event.target" są takie same, powodują zamieszanie. –