5

我有一个 JSON 字符串,其中包含我需要调用的函数。

我的 JSON 看起来像这样:

{  
    "type":"listview",
    // the function I would like to call
    "content":"dynoData.getRetailers()",
    "custom_classes":["","nMT pickList","",""],
    "lib":"static_listview.html",
    "tmp":"tmp_listview_inset",
    "lang":"locale_search",
    ...

我正在使用它在客户端上组装一个 jQuery Mobile 列表视图。要获取动态数据,我需要调用dynoData.getRetailers().

但是我正在努力打电话:-)

这就是我正在尝试的:

var dyn = $.parseJSON( passed_JSON_string ),
    content = dyn.content;

我曾希望调用它会触发该函数,但它只是将函数名称作为字符串返回。

问题
如何才能触发实际功能?

谢谢!

编辑
我将 JSON 字符串放在实际页面上的 HTML 元素上,我将用我正在构建的元素替换它。这是HTML:

<ul data-template="true" data-config='{  
    "type":"listview",
    "content":"dynoData.getRetailers()",
    "custom_classes":["","nMT pickList","",""],
    "lib":"static_listview.html",
    "tmp":"tmp_listview_inset",
    "lang":"locale_search",
    "theme":"c",
    "filter":"true"
    }'></ul>

我可以将所有这些都放入data-属性中,但这会很混乱......

解决方案:这有效:

1) 将 JSON 更改为:

..."method":"getRetailers", ...

2)从Javascript调用:

content = dynoData[ dyn.method ]();

感谢大家!

4

4 回答 4

5

假设函数始终是dyn对象的一部分,您可以使用如下符号来调用函数:

dyn['dynoData']['getRetailers']();

因此,如果您能够调整 json,您可以发回如下内容:

"content":{ "mainObject": "dynoData" , "method" :"getRetailers"}

并使用变量将其转换为您的动态函数:

  dyn[content.mainObject][content.method]();

作为使用 jQuery 的示例,请尝试使用以下内容:

$('div')['hide']();

这与以下内容相同:

$('div').hide()
于 2012-12-09T22:18:11.587 回答
1

正如 charlietfl 指出的那样,您可以使用对象表示法来调用函数。对于您的情况,您必须摆脱()并拆分它,然后这样称呼它;

jQuery(function($) {
    var temp = $('ul').data('config').content.replace(/\(\)/g, '').split('.');
    window[temp[0]][temp[1]]();
});

但是,这可以解决您的问题,如果您考虑未来,则必须对其进行一些扩展。这样即使你不知道深度,你也可以调用它;

jQuery(function($) {
    var temp = $('ul').data('config').content.replace(/\(\)/g, '').split('.'), func, i, il = temp.length;
    for(i = 0; i < il; i++) {
        if(func == null) {
            func = window[temp[i]];
            continue;
        }
        func = func[temp[i]];
    }
    func();
});
于 2012-12-09T22:28:34.170 回答
1

试试 ConversationJS。它使动态调用非常容易,并且是解耦代码库的好方法:https ://github.com/rhyneandrew/Conversation.JS

于 2012-12-09T23:14:18.547 回答
0

JSON 是纯粹的传递数据符号,因此很容易读取和解析,因此它没有函数的概念。但是,还有其他方法可以解决这个问题,如果您开始认为这是解决困境的唯一方法,那么请退后一步并检查您的设计。而不是使用这个:

eval(yourCode);

尝试这个

var tempFun = new Function(yourCode);
tempFun(); 
于 2012-12-09T22:23:03.100 回答