我有一个关于这个和jQuery插件的潜在奇怪的问题
据我了解,以下是一个非常基本的jQuery插件:
$.fn.clickclone = function(param){
return this.click(function(){
param.apply(this);
});
};
(假装这是一个以某种方式扩展click()的插件.)
因此,如果我将一个函数作为参数传递,它会执行它需要做的事情并正确地将其作为DOM节点进行访问.简单.
这一点对我来说都很清楚.
目前尚不清楚的是,有什么方法可以将非函数参数传递给插件并让它从参数中正确访问它?即,我可以配置插件来做这样的事情:
$("#foo").pluginname(["foo", $(this).text() ]);
这样的:
<a href="/bar" id="foo">Bar</a>
它会正确地将数组传递给插件,数组中的第二项返回值Bar?
基本上,我这样做是为了为我的插件提供语法糖,你可以将数组作为快捷方式传递(除了使用普通的回调函数作为主要功能).除此之外,我无法使用此功能.因此我的困境.
编辑:这是邪恶的,但是,似乎一个解决方法是将参数作为字符串传递然后评估它.对我来说不是一个可行的解决方案,但是,它说明了我希望能够做到的事情:
$.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]));
}
});
};
最佳答案 没有函数就没有一般的方法可以做到这一点,因为在纯粹的数学意义上,你要求输入的一个函数(也就是函数):以某种方式依赖于它的东西.
你也许可以用字符串来破解它,但是你失去了函数的灵活性:
$.fn.alertMe = function (methodToAlert) {
alert(this[methodToAlert]());
};
// usage:
$("#foo").alertMe("text");
$("#foo").alertMe("width");
如果您发现使用可接受的功能但这种语法令人困惑,您可以简单地执行以下操作:
$.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是邪恶的我既不会写,也不会宽恕这样的解决方案.编辑:哦,我看到你在原始帖子的编辑中这样做了.好坏事败坏了后代;)