调用 $(document).ready() 函数的最佳方式
best way to call $(document).ready() function
我想知道当 DOM 准备好时调用函数的最佳方式是什么。我的意思是,我知道
$(document).ready(function(){})
和
$(function(){})
以相同的方式执行 DOM 的准备动作。
我的问题更多是关于性能的,我通常这样写我的 JS:
$(document).ready(function(){
console.log('Hello World');
});
但是曾经有一位老师试图让我改变主意,这样写:
function main(){
console.log('Hello World!');
}
$(document).ready(main);
事实是我从来没有这样做过,但现在我想知道在性能方面最好的方法是什么...如果我将所有内容都放在外部函数中,它加载速度会更快吗?
事实上,我写的是第一种方式,因为我不希望我的函数可以从 DOM 访问,所以我这样做了:
$(document).ready(function(){
function Hello(){
console.log('Hello World');
}
Hello();
});
这样就无法从 DOM 或控制台使用函数 Hello... 所以我不喜欢我老师的方式。
但是现在我习惯于将我所有的代码封装在一个匿名函数中,这样我更愿意这样写:
(function($){
function Hello(){
console.log('Hello World!');
}
$(document).ready(Hello);
})(jQuery);
这就是为什么我想知道这两种方法之间的性能,你们怎么看?
如果你想在另一个地方定义就绪函数,这真的取决于偏好,性能差异几乎不存在。我个人比较喜欢
$(document).ready(function(){
//code for ready should be in here
});
因为我不需要在找到ready后跳转到另一个函数
然而,最好的办法是尽可能使用本机 JavaScript,除非您支持超旧浏览器。
document.addEventListener("DOMContentLoaded", function(event) {
//do work
});
这和 ready 函数几乎一样,你不需要 jQuery,也比 $(document).ready()
快一点
TL;DR;
随心所欲!对您的网站没有这样的影响。
最好的方法是什么?
总的来说,你可以随心所欲,但有一些事实可以引导我们朝着正确的方向前进,这告诉我们,jQuery(function($) {});
是一个很好的选择!
为什么?让我们看看...
事实 1: 这是最短的路。好的,IIFE
可能更短,但这不是真正的 ready
状态,只是一个立即函数调用。
事实 2: 由 jQuery 自己编写就绪状态是首选方式。从 v3 开始提到使用这种方式。
事实 3: 为什么要使用 IIFE
来传递 jQuery 对象?不需要,因为第一个函数参数是 jQuery 对象。
事实 4: 使用和不使用 jQuery noConflict
模式都很好。因为第一个参数是 jQuery 对象,所以在就绪状态下你总是可以使用 $
,只需要写一次 jQuery
。
事实 5: 你没有使用命名函数,只是一个匿名闭包。在将近 99.99% 的所有情况下,您只使用一次就绪状态处理程序。所以不需要命名函数或存储在变量中的函数。
所以在我看来,这是总体上最好的选择:
jQuery(function($) {
// ...
});
我知道 ready 无法使用,但我有一些情况想使用它。让我向您展示 eisbehr ...
假设我们有一个函数计算 windows 的宽度和高度,我想在就绪状态下调用它,但也在调整大小状态下调用它......所以如果我理解你的逻辑,我应该使用这个:
jQuery(function($){
var width;
var height;
function init(){
width = $(window).width();
height = $(window).height();
}
init();
$(window).resize(init);
});
对吧?好吧,我想我会像现在一样继续:
(function($){
var width;
var height;
function init(){
width = $(window).width();
height = $(window).height();
}
$(document).ready(init); /* or $(init); */
$(window).resize(init);
})(jQuery);
顺便说一下,感谢您的回答,您正确回答了这个问题:最好的方法是什么? 没关系。 随心所欲!对您的网站没有这样的影响。
我想知道当 DOM 准备好时调用函数的最佳方式是什么。我的意思是,我知道
$(document).ready(function(){})
和
$(function(){})
以相同的方式执行 DOM 的准备动作。 我的问题更多是关于性能的,我通常这样写我的 JS:
$(document).ready(function(){
console.log('Hello World');
});
但是曾经有一位老师试图让我改变主意,这样写:
function main(){
console.log('Hello World!');
}
$(document).ready(main);
事实是我从来没有这样做过,但现在我想知道在性能方面最好的方法是什么...如果我将所有内容都放在外部函数中,它加载速度会更快吗?
事实上,我写的是第一种方式,因为我不希望我的函数可以从 DOM 访问,所以我这样做了:
$(document).ready(function(){
function Hello(){
console.log('Hello World');
}
Hello();
});
这样就无法从 DOM 或控制台使用函数 Hello... 所以我不喜欢我老师的方式。 但是现在我习惯于将我所有的代码封装在一个匿名函数中,这样我更愿意这样写:
(function($){
function Hello(){
console.log('Hello World!');
}
$(document).ready(Hello);
})(jQuery);
这就是为什么我想知道这两种方法之间的性能,你们怎么看?
如果你想在另一个地方定义就绪函数,这真的取决于偏好,性能差异几乎不存在。我个人比较喜欢
$(document).ready(function(){
//code for ready should be in here
});
因为我不需要在找到ready后跳转到另一个函数
然而,最好的办法是尽可能使用本机 JavaScript,除非您支持超旧浏览器。
document.addEventListener("DOMContentLoaded", function(event) {
//do work
});
这和 ready 函数几乎一样,你不需要 jQuery,也比 $(document).ready()
TL;DR;
随心所欲!对您的网站没有这样的影响。
最好的方法是什么?
总的来说,你可以随心所欲,但有一些事实可以引导我们朝着正确的方向前进,这告诉我们,jQuery(function($) {});
是一个很好的选择!
为什么?让我们看看...
事实 1: 这是最短的路。好的,IIFE
可能更短,但这不是真正的 ready
状态,只是一个立即函数调用。
事实 2: 由 jQuery 自己编写就绪状态是首选方式。从 v3 开始提到使用这种方式。
事实 3: 为什么要使用 IIFE
来传递 jQuery 对象?不需要,因为第一个函数参数是 jQuery 对象。
事实 4: 使用和不使用 jQuery noConflict
模式都很好。因为第一个参数是 jQuery 对象,所以在就绪状态下你总是可以使用 $
,只需要写一次 jQuery
。
事实 5: 你没有使用命名函数,只是一个匿名闭包。在将近 99.99% 的所有情况下,您只使用一次就绪状态处理程序。所以不需要命名函数或存储在变量中的函数。
所以在我看来,这是总体上最好的选择:
jQuery(function($) {
// ...
});
我知道 ready 无法使用,但我有一些情况想使用它。让我向您展示 eisbehr ... 假设我们有一个函数计算 windows 的宽度和高度,我想在就绪状态下调用它,但也在调整大小状态下调用它......所以如果我理解你的逻辑,我应该使用这个:
jQuery(function($){
var width;
var height;
function init(){
width = $(window).width();
height = $(window).height();
}
init();
$(window).resize(init);
});
对吧?好吧,我想我会像现在一样继续:
(function($){
var width;
var height;
function init(){
width = $(window).width();
height = $(window).height();
}
$(document).ready(init); /* or $(init); */
$(window).resize(init);
})(jQuery);
顺便说一下,感谢您的回答,您正确回答了这个问题:最好的方法是什么? 没关系。 随心所欲!对您的网站没有这样的影响。