2010-11-04 44 views
10

我已经将多个函数的多个函数附加到$(document).ready并且希望附加一个函数以作为第一个$(document).ready处理或在$(document).ready处理程序之前独立触发。

有什么办法来处理jQuery在内部作为jQuery.fn.ready一部分触发的函数的顺序,或者是在jQuery.fn.ready之前调用的函数中挂接的函数的顺序。

正在编辑jQuery.fn.ready在第三方脚本安全做还是会引起其他第三方插件效果(除了插件,编辑jQuery.fn.ready自理)

[可怕的敲门声编辑]:

为例

$(document).ready(function b() {}); 
.... 
$(document).ready(function a() {/* optional setup*/}); 
.... 
$(document).ready(function c() {}); 

功能的需要做的第一不相干的顺序,但只被调用上几页。我不能保证b或c的顺序,所以我不能在b或c的开头触发自定义事件来触发a。

所以我想要一个通用的解决方案,我可以用它在jQuery的内部readyList或hook的开始处强制放置jQuery的ready函数,并安全地进行编辑,以便在readyList中的任何其他函数之前调用它。

[进一步编辑]

如果可能的话,我宁愿不用重新设计JavaScript代码的执行顺序或必须从功能分开触摸任何其他代码()。我知道重组,让我来解决这个问题,但我宁愿只写这样

$.beforeReady(function a() {}); 
+0

当你需要beforeReady函数之前添加运行代码,你会做什么?你会添加一个beforeBeforeReady吗?有时你只需要咬紧牙关,做需要做的事情并修复代码,这样才有意义。 – 2010-11-04 16:19:53

+0

@贾尼你可能有一个有效的观点。不过我宁愿创建一个beforeReady,然后用.bind(“loaded”)替换所有发生的.ready,并用.bind(“setup”)替换beforeReady。 – Raynos 2010-11-04 16:25:14

+0

这个问题应该在下一个版本的jQuery中修复:https:// github.com/jquery/jquery/pull/80 – Mottie 2010-11-04 17:32:22

回答

15

单一功能这将是一个时间,你的所有其他文件在那里我会触发自定义事件将bind到,你只会有一个ready处理程序,它会做的东西,然后触发自定义事件。

所以,别的地方在你的代码,而不是使用$(document).ready,你会用

$(window).bind('setup', function() { 
    //code here... 
}); 

和/或

$(window).bind('loaded', function() { 
    //some other code here... 
}); 

而在你的唯一ready处理程序,你会怎么做像这样:

$(document).ready(function() { 
    $(window).trigger('setup'); 
    $(window).trigger('loaded'): 
}); 
+0

“/ /安装的东西”是可选的,只能做几页,“//代码在这里”是在每一页上完成。我不想在每个页面上包含$(window).trigger(“someCustomEvent”) – Raynos 2010-11-04 15:59:49

+0

@Raynos,然后你可以触发另一个自定义事件来完成设置。 – 2010-11-04 16:01:53

+0

如果我在文档准备好了多个函数不能保证顺序,也不是选择一个函数来触发设置,因为我不能保证任何ready函数是第一个被jQuery – Raynos 2010-11-04 16:08:19

0

$(document).ready()或简单地$(function(){})只是一个.addEventListener的实现(很不完全,但很接近),这意味着你可以在前后添加监听器。

$(document).ready(listener); // goes off first. 
$(document).ready(otherListener); // goes off 2nd. 

等等,它不是很难夹心功能。 有没有必要破解.ready() IMO。

+0

我宁愿不必担心随处使用包含的代码的确切顺序,而是需要在代码中设置顺序。 – Raynos 2010-11-04 15:58:42

+0

嗯,也许你应该停止粘贴.ready()到处都是。我通常只使用一个.ready()函数,在其中初始化所有插件并将其保存在一个文件中,其中没有其他内容(双关语意)。 ;) – BGerrissen 2010-11-04 16:02:06

+2

如果我有时间编辑整个遗留项目,就像我那样工作。暂时我坚持逐步改进。 – Raynos 2010-11-04 16:09:51

0

我刚刚有完全相同的问题。我在GitHub上放了一个小脚本,它添加了一个$ .beforeReady()函数。滑稽:)

https://github.com/aim12340/jQuery-Before-Ready

只需加载脚本的jQuery之后就像这个例子:

<html> 
    <head> 
     <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 
     <script src="jquery-before-ready.js"></script> 
    </head> 
    <body> 
     <script> 
      $(document).ready({ 
       alert("This function is declared first!") 
      }) 
     </script> 
     <script> 
      $.beforeReady(function(){ 
       alert("This function is declared second but executes first!") 
      }) 
     </script>   
    </body> 
</html> 
相关问题