2009-07-28 11 views
62

Jestem programistą newbie i nie mogę wymyślić, jak zapisać funkcję w JQuery i uruchomić w niej wiele miejsc.Jak uruchomić funkcję w jquery

mam:

$(function() { 
    $("div.class").click(function(){ 
    //Doo something 

    }); 

    $("div.secondclass").click(function(){ 
    //Doo something 
    }); 

}); 

Teraz 2 "// Doo somethings" są takie same, a ja nie chcę znowu pisać tego samego kodu.

Jeśli kładę:

$(function() { 

    function doosomething() 
    { 
    //Doo something 
    } 

    $("div.class").click(doosomething); 

    $("div.secondclass").click(doosomething); 

}); 

To by uruchomić funkcję na stronie obciążenia, a nie tylko wtedy, gdy zaskoczy.

Jak zrobić to poprawnie?

Dzięki!

Odpowiedz

108

Następujące elementy powinny ładnie działać.

$(function() { 

    // Way 1 
    function doosomething() 
    { 
    //Doo something 
    } 

    // Way 2, equivalent to Way 1 
    var doosomething = function() { 
    // Doo something 
    } 

    $("div.class").click(doosomething); 

    $("div.secondclass").click(doosomething); 

}); 

Zasadniczo, deklarują swoją funkcję w takim samym zakresie jak wasz używasz go (JavaScript wykorzystuje Closures celu określenia zakresu).

Teraz, ponieważ funkcje w JavaScript zachowywać się jak każdy inny obiekt, można po prostu przypisać doosomething jako funkcja zadzwonić na kliknięcia za pomocą .click(doosomething);

Twoja funkcja nie będzie wykonywał do czasu wywołania go za pomocą doosomething() (doosomething bez () odnosi się do funkcji, ale jej nie nazywa) lub innej funkcji wywołującej (w tym przypadku procedura obsługi click).

+1

Dziękuję drodze 2, będę musiał spróbować że. Ale funkcja rzeczywiście działa przy ładowaniu strony, ponieważ w jquery $ (function() jest skrótem dla ładowania dokumentu.Tak więc przynajmniej 1, nie zadziała. – Corin

+0

Sposób 1 działa ... Właśnie go przetestowałem. –

+2

Jestem bardzo nowy w jQuery, więc możesz wyjaśnić pierwszą linię '$ (function() {" Jaki jest cel tej linii, proszę? Tyvm –

18
function doosomething() 
{ 
    //Doo something 
} 


$(function() { 


    $("div.class").click(doosomething); 

    $("div.secondclass").click(doosomething); 

}); 
11

Alternatywnie (powiedziałbym najlepiej), można zrobić to tak:

$(function() { 
    $("div.class, div.secondclass").click(function(){ 
    //Doo something 
    }); 
}); 
+7

To pokonuje punkt pytania: – Corin

+1

Nice when fe div.secondclass jeszcze nie istnieje ... NOT! – bicycle

28

chciałbym zrobić to w ten sposób:

(function($) { 
jQuery.fn.doSomething = function() { 
    return this.each(function() { 
     var $this = $(this); 

     $this.click(function(event) { 
     event.preventDefault(); 
     // Your function goes here 
     }); 
    }); 
}; 
})(jQuery); 

Wtedy na dokumencie gotowy można robić rzeczy w ten sposób:

$(document).ready(function() { 
    $('#div1').doSomething(); 
    $('#div2').doSomething(); 
}); 
+3

Czy tworzenie funkcji poza "gotowym dokumentem" faktycznie zapewnia jakieś korzyści? – Navigatron

+0

@Nuktu tak, dla rozwoju wtyczki – Swordfish0321

+0

Jeśli używasz $ w parametrze funkcji, to po co zawracać sobie głowę dzwonieniem do jQuery zamiast ponownego używania $ –

2

Czy to najbardziej obfusc? możliwe rozwiązanie? Nie wierzę, że jQuery miałoby stworzyć taki kod. Istnieje również domniemanie, że nie chcemy burzyć wydarzeń, co prawdopodobnie jest złe.

Proste przenoszenie doosomething() poza numerem $(function(){} spowoduje, że będzie miał zasięg globalny i sprawi, że kod będzie prosty/czytelny.

+0

Ale jeśli jest on używany tylko w funkcjach JQuery, to znacznie lepiej nie zanieczyszczać globalnego zasięgu i trzymać go tam, gdzie należy. – Johnride

5

Możesz to również zrobić - Ponieważ chcesz, aby jedna funkcja była używana wszędzie, możesz to zrobić, bezpośrednio wywołując JqueryObject.function(). Na przykład, jeśli chcesz stworzyć własną funkcję do manipulowania jakąkolwiek CSS na elemencie:

jQuery.fn.doSomething = function() { 
    this.css("position","absolute"); 
    return this; 
} 

i sposobu to nazwać:

$("#someRandomDiv").doSomething(); 
Powiązane problemy