作为一个我一直在研究的项目已经发展壮大,因此当其他代码尝试访问它们时,页面上的所有脚本都不可用。尽管在更新代码(例如,不缓存)后,这种情况经常发生,但我从未尝试过的时候会越来越多地出现在测试中。确保脚本可用性的模式或技巧?
我已经解决了这个问题,部分是通过使用函数来等待模块可用(请参阅this question),这主要解决了这个问题,但我并不完全对实现感到兴奋,并且期待为更多的工业强度模式来解决这个问题。以下是可能的解决方案,我想出来的:
1)加载脚本上的东西,如ensure需求 - 不理想。需要在每个脚本中包含实际的脚本名称相关性信息,而不仅仅是模块/对象名称。在使用资源确保其可用之前,仍然需要采取一些措施。
2)管理脚本加载顺序。如果这样做甚至会起作用(例如,我不认为在脚本B之前简单地放置脚本A以确保它将可用,因为它们可以同时加载),这将是一种痛苦,因为直到你“已经加载了依赖于它的东西。在一个拥有大量使用不同资源的页面的网站上进行设置需要很多工作(并且我无意在每个页面上加载站点上到处都使用的所有内容)。
3)等待一切在允许用户交互之前加载到给定页面上。出于显而易见的原因,这远非理想。仍然没有解决在初始化代码中发生的依赖关系。
4)展开我当前的解决方案。目前工作方式类似(这是伪代码,但基本的逻辑过程):
// Depends on Module2
Module1 = (function() {
self = {};
// function requires dependency
// waitFor waits until global named 'dependency' is available then calls callback
self.initialized=false;
self.init = function() {
waitFor('Module2', function() {
self.intialized=true;
});
}
// waitForInitialization sets a callback when self.initialized=true
self.func = self.waitForInitialization(func() {
Module2.doStuff();
});
}
//UI-initiated function requires dependency
self.uiFunc = function() {
if (!self.initialized) {
showPleaseWaitDialog();
self.waitForInitialization(function() {
dismissPleaseWaitDialog();
self.uiFuncImpl);
} else {
self.uiFuncImpl();
}
}
self.uiFuncImpl= function() {
Module2.doStuff();
}
}());
我能想到的方法来创建一个原型,将更加透明地处理的依赖问题比我上面的代码,并且完全打算如果必须这样做,但这真的是最好的解决方案吗?别人做什么?什么被认为是最佳实践?
渐进式增强和在document.ready上调用您的javascript函数/对象有什么问题? – Raynos 2011-03-17 17:18:35
document.ready不能保证包含被加载,只是DOM。 – 2011-03-17 17:19:09
@Jamietre你会发现jQuery document.ready可以加载javascript包含的头文件。 – Raynos 2011-03-17 17:21:33