如何在jquery插件变量上使用eval?

时间:2013-08-14 18:34:56

标签: dry pnotify

我使用的是JQuery插件pnotify。 我想缩短这段代码:

$.pnotify.defaults.styling = "jqueryui";
    $.pnotify.defaults.delay = 1500;
    $.pnotify.defaults.title = 'Error'
    $.pnotify.defaults.mouse_reset = false;
    $.pnotify.defaults.history = false;

这样的事情:

var darray = { 'styling':'\'jqueryui\'', 'delay':'1500', 'title':'\'Error\'', 'mouse_reset':'false', 'history':'false' };
$.each(darray, function(option,choice){
        eval("var $.pnotify.defaults." + option + "=" + choice + ";");
        });

然而,尽管尝试了各种各样的事情,但我失败了。这是我尝试过的一些事情:

var darray = { 'styling':'\'jqueryui\'', 'delay':'1500', 'title':'\'Error\'', 'mouse_reset':'false', 'history':'false' };
$.each(darray, function(option,choice){
            eval("var $.pnotify.defaults." + option + "=" + choice + ";");
            });

JSONstring='var $.pnotify.defaults.' + option + "=" + choice + ";";
$.parseJSON(JSONstring);

string99 = 'var $\.pnotify\.defaults\.' + option
$.parseJSON('{string99=choice}');

option='var $.pnotify.defaults.'+option;
var JSONObject= {'option':choice};
$.parseJSON(JSONObject);

小提琴:http://jsfiddle.net/morossive/kayKn/

1 个答案:

答案 0 :(得分:1)

你可以尝试这个(未经测试,但你明白了):

var darray = {
    styling: 'jqueryui',
    delay: 1500,
    title: 'Error',
    mouse_reset: false,
    history: false
};

for (var mbr in darray) {
    $.pnotify.defaults[mbr] = darray[mbr];
}

因为JavaScript处理像hashtables这样的对象,所以我们可以迭代它们的“键”(for (var mbr in darray))并为对象中的新键赋值。例如:

var obj = {...};

// The following are equivalent:
obj.x = 5;
obj['x'] = 5;

但是,我认为您的问题可能会有更优雅的解决方案(如果您担心在$.pnotify.defaults中覆盖预先存在的值,请不要使用此方法):

$.pnotify.defaults = {
    styling: 'jqueryui',
    delay: 1500,
    title: 'Error',
    mouse_reset: false,
    history: false
};

我知道你问过如何使用eval来解决这个问题,但我认为通常使用eval的替代方案可能更好。