2012-09-14 6 views
6

Czytam jquery documentation of plugin authoring i jestem do tego dobrze zaznajomiony. Jednak podane przykłady zawsze działają na zbiorze wcześniej dopasowanych elementów. Chcę utworzyć funkcję, która może zrobić zarówno:Jak ustawić funkcję wtyczki jQuery do samodzielnego użycia, która nie działa w kolekcji

// example usage of my to-be-created plugin function 

// this is the way described in the docs, and I know how to do that 
$("a").myFunction() 

// but I also want to be able to call the function without a collection: 
$.myFunction(); 

Jeśli $.myFunction() nazywa bez kolekcji działać dalej, by stworzyć swój własny zbiór jakie elementy, aby dopasować - rodzaj procesu inicjalizacji (ale niekoniecznie uruchom tylko raz). Ponadto, $.myFunction() powinna zachowywać łatwość łańcuchowania.

pseudokod, co chcę osiągnąć:

// [...] 
function myFunction(): { 
    if (notCalledOnACollection) { 
     // this should run when called via $.myFunction() 
     $elements = $("a.myClass"); 
    } 
    else { 
     $elements = $(this); 
    } 
    return $elements.each (function() { 
     // do sth. here 
    }); 
} 

naprawdę chciałbym, aby zachować wszystkie funkcje realizacji/funkcjonalności w obrębie jednej definicji funkcji, a nie dwa oddzielnie nazwie funkcji lub dwóch jednakowo nazwanych działa w dwóch osobnych miejscach wewnątrz obiektu jQuery.

I oczywiście można dodać parametr myFunction (do_init) wskazującą co gałąź rachunku if do wykonania, ale to by zaśmiecać moją listę argumentów (Chcę użyć tego podejścia do wielu wtyczek, a tam będzie argumentes do myFunction() że Właśnie opuściłem tutaj dla uproszczenia).

Jakieś dobre sugestie?

Odpowiedz

8

Dodając kolejne odniesienie w zaliczane wtyczki, można łatwo użyć standardowego kodu wtyczki:

(function($) { 
    $.myPlugin = $.fn.myPlugin = function(myPluginArguments) { 
     if(this.jquery) 
      //"this" is a jquery collection, do jquery stuff with it 
     } else { 
      //"this" is not a jquery collection 
     } 
    }; 

    $.fn.myPlugin.otherFunc = function() { 
    }; 
})(jQuery); 

Jedyną różnicą jest tu $.myPlugin = część, która pozwala bezpośrednio zadzwonić do wtyczki bez uruchamiania selektor jQuery funkcjonować. Jeśli zdecydujesz, że potrzebujesz innych funkcji lub właściwości, możesz utworzyć je jako właściwości wtyczki.

Zastosowanie:

//using a selector (arguments optional) 
$(".someClass").myPlugin(); 

//using the options variable - or whatever your arguments are 
$.myPlugin({id: "someId"}); 

//accessing your other functions/properties 
$.myPlugin.otherFunc(); 
+0

mam poważne problemy z roztworu. Powtórzyłem twoje podejście do jsfiddle: http://jsfiddle.net/pnpbU/ Ale gdy uruchomię '$ .myPlugin()', wszystkie testowane przeglądarki zużywają 100% procesora i utkną (testowane z FF na Linuxie i Windowsie , Safari na Macu). – Dyna

+0

Nie widzę tego problemu na moim komputerze. A w tej chwili jestem na dinozaurie. Poza tym, jsfiddle nie powinno być używane do testowania wydajności, mają oni załadowaną grupę dodatków. Testowałem też lokalnie i również nie widziałem problemu. Naprawdę wątpię, że twoje widzenie ma coś wspólnego z tym kodem. – Donamite

+0

Czy odkomentowaliście linię w js części jsfiddle? Inaczej nie będzie działać! Obecnie jestem na uniwersytecie i mam dostęp do mnóstwa komputerów. Mogę odtworzyć zużycie 100% procesora na 3 fizycznie różnych maszynach. Użycie http://jsfiddle.net/pnpbU (z usunięciem komentarza z ostatniego wiersza) i naciśnięcie run spowoduje zablokowanie/zakończenie skryptu w Fedorze 17: Firefox 14.0.1, Chrome 22; Windows 7: Firefox 14, IE9; OS X Lion: Safari 5, Firefox 14. Jest * zdecydowanie * odtwarzalny. Nie ma to nic wspólnego z jsfiddle, kopiowanie tego skryptu razem z jQuery 1.8.0 i uruchamianie pokazuje ten sam efekt. – Dyna

Powiązane problemy