我有一个关于this
和jQuery插件的潜在奇怪的问题
根据我的理解,下面是一个非常基本的jQuery插件:
$.fn.clickclone = function(param){
return this.click(function(){
param.apply(this);
});
};
(假装这是扩展click()
的插件)
所以,如果我传递一个函数作为参数,它做它需要做的事情,并正确地访问this
作为一个DOM节点。容易。
我很清楚。
不清楚的是,是否有任何方法可以将非功能参数传递给插件,并使其从参数中正确访问this
?也就是说,我可以配置插件做这样的事情:
$("#foo").pluginname(["foo", $(this).text() ]);
for:
<a href="/bar" id="foo">Bar</a>
它将正确地传递一个数组给插件,数组中的第二项返回值Bar
?
我这样做,基本上,为我的插件提供语法糖,在那里你可以传递一个数组作为一个快捷方式(除了使用一个普通的回调函数作为主要功能)。除此之外,这样做,我失去了this
的使用权限。这就是我的困境。
EDIT:这是邪恶的,但是,似乎一个工作是将参数作为字符串传递,然后eval
它。对我来说不是一个可行的解决方案,但是,它说明了我希望能够做什么:
$.fn.clickclone = function(param){
return this.click(function(){
if(typeof param === "function"){
param.apply(this);
}
else if(typeof param[1] === "string"){
console.dir("This is evil: " + eval(param[1]));
}
});
};
在没有函数的情况下没有一般的方法可以做到这一点,因为,在纯粹的数学意义上,您要求输入的函数(即this
的函数):以某种方式依赖于this
的东西。
你也许可以用字符串来破解它,像这样,但你失去了函数的灵活性:
$.fn.alertMe = function (methodToAlert) {
alert(this[methodToAlert]());
};
// usage:
$("#foo").alertMe("text");
$("#foo").alertMe("width");
如果您发现使用函数是可以接受的,但是this
语法令人困惑,您可以简单地执行以下操作:
$.fn.alertMe = function (alertGetter) {
alert(alertGetter($(this));
};
// usage:
$("#foo").alertMe(function (x$) { return x$.text(); });
$("#foo").alertMe(function (x$) { return x$.width(); });
为了完整起见,我想我应该提到您可能会使用基于eval
的解决方案,看起来像$("#foo").alertMe("$(this).text()")
,但eval
是邪恶的,我既不会写也不会宽恕这样的解决方案。编辑:哦,我看到你在你的原始帖子的编辑中这样做了。干得好,腐蚀子孙后代;)