在我的项目中,我为每个网页创建模块,并添加到名为View
的基础对象中:
App.js
var View = (function() {
var View = function() {
this.attributes = {
baseUrl : '',
urls : {}
};
};
View.prototype.setUrl = function(url) {
this.attributes.baseUrl = url;
};
View.prototype.getUrl = function() {
return this.attributes.baseUrl;
};
return new View();
})();
SearchView.js
var View = View || {};
var SearchView = View.SearchView = (function() {
var Private = {
search : function(url) {},
loadSearchResult : function() {},
clearSearchForm : function() {}
};
Private.search = function(url) {
ajax(url,...);
this.loadSearchResult();
};
var SearchView = function() {
this.settings = {};
};
SearchView.prototype.loadEventBindind = function() {
$(document)
.on('click','#search-button', function() {
Private.search(View.baseUrl);
})
.on('click','#reset-search', function() {
Private.clearSearchForm();
});
};
return new SearchView();
})();
search.html
<script type="text/javascript" src="media/scripts/Modules/App.js"></script>
<script type="text/javascript" src="media/scripts/View/SearchView.js"></script>
<script type="text/javascript">
View.setUrl('http://www.set.com/');
View.SearchView.loadEventBindings();
</script>
此代码在Chrome和Firefox中正常运行,但在IE中引发错误:
'
View.SearchView
'是null
或不是对象
IE不支持这种创建对象的方法吗?
答案 0 :(得分:1)
你应该做的事情很少:
您有一个弱点,即您的App.js脚本可能会覆盖SearchView.js创建的View
对象。
如果您坚持使用View作为类和命名空间,请执行此类更改以防止View
被覆盖。
var View = View || {};
var ViewTmp;
$.extend(ViewTmp = (function() {
var View = function() {
...
...
})(), View);
View = ViewTmp;
此脚本假定您使用的是jQuery(因为$.extend
方法)。