2011-01-17 8 views
40

wiem, że można dodać nowe funkcje jQuery przez $.fn.someFunction = function()Dodaj funkcję jQuery do konkretnych elementów

Jednakże chcę dodać funkcje tylko do konkretnych elementów. Próbowałem tej składni i nie działa $('.someElements').fn.someFunction = function()

Chcę to zrobić tak, że można wywołać funkcję jak to gdzieś w kodzie $('someElements').someFunction();

+0

Nie jestem pewien, czy jest to możliwe, ale jeśli tak, dlaczego miałbyś chcieć sparaliżować swój kod? Jeśli chcesz ograniczyć to do niektórych selektorów, użyj tych selektorów. Lub buforuj wynik z '$ ('. SomeElements')' i wywołaj funkcję jako zmienną plus '.someFunction()' później. – Robert

+0

Problem to $ (...). Fn nie istnieje, tylko $ .fn. I po prostu ustawienie $ (...). SomeFunction nie ma takiego samego efektu, ponieważ nie uruchomi go na każdym elemencie w jego własnym kontekście. –

+0

@ Rober - tak, w końcu właśnie zbuforowałem wynik i użyłem odnośnika do wywołania dodanej funkcji. – peter

Odpowiedz

41

Zastosowanie .bind() i .trigger()

$('button').bind('someFunction',function() { 
    alert('go away!') 
}); 


$('button').click(function(){ 
    $(this).trigger('someFunction'); 
}); 

jako jQuery 1.7 Sposób .on() jest korzystnym metoda dla dołączania programów obsługi zdarzeń do reklamy ocument.

+2

i aby uzyskać dane zwrócone przez funkcję zamiast łańcuchowania jquery, użyj metody triggerHandler – r043v

+8

tylko tutaj, "bind" jest przestarzałe i zastąpione "na" – DMTintner

+0

tak! jest tam tam podany link ... – Reigel

0

miałem pojęcia, że ​​pomyślałem, że może pracować do zrobienia w pobliżu do tego, czego chcesz, ale to nie zadziałało, a mój wniosek jest taki, że nie jest to możliwe.

Mój pomysł był aby zrobić to, czego próbowaliśmy, ale w pamięci podręcznej obiektu jQuery, na przykład:

var a = $("a"); 
a.fn.someFunc = function() {...}; 
a.someFunc();

Ale ponieważ $(...).fn nie istnieje, to nie jest możliwe.

18

yo można wykonać wyżej z tym:

$.fn.testFn = function(){ 
    this.each(function(){ 
     var className = $(this).attr('class'); 
     $(this).html(className); 
    });  
}; 

$('li').testFn(); //or any element you want 

testu: http://jsfiddle.net/DarkThrone/nUzJN/

+4

wie, że ... – Reigel

+2

powinien istnieć zwrot ten w celu łańcucha – qwertymk

+0

@qwertymk: wiem, że było wskazanie, nie zdefiniowanie całej wtyczki jQuery. @Reigil: ibidem, starałem się wskazać, że można to już osiągnąć poprzez jQuery. Cała odpowiedź nie ma sensu. Możesz wybrać dokładny zestaw za pomocą $ (..) zamiast przechodzić cały dopasowany DOM, aby wyeliminować go za pomocą nowych kryteriów. – DarkThrone

0

Nie jestem również pewien z moją odpowiedzią, jeśli to ci pomoże, ale po prostu spróbuj, jak korzystać z .live?

$(selector).live(click,function(){ 
    //some codes here 
}); 
9

Yo, potrzebował zrobić to samo, wpadł na to. to dobra przyczyna, dla której niszczysz element, a funkcja zmienia się w puf! Myślę ...

var snippet=jQuery(".myElement"); 
snippet.data('destructor', function(){ 
    //do something 
}); 
snippet.data('destructor')(); 
7

@ Reigel's Odpowiedź jest świetna! Jednak można także używać składni $.fn i niech funkcja obsługuje tylko niektóre elementy:

$.fn.someFunction = function(){ 
    this.each(function(){ 
     // only handle "someElement" 
     if (false == $(this).hasClass("someElement")) { 
      return; // do nothing 
     } 

     $(this).append(" some element has been modified"); 

     return $(this); // support chaining 
    });  
}; 

// now you can call your function like this 
$('.someElement').someFunction();    

Zobacz jsfiddle robocza: http://jsfiddle.net/AKnKj/3/

5

I rzeczywiście miał ten przypadek użycia, jak również, ale z pamięci podręcznej obiektu. Tak więc miałem już obiekt jQuery, menu przełączalne i chciałem dołączyć do tego obiektu dwie funkcje: "otwórz" i "zamknij". Funkcje potrzebne do zachowania zakresu samego elementu i to było to, dlatego chciałem, aby obiekt menu był this. W każdym razie możesz po prostu dodać funkcje i zmienne wszystkie zachowując się powoli, tak jak każdy inny obiekt javascript. Czasami to zapominam.

var $menu = $('#menu'); 
$menu.open = function(){ 
    this.css('left', 0); 
    this.is_open = true; // you can also set arbitrary values on the object 
}; 
$menu.close = function(){ 
    this.css('left', '-100%'); 
    this.is_open = false; 
}; 

$menu.close(); 
+0

To jest świetny sposób, aby sobie z tym poradzić. Jest to szczególnie przydatne, jeśli dodałeś coś do DOM (np. Okno pop-over) i chcesz, aby funkcje były obecne tylko dla tego jednego elementu DOM. Kiedy później usuniesz pop-over, funkcje znikną wraz z nim. Możesz również zrobić to w ten sposób: '$ ('# menu') [0] .open = function() {...};' Abyś mógł uzyskać uchwyt i przypisać do niego dowolną funkcję w jednym kroku . – JaredC

-1

Zrobiłem to i działa dobrze ..

function do_write(){ 
    $("#script").append("<script> $(\'#t"+(id_app+4)+"\').change(function(){ alert('Write Your Code here'); });<\/script>"); 
    console.log("<script> $(\'#t"+(id_app+4)+"\').change(function(){ alert('hello'); });<\/script>"); 
} 

i funkcja połączenia z dynamicznym funkcji, która tworzy dynamiczną kontrolę w html

3

Jeśli chcą tę funkcję tylko do szczególnych selektorów dodaje będzie pracować dla Ciebie. Właśnie miałem scenariusz, w którym potrzebowałem tego i działa ładnie.

$('.my-selector').each(function(){ 

    $(this).init.prototype.getUrl = function(){ 
     // do things 
    }; 
}) 

następnie później można zrobić

$('.my-selector').getUrl() 

bez konieczności definiowania go jako plugin lub użyj danych lub bind/na imprezach/spustowych.

Oczywiście można zmienić funkcję, aby przywrócić obiekt zawierający jeśli chcesz go używać w łańcuchowym wracając this

$('.my-selector').each(function(){ 

    $(this).init.prototype.getUrl = function(){ 
     // do things 
     return this; 
    }; 
}) 
+1

to załączy getUrl do jquery nie tylko dla tego elementu. –

+0

Chciałbym, aby po 3 latach ktoś na dole głosował. Wyjaśnienie byłoby miłe –

2

Najbardziej oczywistym rozwiązaniem jest przypisanie funkcji jako własność obiektu:

obj.prop("myFunc", function() { 
    return (function(arg) { 
    alert("It works! " + arg); 
    }); 
}); 

następnie zadzwonić na obiekcie w ten sposób:

obj.prop("myFunc")("Cool!"); 

Uwaga: twoja funkcja jest wartością zwrotną zewnętrznego, zobacz: http://api.jquery.com/prop/#prop-propertyName-function

Powiązane problemy