想知道调用 document.ready
函数的次数是否会影响页面加载速度。
在 Gulp / Grunt 中,是否有一种方法可以通过删除单独的 document ready 函数来压缩 / 缩小 JS 代码?
想知道调用 document.ready
函数的次数是否会影响页面加载速度。
在 Gulp / Grunt 中,是否有一种方法可以通过删除单独的 document ready 函数来压缩 / 缩小 JS 代码?
我在Chrome中没有看到显著的差异。
据我所知,这对IE8至关重要,但我没有检查这个事实。
IE11在第一个片段上显示2秒,而其他片段仅需200毫秒。
此外,似乎jQuery已经聚合了加载事件。
别忘了
for (var q=0; q<1000; ++q) {
document.addEventListener('DOMContentLoaded', (function (i) {
console.log(i);
}).bind(null, q));
}
document.addEventListener('DOMContentLoaded', function () {
document.querySelector('output').textContent = performance.now().toFixed(3);
});
<output></output>
document.addEventListener('DOMContentLoaded', function () {
for (var q=0; q<1000; ++q) {
(function (i) {
console.log(i)
}).bind(null, q)();
document.querySelector('output').textContent = performance.now().toFixed(3);
}
});
<output></output>
for (var q=0; q<1000; ++q) {
$((function (i) {
console.log(i);
}).bind(null, q));
}
$(function () {
document.querySelector('output').textContent = performance.now().toFixed(3);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<output></output>
$(function () {
for (var q=0; q<1000; ++q) {
(function (i) {
console.log(i)
}).bind(null, q)();
document.querySelector('output').textContent = performance.now().toFixed(3);
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<output></output>
addEventListener('DOMContentLoaded')
的同义词?DOMContentLoaded
和 load
(window.onload
)。第一个事件发生在 body 解析完成时,但某些资源仍在加载中。第二个事件发生在页面完全加载后。第一个事件很适合运行包含 DOM 操作的脚本,但是并不是所有浏览器都支持它。$(document).ready(function () {
// ...
});
但是在一些版本之后,它被简化为直接将函数传递到jQuery中:
$(function () {
// ...
});
所以在原始的示例中,我使用了2个事件中的第一个,在jQuery示例中,我使用了对其进行订阅的简短形式。由于不支持此事件的浏览器非常古老,因此可以正确地假定jQuery始终使用DOMContentLoaded
(可能load
方法已在版本2中删除 - 没有检查过,但我认为没有保留它的理由)。
document.ready
。如果你们JS开发者谈论document.ready
,那么这是addEventListener('DOMContentLoaded')
的同义词吗? - Thomas Wellerdocument.readyState === 'complete'
就会被解决。 DOMContentLoaded
事件是检查document.readyState
状态的信号之一。 - zzzzBov许多文档就绪调用不应对应用程序性能产生太大影响。最好的解决方案可能是只有一个并在其中初始化所有所需内容。但这取决于您的应用程序结构,您可能更喜欢拥有多个。无论如何,我认为没有任何 Gulp 任务可以将不同的就绪函数包装在一起,因为它会触及应用程序逻辑。
$(document).ready
块中定义的函数不能从另一个$(document).ready
块中调用。$(document).ready(function() {
alert('hello1');
function saySomething() {
alert('something');
}
saySomething();
});
$(document).ready(function() {
alert('hello2');
saySomething();
});
hello1
something
hello2
是的,你可以使用多个文档就绪处理程序,在几个地方使用jQuery代码没有特殊的优势。由于这些处于不同的作用域中,因此不能在一个变量内部使用另一个变量。
实际上,jQuery事件处理程序将函数推入特定事件的队列中以执行。当事件被触发时,所有函数都将根据父顺序函数的返回值从特定事件行/堆栈/队列中依次执行。
但是需要注意的是,每个$(document).ready()函数调用必须返回。如果其中一个函数抛出异常,则后续调用将永远不会运行。
$(document).ready(function() {
document.write('<h3>In First ready function</h3>');
var foo = function() {
console.log('inside foo');
}
document.write("foo:" +(typeof foo)+"<br>");
document.write("bar:" +(typeof bar)+"<br>");
});
$(document).ready(function() {
document.write('<h3>In Second ready function</h3>');
var bar=function bar() {
console.log('inside bar');
}
document.write("foo:" +(typeof foo)+"<br>");
document.write("bar:" +(typeof bar)+"<br>");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
实际上,jQuery的$(document).ready()
方法是使用addEventListener
方法将函数与DOMContentLoaded
事件一起附加的。
是的,您可以在单个页面上拥有多个它的实例。没有特定的优势。所有实例都会按照首次调用的顺序执行。
document.ready
? - Mairaj Ahmad