![](/img/trans.png)
[英]javascript document.ready not always working, iscroll !
[英]JavaScript Module Pattern document.ready not working
我有一个Module模式的基本示例,该模式只是向页面的footer元素添加一个类。
将脚本加载到body标签中(在footer元素之后)后,它将起作用并将类添加到页脚中。
将脚本加载到head标记中(在footer元素之前)后,即使在文档准备就绪之前不应该调用init,该脚本也无法工作。
我认为document.ready不能按预期工作,因此找不到脚注元素,因为它不存在。
多年来,这一直困扰着我,我似乎找不到解决方案,请有人可以阐明这个问题吗?
示例: https : //jsfiddle.net/5x5skoq3/
var App = (function ($) {
"use strict";
// private alias to settings
var s;
return {
settings: {
footer: $("footer")
},
init: function() {
s = this.settings;
this.footer();
},
footer: function(){
s.footer.addClass("active");
}
};
})(jQuery);
jQuery(document).ready(function() {
App.init();
});
谢谢
init
的时间不是问题,而是settings: { footer: $("footer") }
的评估为时过早。 加载模块时已经在这里引用了元素,而不是在初始化时引用了该元素。
幸运的是,这很容易解决:
var App = (function($) {
"use strict";
var footer;
return {
settings: {
footerSelector: "footer"
},
init: function() {
footer = $(this.settings.footerSelector);
this.footer();
},
footer: function() {
footer.addClass("active");
}
};
})(jQuery);
在这种情况下, App
是一个自调用函数。 该函数执行创建返回对象及其所有属性的操作。 在函数自我调用时,将调用footer: $("footer")
返回length: 0
的jQuery对象,指示选择器未返回匹配的元素或元素集。 我已经更新了您的jsfiddle,以提醒您在调用init
找到的匹配项数量。
您可以通过多种方式解决此问题。 我可能会解决的方法是将settings
转换为对象构造函数:
var App = (function ($) { "use strict"; // private alias to settings var s; return { settings: function () { this.footer = $('footer'); }, init: function() { s = new this.settings(); this.footer(); }, footer: function(){ s.footer.addClass("active"); } }; })(jQuery); jQuery(document).ready(function() { App.init(); });
footer.active { background-color: red; color: #fff; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <header> Header content </header> <footer> Footer content </footer>
使用此方法,您仍然可以将逻辑置于init
函数之外,但可以与settings
返回对象的原始示例保持一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.