从属性字符串运行函数

时间:2014-03-13 03:19:10

标签: javascript jquery html string function

我有一个像这样的选择菜单:

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]();

我已阅读多篇关于同一问题的帖子,但没有人帮助我:herehere

我确定我做错了什么,但有人可以指出我正确的方向吗?

1 个答案:

答案 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}}