我想要封装了一些代码获取并使得在必要时释放的标签onLoad事件的Firefox扩展,我呼吁:模式来处理“这”在JavaScript事件处理程序
var onLoad = new MyHandler_onLoad();
然后当我做,我呼吁:
onLoad.unregister();
原则,直到你深入到更坚韧细节这段代码实现了上述罚款。
function bind(scope, fn) {
return function(){
fn.apply(scope, arguments);
};
function MyHandler_onLoad()
{
this.scan = function() {
do_scan(this.browser); // this.browser == undefined
};
this.register = function() {
this.tab.addEventListener("load", this.scan, false);
};
this.unregister = function() {
this.tab.removeEventListener("load", this.scan, false);
};
this.tab = gBrowser.selectedTab;
this.browser = gBrowser.selectedBrowser;
this.register();
window.addEventListener("unload", bind(this, this.unregister), false);
};
由于JavaScript的行为this
,我很挣扎。我希望能够从我的扫描功能访问this.browser,但不能。
我已使用bind
确保unregister
获得unload
的相应上下文。但是,我无法通过拨打scan
来做到这一点,因为如果我没有名字,我将无法在以后删除它。
在JavaScript中做这种事情有没有好的模式?
我试过在构造函数中存储bind(this,this.scan)作为变量的结果,但它没有帮助,现在正在努力寻找选项。
这似乎解决了它,但我认为我需要使用新的,因为我想处理单独的MyHandler_onLoad对象中的每个多个选项卡。 – Mat 2011-04-24 19:24:24
@Mat,是的,你不再需要'新'。您只需在原型方法中使用“新”,这不再是推荐的方法(因为OO不再是推荐的方法) – Halcyon 2011-04-24 19:43:55