Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery]parent this w pluginie jQuery
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Mlodycompany
Witam. Pisze sobie plugin do jQuery do wyświetlania okienek dialogowych i mam już coś takiego
[JAVASCRIPT] pobierz, plaintext
  1. (function($){
  2. $.fn.extend({
  3. dialog: function(options) {
  4. var defaults = {
  5. width: 'auto',
  6. height: 'auto',
  7. closeOnEscape: true,
  8. closeText: 'Zamknij',
  9. autoCenter: true
  10. }
  11. var options = $.extend(defaults, options);
  12. $(this).width(options.width).height(options.height);
  13. if(options.closeOnEscape == true){
  14. $(document).keypress(function(event) {
  15. if(event.keyCode == 27) {
  16. $(this).hide();
  17. }
  18. });
  19. }
  20. if(options.autoCenter == true){
  21. var winH = $(window).height();
  22. var winW = $(window).width();
  23. var modH = $(this).height();
  24. var modW = $(this).width();
  25. var left = (winW - modW) / 2;
  26. var top = (winH - modH) / 2;
  27. $(this).css('top', top);
  28. $(this).css('left', left);
  29. }
  30. $(this).show();
  31. }
  32. });
  33. })(jQuery);
[JAVASCRIPT] pobierz, plaintext

... no i mam też problem. Otóż w 16 linii w/w kodu chcę aby to całe okienko dialogowe się zamykało, a jednak się nie zamyka. Doszedłem do wniosku, że this w tej linii odwołuje się do document, a nie do tego okienka. Próbowałem to zrobić poprzez
[JAVASCRIPT] pobierz, plaintext
  1. $(this).parent().hide();
[JAVASCRIPT] pobierz, plaintext
ale i tak nie działa. Może wiecie w jaki sposób to rozwiązać? Z góry dziękuje
zegarek84
ano pasuje poczytać o this i "bindowaniu" funkcji/metod do innych obiektów...

rozwiązaniem tutaj jest np. przypisanie wcześniej this do jakiejś zmiennej lokalnej której później oczywiście nie możesz nadpisać w stylu:
Kod
if(options.closeOnEscape == true){
    var that = this;
    $(document).keypress(function(event) {
        if(event.keyCode == 27) {
            $(that).hide();
        }
    });            
}

jest to łatwiejsze w podstawowym zrozumieniu - jednak ja jakoś wolę przekazywać jako argument do zmiennej lokalnej i częściej stosowałem coś w stylu (function(argument1, argument2){return function(){/* tu mam zasięg do zapamiętanych argumentów - jeśli miały być raz użyte tylko to też dopiero tutaj je zerowałem*/}})(wartosc_1, wartosc_2);

czyli w Twoim przypadku napisałbym w stylu:
Kod
if(options.closeOnEscape == true){
    $(document).keypress((function(that){
        return function(event) {
            if(event.keyCode == 27) {
                $(that).hide();
            }
        }
    })(this));            
}

po prostu posłużyłbym się tutaj anonimową funkcją jako konstruktorem... oczywiście jeśli miałbyś mieć więcej takich konstruktorów to lepiej to przypisać do jakiejś zmiennej i wywołać jako funkcję zamiast obudowywać funkcję nawiasami i ją wywoływać...

EDIT
oczywiście tutaj this należy do tego obiektu pod który podpiąłeś metodę dialog....
Mlodycompany
Dzięki wielkie. Pomogło:)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.