JavaScript:如何将多个参数传递给对象内的回调函数';谁的会员?
在使用插件时,我有时会遇到这样的插件:JavaScript:如何将多个参数传递给对象内的回调函数';谁的会员?,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,在使用插件时,我有时会遇到这样的插件: { color: function (someData, moreData) { return someData + moreData; } } 它将使用构造函数参数 一些参数解析为函数 其中一些需要多次辩论 像这样: { color: function (someData, moreData) { return someData + moreData; } } 如何向该函数传递两个参
{
color: function (someData, moreData) {
return someData + moreData;
}
}
- 它将使用构造函数参数李>
- 一些参数解析为函数李>
- 其中一些需要多次辩论
{
color: function (someData, moreData) {
return someData + moreData;
}
}
如何向该函数传递两个参数?
注意:我无法更改插件,因此将第二个参数移动到另一个构造函数参数不是一个选项
JavaScript示例:
(function ($) {
$.fn.greenify = function (options) {
var settings = $.extend({
color: function (someData, moreData) { // <-- THIS TAKES 2 ARGUMENTS!
return someData + moreData;
},
}, options);
return this.css({
color: settings.color,
});
};
}(jQuery));
$("#target1").greenify({
color: "blue"
});
$("#target2").greenify({
color: ["bl", "ue"] // <-- In your answer only this should be changed
});
将值“blue”
交给函数(someData,moreData)
作为第一个参数someData
这是错误的实际情况是默认回调(函数(someData,moreData)
)被字符串“blue”
完全替换
如何向该函数传递两个参数
你没有。jQuery可以。它是一个回调函数,用于在.css()
方法中动态确定color
属性-请参阅
因此,实际上,这个默认函数没有任何意义,因为它应该返回一个css颜色值,但是返回一个以元素索引为前缀的旧值,这个值肯定不是颜色
所以只需使用$(“#target2”).greenify({color:“black”})
如果你想传递一个函数,这也是可能的——但它会覆盖,而不是调用默认函数。例如:
$("div").greenify({
color: function(index, prevColor) {
return ["blue", "black"][index % 2];
}
});
小提琴:看到这个了吗
我对你的代码做了一些更改,现在它可以按照你的要求工作了
我使用options对象获取参数:
color: function () {
return options.color[0] + options.color[1];
}
实际上,您不必更改构造函数(),但我想您无论如何都必须更新插件主体。我猜您没有向我们显示实际的插件,因为您发布的内容没有多大意义(但可能是插件编码人员的错误)。如果是这样的话,请链接到真正的源代码。@Bergi:这向我提出了这个问题。但我的问题不是关于设计决策。我对JS的功能很好奇。相关的一行是-它用多个参数调用具有给定名称的方法(例如,
$(…)。选择2(“data”,someValues,true)
)。这就是你想要的吗?或者您想知道更多关于如何设计jQuery插件以及如何使用.apply
?谢谢。这是初始问题的一个很好的解决方案。除此之外,我仍然对处理上述示例的方法感到好奇。OP说他无法更改插件!OP说他无法更改插件@谢谢你的通知。我以为插件是另外一回事。我没有完全理解这个问题。我的问题是,这实际上会覆盖函数(someData,moreData){…}
还是只将其返回值传递给原始函数中的第一个参数someData
?是的,它会在设置
对象上替换它。调用这个函数是不可能的,因为你无法从外部访问它(如果不使用一些丑陋的黑客,比如破坏$.extend
),我会接受这个答案,因为这是最合适的(指向最后一部分)-基本上这个问题包含了一个设计缺陷,任何插件都不会有。
var settings = $.extend({}, options);
if($.isArray(options.color)) {
settings.color = function () {
return options.color.join('');
};
}
color: function () {
return options.color[0] + options.color[1];
}