我已使用jQuery Boilerplate模板作为jQuery插件的起点。此模板提供了一个设置,其中this
表示插件实例,并提供对属性和方法的访问:
init: function() {
$(this.element).css({borderColor: "red"});
this.drawMarker([100, 200]);
},
drawMarker: function(coordinates) {
if (this.settings.isAbsolute) {
// ...
}
}
现在我需要处理一些鼠标点击,这一切都让人感到困惑,因为回调函数重新定义了this
变量来表示点击的事件,所以,为了访问插件的东西,我走了过来这个丑陋的解决方法:
this.container.on("click", "." + this.settings.markerClass,
{plugin: this}, this.removeMarker);
......和:
removeMarker: function(event){
var plugin = event.data.plugin;
var marker = $(this);
if (plugin.settings.isAbsolute) {
// ...
}
}
这实际上是我应该做的,还是我忽略了一种最直接的方法?
答案 0 :(得分:0)
如果您需要访问私有范围的变量(使用因此定义不在插件prototype
上的函数),只需创建一个别名插件对象的附加变量:
var plugin = this;
this.container.on('click', function() {
// use plugin here
...
});
如果有问题的回调函数在原型上,则可以访问回调中的对象:
var plugin = $(element).data('plugin_' + pluginName);
答案 1 :(得分:0)
一种可能性是使用jQuery.proxy()函数(在1.4上添加)强制在事件处理程序中使用给定的上下文:
this.$container.on("click", "." + this.settings.markerClass,
$.proxy(this.removeMarker, this));
然后,您可以按以下方式联系到您需要的东西:
this
event.target
(关于委派的事件,它是the precise element the user clicked on;我们通常想要的那个)removeMarker: function(event){
var $marker = $(event.target);
if (this.settings.isAbsolute) {
// ...
}
}
此技术由Patrick Evans提供。