2009-06-28 10 views

Odpowiedz

60

Nie wiem, dlaczego definiowanie funkcji z zakresem ready() jest dla Ciebie ważne, ale można zrobić to praca deklarując foo z góry:

<html><head> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script> 
<script> 
var foo;       // Here's the difference 
$(document).ready(function(){ 
    foo = function() 
    { 
    alert('Bar'); 
    } 
}); 
</script></head><body> 
<input type="button" onclick="foo()" value="Click me"> 
</body></html> 

Oczywiście nie można nazwać foo() z inline skrypt natychmiast po ready(), ponieważ kod ready() jeszcze się nie uruchomił, ale możesz później wywołać tę funkcję.

Po prostu upewnij się, że nic nie może próbować zadzwonić pod numer foo() przed uruchomieniem kodu ready() (lub uczynić początkową deklarację foo() nieszkodliwą funkcją).

+0

Świetny pomysł. Dzięki Richie! –

+0

Co jeśli musisz wywołać 'foo()' z niektórymi parametrami?Jak byś je minął i jak zostałyby one odebrane? –

+1

@ alonso.torres: Tak jak każda inna funkcja JavaScript: 'foo = funkcja (x, y, z) {...}' ... 'onclick =" foo (1, 2, 3) "' – RichieHindle

24

Można, ale muszą one być wywoływane w ramach metody ready(), w przeciwnym razie tracą zasięg po zakończeniu metody ready().

Na przykład poniższy kod będzie działać:

$(document).ready(function(){ 
    function foo() 
    { 
    alert('Bar'); 
    } 

    foo(); // still in the scope of the ready method 
}); 
+1

Czy istnieje sposób na obejście tego? Zmienić zakres? –

+8

Proste. Zdefiniuj je poza zasięgiem .ready (...). Nie rozumiem, dlaczego jesteście tak przywiązani do tego. Jakie korzyści może ci zaoferować? – Oli

+0

@Oli, byłoby lepiej z punktu widzenia organizacji kodu, aby móc zadeklarować go w zakresie .ready(). –

4

Twoja funkcja jest zdefiniowana w zakresie $(document).ready() zwrotnego i nie mogą być postrzeganez poza. Zdefiniuj funkcję poza zakresem wywołania funkcji $(document).ready() tylko od wewnątrz.

5

Będą one niezdefiniowane, jeśli umieścisz je w jakimkolwiek zakresie, który nie należy do nich. Jeśli naprawdę chcesz ich użyć poza zakresem $ (document) .ready (...), musisz zadeklarować je zewnętrznie. Takich jak:

var foo; 

$(document).ready(function(){ 
    foo = function() 
    { 
    alert('Bar'); 
    } 
}); 

foo(); // works now because it is in scope 

Mam nadzieję, że to pomaga.

+0

Dlaczego zatem działa rozwiązanie Hari Om? –

+0

@jj_ Rozwiązanie Hari Om działa, ponieważ wywołanie myfnc znajduje się w tym samym zakresie, w którym zostało zadeklarowane myfnc. – Nishan

+0

yes 'myfnc()' call, ale co z 'myfnc (param1, param2)' na wejściu wydarzenie onclick? –

1
<script> 
    $(document).ready(function(){ 
     myfnc = function (param1, param2) 
     { 
     alert('Hello'); 
     } 
     myfnc(); 
    }); 
</script> 
<input type="button" onclick="myfnc('arg1', 'arg2')" value="Click me"> 
0

Kolejny dodatek:

Podczas deklarowania funkcji lub zmiennych wewnątrz funkcji $(document).ready(), są niedostępne w przypadku korzystania onclick() wiąże się w dokumencie.

Możesz przenosić swoje deklaracje poza numer $(document).ready() lub możesz użyć $('#element').on('click', function() {}) w `$ (document) .ready().

Powiązane problemy