【发布时间】:2016-03-19 01:19:07
【问题描述】:
在页面加载后声明的同一个 JS 文件或 html 模板中的 lauch js 函数之间有区别吗?当双方都登录$(document).ready(function () {...})时。
我认为不是,但是在将我的 ExampleService.init() 函数从模板替换为单独的 JS 文件时遇到了问题。
例如我有这样的结构:
common.js
var ExampleService= {
catalogSpinner: '',
init: function() {
this.initEvents();
},
initEvents: function() {
var self = this;
$('.example-button').on('click', function() {
//do some logic, append spinner...
self.removeSpinner();
});
},
removeSpinner: function() {
$(this.catalogSpinner).fadeOut('slow', function() {
$(this).remove().css({display: 'block'});
});
}
}
index.html
<script src="js/common.js"></script>
<script>
$(document).ready(function () {
ExampleService.catalogSpinner = '<div class="spinner"></div>'; // css3 animation
ExampleService.init();
});
</script>
这样一切都很完美,我的 catalogSpinner 从模板中覆盖,我可以像使用 DOM 元素一样使用它们。
但是! 如果我将 ExampleService.init(); 移动到 common.js 文件,就像这样:
common.js
var ExampleService= {
...
// all the same...
...
};
$(document).ready(function () {
'use strict';
ExampleService.init();
});
index.html
<script src="js/common.js"></script>
<script>
$(document).ready(function () {
ExampleService.catalogSpinner = '<div class="spinner"></div>';
});
</script>
这样就行不通了。并抛出控制台错误Uncaught TypeError: this.catalogSpinner.fadeOut is not a function
为什么会这样?毕竟在这两种情况下,init 函数仅在整个页面加载后才启动,无论我在启动基本函数后覆盖我的变量。我做错了什么?
关于 inits 的执行顺序。我怎么理解它没关系。无论如何,在点击事件发生之前,模板文件中的第二个 document.ready 总是覆盖 JS 文件中的空 catalogSpinner 变量
【问题讨论】:
-
您是否检查过调用这些事件的顺序?在我看来,common.js 中的调用在 index.html 之前被调用。
-
首先,你必须有有效的
jQuery选择器才能使用jQuery方法..
标签: javascript jquery html oop