这是之前的代码:
...
'postInitialization':function(){
var S = this;
$(document).on('click','.myButton',function(e){
e.preventDefault();
var ix = $(this).data('index');
S.doSomething(ix);
});
},
...
这有一个微妙的错误,而我的在代码后修复了它:
...
'postInitialization':function(){
window.SAVE_S = this;
$(document).on('click','.myButton',function(e){
e.preventDefault();
var S = window.SAVE_S;
var ix = $(this).data('index');
S.doSomething(ix);
});
},
...
在这两种情况下,代码都使用如下:
var S = {
...
'list':[],
'postInitialization':{...},
...
};
...
S.postInitialization();
...
稍后会在某些内容中添加S.list
的条目,例如S.list
变为["hello world"]
。然后,在此之后,在{DOM}中创建.myButton
,然后在此之后的某个时间点击它。
第一种情况中的问题是doSomething()
函数S.list
为空。通过将其分配给显式全局,在我的固定代码中,S.list
包含我期望的条目。换句话说,通过使用var S = this;
成语,它似乎正在拍摄S
在该点存在的快照,因此错过了后来的更改。 (注意:其他所有工作,函数调用,S
数据的其余部分都在那里等。)
这是否与使用jQuery的on()
将事件处理程序附加到尚不存在的DOM对象有关?
而且,虽然window.SAVE_S
有效,但感觉很粗糙。有更好的解决方法吗?