我有一个像这样的选择菜单:
HTML
<select name="moduleGroup">
<option data-function="getListing('pages')">Pages</option>
</select>
的Javascript
function getListing(s) {
console.log(s);
}
$('select').on('change', function() {
var func = $(this).find('option:selected').attr('data-function');
[func]();
});
我也试过,$[func]();
,$('body')[func]();
我已阅读多篇关于同一问题的帖子,但没有人帮助我:here和here
我确定我做错了什么,但有人可以指出我正确的方向吗?
答案 0 :(得分:2)
最简单的方法是拨打eval()
,如下所示:
$('select').change(function() {
var func = $(this).find('option:selected').attr('data-function');
eval(func);
});
小提琴:http://jsfiddle.net/gywzb/4/
但整个世界都认为这是一种不好的做法。正如我最喜欢的品牌所说,&#34; eval()是邪恶的。&#34;它会为您打开许多令人讨厌的安全漏洞(特别是当您维护应用程序时,事情会因您最初的编写方式而改变),而且无论如何都表现糟糕。幸运的是,还有更好的方法。
首先,我要稍微分解你的数据属性,这样你就不会有一个包含函数名和参数的属性,而是有两个属性:一个用于函数名,另一个参数。
<select name="moduleGroup">
<option data-function="getListing" data-parameter="pages">Pages</option>
</select>
其次,我们将创建一个&#34;类&#34;包装你的功能,如下:
var MyClass = function() {
}
MyClass.prototype = {
getListing: function(s) {
console.log(s);
}
};
最后,您可以使用以上更改来调用您的函数:
$('select').on('change', function() {
var func = $(this).find('option:selected').attr('data-function');
var param = $(this).find('option:selected').attr('data-parameter');
var myInstance = new MyClass();
var funcRef = myInstance[func];
funcRef.call(myInstance, param);
});
以下是小提琴的全部内容:http://jsfiddle.net/7CwH4/2/
当您使用.call method来调用您的函数时,会发生魔力。 .call()
方法的第一个参数是函数将看作其this
对象的对象。 .call
的下一个参数是函数的第一个参数。 (如果你的函数需要更多参数,那么.call
的第三个参数将是函数的第二个参数,等等。如果这是令人困惑的话,请参阅.call
data-parameter
。)
如果需要传递比字符串更复杂的数据作为参数,可以将其作为JSON字符串放在// If your data-parameter attribute contained a JSON string.
$('select').on('change', function() {
var func = $(this).find('option:selected').attr('data-function');
var param = $(this).find('option:selected').attr('data-parameter');
var paramObj = $.parseJSON(param);
var myInstance = new MyClass();
var funcRef = myInstance[func];
funcRef.call(myInstance, paramObj);
});
属性中,然后在传递之前使用MDN documentation将其转换为对象函数的参数:
{{1}}