Sự khác biệt giữa các hàm sẵn sàng của jQuery này là gì?


76

sự khác biệt giữa

$(function(){

}); 

$(document).ready(function() { 

});

1
không ai. hoặc ít nhất nó nói như vậy trong sách hướng dẫn.
falstro

7
Bạn có thể đọc đầu tiên là "gọi một hàm có tên là $ và giao nó cho hàm đã xác định để thực thi". $ there tham chiếu đến jQuery, sẽ thực thi chức năng mà bạn đã cung cấp khi nó sẵn sàng. Thứ hai sẽ đọc là "tạo một đối tượng jQuery từ tài liệu và đính kèm một eventlistener vào nó để thực thi chức năng bạn đã cung cấp cho nó khi nó được kích hoạt bởi sự kiện sẵn sàng".
kontur

Xem câu trả lời của tôi bên dưới: IE9 đối xử với chúng theo cách khác.
Will Lanni

Câu trả lời:


57

Chẳng có gì cả.

Hàm này hoạt động giống như $ (document) .ready (), ở chỗ nó sẽ được sử dụng để bọc các $ () khác

Bạn có thể thấy điều này trong mã nguồn :

rootjQuery = jQuery(document);

...

} else if ( jQuery.isFunction( selector ) ) {
    return rootjQuery.ready( selector );
}

39
Có một sự khác biệt, $ (function () {}) khó đọc hơn (ít nhất là đối với não của tôi).
Rosdi Kasim

3
Đồng ý với Rosdi - một người tỏ ra rõ ràng hơn về những gì nó thực sự đang làm, một người thì ngắn gọn hơn một chút. Tôi thích phiên bản biểu cảm, nghĩ rằng nó là bao giờ nên hơi ít performant: jsperf.com/ready-callback-function-vs-document-ready-function/4
Jon z

Cũng đồng ý với một nhận xét: chính sự thiếu diễn đạt trong cách viết tốc ký đã khiến đây trở thành một câu hỏi phổ biến như vậy.
natchiketa

1
Kể từ jQuery 3.0, chỉ $(function() {})cú pháp được khuyến nghị; các cú pháp khác vẫn hoạt động nhưng không được dùng nữa. Xem api.jquery.com/ready
thau khỉ

Tôi không đồng ý, có một sự khác biệt. Tôi đã thử cùng một hàm có và không có (document).readytrước hàm và với, async đã tải đúng biến hàm. Nếu không, chỉ tải các giá trị ban đầu của biến mà không bao giờ cung cấp các giá trị không đồng bộ mới. Nó dường như ảnh hưởng đến thời gian, ít nhất là vàoopera
jimh

16
} else if (jQuery.isFunction(selector)) {
    return rootjQuery.ready(selector);
}

Từ nguồn

Gọi $(document).ready(selector)tiết kiệm một vài câu lệnh if.

Mặc dù jQuery làm bộ nhớ cache $(document)bên trong có thể làm cho $(f)nhanh hơn.

Điểm chuẩn


3
Nếu chúng ta đang nói rằng mức độ vi tối ưu, bạn có thể muốn xem xét việc thêm 11 byte cần thiết để chuyển phiên bản rõ ràng ...
lonesomeday

@lonesomeday Chà chỉ có 9 byte của nó. $(d).ready(f)vs$(f)
Raynos

1
Đúng, nhưng hãy lưu ý rằng nhận xét trên của tôi có ý nghĩa hơi hài hước!
lonesomeday

@Raynos Nhưng sau đó bạn cần đặt var d = document;ở trên cùng hoặc đặt nó bên trong (function(d) {})(document);. : P
nyuszika7h

@ Nyuszika7H bất kỳ mã rút gọn nào đã cód = document, w = window
Raynos


7

$ (function () {}) là một đoạn ngắn cho dom sẵn sàng

Một hàm được truyền làm đối số cho hàm tạo jQuery được liên kết với sự kiện sẵn sàng tài liệu.


7

Tôi đề nghị bạn đọc cái này . Bạn có thể thấy

Cả ba cú pháp sau là tương đương:

$(document).ready(handler)

$().ready(handler) (this is not recommended)

$(handler)

Vì vậy, nó tùy thuộc vào bạn và những gì bạn thích.


3
$().ready()sẽ không hoạt động trong jQuery 1.4+. $()trả về một lựa chọn trống thay vì tài liệu trong những trường hợp này.
một

3
@lonesomeday Đó là lý do tại sao có một (điều này không được khuyến khích) ở phía trước nó.
foliveira

7

Cả hai hoàn toàn tương đương: sử dụng bất kỳ hình thức nào bạn thích.

Điều đó nói rằng, cá nhân tôi luôn sử dụng biểu mẫu mở rộng $(document).ready(function(){});vì lý do đơn giản là hoàn toàn rõ ràng mã đang làm gì. Ý tưởng gần đúng là của "mã tự lập tài liệu". Bất cứ ai đến đoạn code sau này sẽ thấy ngay rằng mã sẽ được chạy trên documentcủa readysự kiện. Với dạng viết tắt, bạn phải dựa vào người đọc mã của bạn để hiểu ý nghĩa.


6

Chúng tôi đã gặp phải tình huống IE9 không chạy các hàm trong $ (function () {}); theo cách thức hoặc thời gian giống như $ (document) .ready (function () {});

Vấn đề đặt ra cho chúng tôi đặc biệt là đọc thông tin từ chuỗi truy vấn và xử lý và hiển thị thông tin đó trên màn hình hoặc sử dụng nó để xử lý biểu mẫu. IE9 sẽ xử lý thông tin sau khi nó được lưu vào bộ nhớ đệm với $ (function () và người dùng đã làm mới trang. Nhưng trong lần chạy đầu tiên, không có gì hoạt động đúng. Tuy nhiên, khi chúng tôi chuyển từ $ (function () {}); sang $ ( document) .ready (), sự cố đã được khắc phục. Chúng tôi đã thay đổi KHÔNG GÌ khác.

Tôi rất mong chờ ngày tôi không phải kiểm tra IE9 trở xuống.


1
document.ready không được kết nối với cùng một sự kiện "gốc" cho tất cả các trình duyệt ... bạn có thể nhận được một trong các sự kiện sau: [document.DOMContentLoaded] hoặc [window.load] hoặc [document.onreadystatechange]. Tôi cho rằng đó là lý do tại sao bạn nhận được một hành động khác trong IE, tôi cho rằng (không xác minh) rằng $ (tài liệu) .ready (...) không được kết nối với cùng một sự kiện DOM gốc hơn $ (function () {} )
foxontherock

Tôi cũng đã trải nghiệm điều này opera. Tôi đã ủng hộ câu trả lời của bạn vì tôi đã gặp vấn đề chính xác. (sử dụng jquery 3.5)
jimh

5

Chúng thực sự giống nhau. Không khác nhau.


Đây là cách bản địa.

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

Và đây là cách viết tắt của từ trước.

$(function() {
    // code
});

mã nguồn jQuery


Có một nhận xét trên chủ đề này - stackoverflow.com/questions/7975093/… - rằng việc sử dụng tốc ký TypeError: 'undefined' is not a functionđôi khi có thể dẫn đến lỗi.
crmpicco

@crmpicco Ngoại trừ chủ đề đó đề cập $(document), vì vậy có thể bạn muốn nói đến $cách viết tắt của jQuery.
nyuszika7h

2

Tôi sử dụng $(function() {});vì nó ngắn hơn. Theo như tôi biết thì không có sự khác biệt giữa hai cách làm.

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.