IE中Javascript名称空间抛出错误
在我的项目中,我为每个网页创建模块,并将其添加到名为IE中Javascript名称空间抛出错误,javascript,Javascript,在我的项目中,我为每个网页创建模块,并将其添加到名为视图的基本对象中: App.js var View = (function() { var View = function() { this.attributes = { baseUrl : '', urls : {} }; }; View.prototype.setUrl = function(url) { t
视图
的基本对象中:
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();
})();
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();
})();
SearchView.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();
})();
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>
View.setUrl('http://www.set.com/');
View.SearchView.loadEventBindings();
此代码在Chrome和Firefox中正常工作,但在IE中引发错误:
“View.SearchView
”为null
或不是对象
IE不支持这种创建对象的方式吗?您应该做几件事: 您的App.js脚本有一个弱点,它可能会覆盖SearchView.js创建的
View
对象
- 不要将一个变量同时用作名称空间和类。这是违反直觉的
- 如果您已经在编写单例,则不需要使用原型模式,尽管它没有什么问题。但是你不会保存任何内存
如果您坚持使用视图作为类和名称空间,请进行如下更改以防止
View
被覆盖
var View = View || {};
var ViewTmp;
$.extend(ViewTmp = (function() {
var View = function() {
...
...
})(), View);
View = ViewTmp;
此脚本假定您使用的是jQuery(因为
$.extend
方法)。@Martin我没有使用backbone.js抱歉,我把其他帖子弄混了。关于这个错误,我在IE中使用双重赋值时遇到了很多错误。您是否尝试过更改:var SearchView=View.SearchView=(function()…for this View.SearchView=(function()){……;var SearchView=View.SearchView;?没问题,martin..我将此约定用于与网页相关的模块..与search.html-SearchView、home.html-HomeView等类似,我删除了var View=View |{;SearchView.js中的行是否有效。为什么需要删除该行?它可能有效,但您遇到的问题与以前相同。一个脚本可能会覆盖另一个脚本设置的View
。很抱歉回复得太晚。让我检查一下您建议的代码。