我正在创建一个非jQuery依赖的插件,为了与各种现有流行的jQuery功能和插件很好地配合,必须在到达DOM结束后执行一个函数,但是之后执行后来使用jQuery .ready()
排队的任何内容。
标准的非jQuery .ready()
替代方案为document.addEventListener("DOMContentLoaded",function(){});
。
如果页面包含使用jQuery .ready()
和DOMContentLoaded
延迟的函数:
.ready()
按照定义的顺序执行DOMContentLoaded
按照定义的顺序执行: ...并且都发生在interactive
和complete
文件readyStates:
document.addEventListener("readystatechange", function () { alert(document.readyState); });
document.addEventListener("DOMContentLoaded", function(event) { alert(1); });
$(document).ready(function(){ alert(2); });
document.addEventListener("DOMContentLoaded", function(event) { alert(3); });
$(document).ready(function(){ alert(4); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
我可以使用哪些内容,例如document.addEventListener("DOMContentLoaded")
,但不会被任何和所有jQuery .ready()
抢占这样的内容?
为了清楚确切的时间安排,在我的特定情况下,我可以保证这个时间至关重要的代码在任何.ready()
排队之前排队,因此答案会附加到与{{1相同的队列也将解决我的问题,而不仅仅是先发制人所有 .ready()
的答案。但是,抢占所有.ready()
可能更可取,因为它适用于更广泛的案例。
(关于jQuery的.ready()
是什么导致它在所有.ready()
之前执行的任何明确的简单解释的奖励积分,无论它们何时被定义,我都无法弄清楚)
答案 0 :(得分:1)
它实际上与.ready()调用本身无关,它与在代码示例之前加载jQuery的事实有关。
jQuery在加载时为DOMContentLoaded / load添加了一个事件监听器,所以当你的代码示例运行时,jQuery已经添加了一个监听器。因此,在您的示例中,它将在侦听器之前被触发。
浏览器执行这些步骤
现在,您可以通过在包含jQuery之前添加addEventListener代码来首先调用您的代码
<script>
document.addEventListener("DOMContentLoaded", function(event) { alert(1); });
</script>
<script src="jquery.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function(event) { alert(3); });
$(document).ready(function(){ alert(2); });
$(document).ready(function(){ alert(4); });
</script>
演示
<script>
document.addEventListener("DOMContentLoaded", function(event) { alert(1); });
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function(event) { alert(3); });
$(document).ready(function(){ alert(2); });
$(document).ready(function(){ alert(4); });
</script>
如果您无法控制代码的位置,则可能会失败。您可以尝试使用快速执行的间隔计时器(即每毫秒)并检查dom是否准备就绪以及何时执行代码。但不能保证它会先被执行。
答案 1 :(得分:0)
将您的jqueries放在文档文件的末尾..它有助于您有时解决冲突..:D
答案 2 :(得分:0)
如果正确解释问题,您可以使用$.holdReady()
$.holdReady(true);
// do stuff
document.addEventListener("DOMContentLoaded"
, function(event) { alert(1); });
document.addEventListener("DOMContentLoaded"
, function(event) { alert(2); });
$.holdReady(false);
$(document).ready(function() {//do stuff when `$.holdReady(false)` is called});