2009-06-28 31 views

Trả lời

60

Không chắc lý do tại sao việc xác định chức năng với trong phạm vi của ready() là quan trọng với bạn, nhưng bạn có thể làm cho nó hoạt động bằng cách tuyên bố foo lên phía trước:

<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> 

Rõ ràng bạn không thể gọi foo() từ inline tập lệnh ngay sau ready() vì mã ready() chưa chạy, nhưng bạn có thể gọi hàm sau này.

Chỉ cần đảm bảo rằng không có gì có thể thử gọi foo() trước khi mã ready() chạy (hoặc thực hiện khai báo ban đầu foo() một chức năng vô hại).

+0

Ý tưởng tuyệt vời. Cảm ơn Richie! –

+0

Nếu bạn cần gọi 'foo()' với một số tham số thì sao?Làm thế nào bạn sẽ vượt qua chúng, và làm thế nào họ sẽ được nhận? –

+1

@ alonso.torres: Giống như bất kỳ hàm JavaScript nào khác: 'foo = function (x, y, z) {...}' ... 'onclick =" foo (1, 2, 3) "' – RichieHindle

24

Bạn có thể nhưng họ phải được gọi trong phạm vi của phương pháp ready() nếu không họ sẽ mất phạm vi khi thoát phương pháp ready().

Ví dụ, đoạn code dưới đây sẽ làm việc:

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

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

Có cách nào để giải quyết vấn đề này không? Thay đổi phạm vi? –

+8

Đơn giản. Xác định chúng bên ngoài phạm vi .ready (...). Tôi không hiểu tại sao bạn lại gắn bó với điều đó. Nó có thể mang lại lợi ích gì cho bạn? – Oli

+0

@Oli, nó sẽ tốt hơn từ quan điểm tổ chức mã để có thể khai báo nó trong phạm vi .ready(). –

4

Chức năng của bạn được xác định trong phạm vi của $(document).ready() gọi lại và không thể nhìn thấy từ ngoài. Hoặc là xác định hàm bên ngoài phạm vi $(document).ready() gọi nó chỉ từ bên trong.

5

Chúng sẽ xuất hiện dưới dạng không xác định nếu bạn đặt chúng vào bất kỳ phạm vi nào không phải của chúng. Nếu bạn thực sự muốn sử dụng chúng bên ngoài phạm vi $ (tài liệu) .ready (...) thì bạn cần khai báo chúng ra bên ngoài. Chẳng hạn như:

var foo; 

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

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

Hy vọng điều này sẽ hữu ích.

+0

Tại sao giải pháp Hari Om hoạt động? –

+0

@jj_ Giải pháp của Hari Om' hoạt động vì lệnh myfnc nằm trong cùng phạm vi mà myfnc được khai báo. – Nishan

+0

có 'myfnc()' gọi là, nhưng còn 'myfnc (param1, param2)' trong đầu vào sự kiện 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

Just another Ngoài:

Khi tuyên bố chức năng hoặc các biến bên trong của $(document).ready() chức năng, đây là không thể tiếp cận khi sử dụng onclick() với phím tắt trong tài liệu.

Bạn có thể di chuyển các khai báo của mình bên ngoài $(document).ready() hoặc bạn có thể sử dụng $('#element').on('click', function() {}) trong `$ (tài liệu) .ready().

Các vấn đề liên quan