Bạn có thể có nhiều $ (tài liệu). Yet (function () {Sự}); phần?


240

Nếu tôi có rất nhiều chức năng khi khởi động, tất cả chúng phải nằm dưới một lần duy nhất:

$(document).ready(function() {

hoặc tôi có thể có nhiều tuyên bố như vậy?


1
Cần thiết chủ yếu khi tôi cần tải nhiều tệp js trong đó mỗi tệp chứa $ (tài liệu). Đã (); chức năng
Abdillah

@leora câu hỏi này đã được hỏi trong một cuộc phỏng vấn: D Cảm ơn
eirenaios

Câu trả lời:


288

Bạn có thể có nhiều cái, nhưng không phải lúc nào cũng là thứ gọn gàng nhất để làm. Cố gắng đừng lạm dụng chúng, vì nó sẽ ảnh hưởng nghiêm trọng đến khả năng đọc. Ngoài ra, nó hoàn toàn hợp pháp. Xem dưới đây:

http://www.learningjquery.com/2006/09/mult Môn-document-yet

Thử thứ này đi:

$(document).ready(function() {
    alert('Hello Tom!');
});

$(document).ready(function() {
    alert('Hello Jeff!');
});

$(document).ready(function() {
    alert('Hello Dexter!');
});

Bạn sẽ thấy rằng nó tương đương với điều này, lưu ý thứ tự thực hiện:

$(document).ready(function() {
    alert('Hello Tom!');
    alert('Hello Jeff!');
    alert('Hello Dexter!');
});

Cũng đáng lưu ý rằng một hàm được xác định trong một $(document).readykhối không thể được gọi từ một $(document).readykhối khác , tôi chỉ chạy thử nghiệm này:

$(document).ready(function() {
    alert('hello1');
    function saySomething() {
        alert('something');
    }
    saySomething();

});
$(document).ready(function() {
    alert('hello2');
    saySomething();
}); 

đầu ra là:

hello1
something
hello2

25
Sẽ không khôn ngoan khi dựa vào thứ tự thực hiện khi sử dụng nhiều câu lệnh $ (document). Yet (). Mỗi người cần thực hiện độc lập với bất kỳ ai khác đã được thực hiện hay chưa.
James

@AoP - Tôi không biết có bao nhiêu ý nghĩa, nếu chúng không được thực hiện theo thứ tự, thì chúng hoàn toàn vô nghĩa trong bối cảnh của ứng dụng, vì vậy sử dụng nhiều $ (tài liệu). Đã (các khối sẽ bị phá vỡ hoàn toàn.
karim79

7
@ karim79 chắc chắn điều này (câu hỏi của OP) có thể áp dụng nhất khi viết một đoạn mã phức tạp với nhiều mối quan tâm khởi động - tức là một số mã luôn chạy khi tải hoàn tất và một số chỉ được yêu cầu trên một số nút nội dung? Trong tình huống như vậy, bối cảnh sẽ là silo và thứ tự thực hiện sẽ không quan trọng - có thể gán cho sự kiện 'DOM ready' mà không ghi đè lên trước đó trở thành một tính năng hữu ích, bất kể hành vi đặt hàng.
tehwalrus

1
Về một hàm được xác định trong một khối sẵn sàng không thể gọi được từ một khối sẵn sàng khác - đây đúng là cách bạn xác định hàm, nhưng nếu bạn định nghĩa nó là sayS Something = function () {} thì bạn có thể gọi nó. Lạ nhỉ? jsfiddle.net/f56qsogm kiểm tra nó ở đây.
ferr

2
Tôi nghĩ rằng nó hoạt động như thế này bởi vì nó đang thêm chức năng vào đối tượng cửa sổ có thể truy cập trên toàn cầu. Mặt khác, nó là một hàm khai báo nằm trong phạm vi cục bộ của hàm sẵn sàng đó.
ferr

19

Bạn có thể sử dụng nhiều. Nhưng bạn cũng có thể sử dụng nhiều chức năng trong một tài liệu. Đã sẵn sàng:

$(document).ready(function() {
    // Jquery
    $('.hide').hide();
    $('.test').each(function() {
       $(this).fadeIn();
    });

    // Reqular JS
    function test(word) {
       alert(word);
    }
    test('hello!');
});

Điều này là ổn nếu bạn có toàn quyền kiểm soát mã được đính kèm vào trang. Nếu ai đó đã viết điều này trong một tệp khác được đính kèm vào trang, thì bạn có thể khai báo nó như thế này.
James Wiseman

Không chắc chắn những gì bạn đang cố gắng nói. Nhưng nếu bạn đặt cái này vào trong đầu và bao gồm 15 JS bên ngoài khác, tất cả các wich đều chứa một (hoặc nhiều tài liệu .load) nó sẽ vẫn hoạt động như thể chỉ có một. Đáng nói là phần tin sốt dẻo của mỗi hàm / biến kết thúc bằng dấu ngoặc đóng của hàm $ (tài liệu). Yet-function.
Mickel

2
Chỉ cần cố gắng nói rằng đôi khi, dân gian khác sẽ có các mô-đun bằng văn bản được đính kèm trên trang có chức năng sẵn sàng tài liệu đã được khai báo, do đó bạn không thể chuyển tất cả mã của mình sang một chức năng (được cấp, sẽ là lý tưởng ). Tuy nhiên, tôi cũng sẽ cảnh giác khi có quá nhiều thứ ở đây, vì chúng tôi sẽ nhận được On Ready Bloating, điều này có thể làm cho mã khó như nhau để duy trì.
James Wiseman

1
Ah, bây giờ tôi có được bạn. Vâng, tôi đồng ý về điều đó. Chỉ cần nêu một ví dụ để chứng minh rằng điều đó là có thể;)
Mickel

15

Có bạn có thể dễ dàng có nhiều khối. Chỉ cần cẩn thận với sự phụ thuộc giữa chúng vì thứ tự đánh giá có thể không như bạn mong đợi.


11

, có thể có nhiều cuộc gọi $ (tài liệu). Đã (). Tuy nhiên, tôi không nghĩ bạn có thể biết họ sẽ bị xử tử theo cách nào. (nguồn)


14
được gọi theo thứ tự được thêm vào
redsapes

Cảm ơn, thật tốt khi làm rõ điều này, vì - mặc dù có sự khôn ngoan chung về chủ đề - trang jQuery ready () không thực sự nói bạn có thể hay không (tại thời điểm viết :)). Tuy nhiên, điều đó có nghĩa là nó ổn, nếu bạn đọc giữa các dòng của một câu:Ready handlers bound this way are executed after any bound by the other three methods above.
Reg Chỉnh sửa

5

Có, nhưng bạn có thể sử dụng div #mydiv tốt hơn và sử dụng cả hai

$(document).ready(function(){});

//and

$("#mydiv").ready(function(){});

2
Ý tưởng thú vị, nhưng tại sao nó tốt hơn?
Tim

3
Sử dụng div không được hỗ trợ. Nếu vì lý do nào đó bạn làm điều này, bạn sẽ tự chịu rủi ro: Phương thức. Yet () chỉ có thể được gọi trên một đối tượng jQuery khớp với tài liệu hiện tại
Reg Chỉnh sửa

3

Vâng, nó hoàn toàn ổn. Nhưng tránh làm điều đó mà không có lý do. Ví dụ: tôi đã sử dụng nó để khai báo các quy tắc trang web toàn cầu một cách riêng biệt so với các trang không thường xuyên khi các tệp javascript của tôi được tạo động nhưng nếu bạn cứ làm đi làm lại nó sẽ khiến bạn khó đọc.

Ngoài ra, bạn không thể truy cập một số phương thức từ một jQuery(function(){});cuộc gọi khác vì vậy đó là một lý do khác mà bạn không muốn làm điều đó.

Với cái cũ window.onloadmặc dù bạn sẽ thay thế cái cũ mỗi khi bạn chỉ định một chức năng.


2

Có bạn có thể.

Nhiều phần sẵn sàng cho tài liệu đặc biệt hữu ích nếu bạn có các mô-đun khác chạy trên cùng một trang sử dụng nó. Với window.onload=funckhai báo cũ , mỗi khi bạn chỉ định một hàm được gọi, nó sẽ thay thế hàm cũ.

Bây giờ tất cả các chức năng được chỉ định được xếp hàng / xếp chồng (ai đó có thể xác nhận không?) Bất kể phần tài liệu nào đã được chỉ định.


Vâng, đó là sự thật, các chức năng được xếp hàng chờ so với việc thay thế các hàm $ (tài liệu) trước đó.
Deeky

2

Tôi nghĩ rằng cách tốt hơn để đi là đặt chuyển sang các chức năng được đặt tên (Kiểm tra tràn này để biết thêm về chủ đề đó) . Bằng cách đó bạn có thể gọi họ từ một sự kiện duy nhất.

Thích như vậy:

function firstFunction() {
    console.log("first");
}

function secondFunction() {
    console.log("second");
}


function thirdFunction() {
    console.log("third");
}

Bằng cách đó bạn có thể tải chúng trong một chức năng sẵn sàng duy nhất.

jQuery(document).on('ready', function(){
   firstFunction();
   secondFunction();
   thirdFunction();

});

Điều này sẽ xuất ra sau đây cho console.log của bạn:

first
second
third

Bằng cách này bạn có thể sử dụng lại các chức năng cho các sự kiện khác.

jQuery(window).on('resize',function(){
    secondFunction();
});

Kiểm tra fiddle này cho phiên bản làm việc


0

Đó là hợp pháp, nhưng đôi khi nó gây ra hành vi không mong muốn. Như một ví dụ, tôi đã sử dụng thư viện MagicSuggest và thêm hai đầu vào MagicSuggest trong một trang của dự án của tôi và sử dụng các hàm sẵn sàng tài liệu riêng biệt cho mỗi lần khởi tạo đầu vào. Việc khởi tạo Đầu vào đầu tiên đã hoạt động, nhưng không phải là lần thứ hai và cũng không đưa ra bất kỳ lỗi nào, Đầu vào thứ hai không hiển thị. Vì vậy, tôi luôn khuyên bạn nên sử dụng một Chức năng Sẵn sàng Tài liệu.


0

Bạn thậm chí có thể lồng tài liệu sẵn sàng các chức năng bên trong các tệp html được bao gồm. Đây là một ví dụ sử dụng jquery:

Tệp: test_main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <script src="jquery-1.10.2.min.js"></script>
</head>

<body>
    <div id="main-container">
        <h1>test_main.html</h1>
    </div>

<script>
    $(document).ready( function()
    {
        console.log( 'test_main.html READY' );
        $("#main-container").load("test_embed.html");
    } );
</script>

</body>
</html>

Tệp: test_embed.html

<h1>test_embed.html</h1>
<script>
    $(document).ready( function()
    {
        console.log( 'test_embed.html READY' );
    } );
</script>

Bảng điều khiển đầu ra:

test_main.html READY                       test_main.html:15
test_embed.html READY                      (program):4

Trình duyệt hiển thị:

test_embed.html


0

Bạn cũng có thể làm theo cách sau:

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
 $(document).ready(function(){
     $("#hide").click(function(){
     $("#test").hide();
     });
     $("#show").click(function(){
     $("#test").show();
     });
 });
</script>
</head>

<body>
<h2>This is a test of jQuery!</h2>
<p id="test">This is a hidden paragraph.</p>
<button id="hide">Click me to hide</button>
<button id="show">Click me to show</button>
</body>

các câu trả lời trước đó cho thấy bằng cách sử dụng nhiều hàm được đặt tên bên trong một khối. yet hoặc một hàm chưa được đặt tên trong khối. yet, với một hàm được đặt tên khác bên ngoài khối. yet. Tôi đã tìm thấy câu hỏi này trong khi nghiên cứu nếu có một cách để có nhiều hàm không tên trong khối. Yet - Tôi không thể hiểu đúng cú pháp. Cuối cùng tôi đã tìm ra nó, và hy vọng rằng bằng cách đăng mã kiểm tra của mình, tôi sẽ giúp những người khác tìm kiếm câu trả lời cho cùng một câu hỏi mà tôi có


Bạn có thể mô tả làm thế nào khác nhau hơn các câu trả lời khác?
Stephen Rauch

chắc chắn: các câu trả lời trước đã hiển thị bằng cách sử dụng nhiều hàm được đặt tên bên trong một khối. yet hoặc một hàm chưa được đặt tên trong khối. yet, với một hàm được đặt tên khác bên ngoài khối. yet. Tôi đã tìm thấy câu hỏi này trong khi nghiên cứu nếu có một cách để có nhiều hàm không tên trong khối. Yet - Tôi không thể hiểu đúng cú pháp. Cuối cùng tôi đã tìm ra nó, và hy vọng rằng bằng cách đăng mã kiểm tra của mình, tôi sẽ giúp những người khác tìm kiếm câu trả lời cho cùng một câu hỏi mà tôi có.
JEPrice

Xin lỗi, tôi có nghĩa là trong câu hỏi. Có một nút chỉnh sửa ở phía dưới bên trái của hộp văn bản. Mô tả lý do tại sao giải pháp của bạn khác biệt / tốt hơn làm cho nó trở thành một câu trả lời tốt hơn nhiều vì người đọc trong tương lai có thể nhanh chóng hiểu được "Tại sao". Cảm ơn.
Stephen Rauch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.