Javascript 有一个字符串值,使其获得正确的对象

Javascript 有一个字符串值,使其获得正确的对象,javascript,jquery,html,json,Javascript,Jquery,Html,Json,我得到了一个数据属性,它得到了一个字符串值,从中我希望能够得到特定的json对象(字符串的值)。像这样 下面的例子是剥离版本(足以说明问题),请查看此提琴,了解我尝试执行的操作的完整版本 <div class="js-carousel" data-conf='{"componentSettings": "CarouselSettings" }'>...</div> 我可以设置一个字符串值并触发一个函数 "mediaQuery": "isBase2Medium" 这将

我得到了一个
数据属性
,它得到了一个字符串值,从中我希望能够得到特定的json对象(字符串的值)。像这样

下面的例子是剥离版本(足以说明问题),请查看此提琴,了解我尝试执行的操作的完整版本

<div class="js-carousel" data-conf='{"componentSettings": "CarouselSettings" }'>...</div>
我可以设置一个字符串值并触发一个函数

"mediaQuery": "isBase2Medium"

这将触发mediaquery控制功能。所以我想也许我可以有一个类似的方法来实现这一点?

我已经更新了你的小提琴,以实现(我认为)你想要实现的目标:

请注意我所做的以下更改:

  • 主要的变化在
    getSettings()
    函数中。在这里,我引入了一个检查,以查看是否有一个特定设置(
    componentSettings
    )在窗口(全局)范围中声明为对象,如果是,则用对象替换字符串参数。这就引出了第(2)点
  • 您正在使用
    var
    在全局范围内声明配置对象,但在jsFiddle中,您的整个脚本都放在
    窗口中。onload
    处理程序使这些变量成为处理程序的局部变量。我删除了
    var
    关键字以使参数成为全局参数,从而将它们暴露给窗口对象,但这是一种糟糕的做法。考虑将它们放到全局配置对象中,然后在上面的<代码> GETStutsIn()/<代码>方法中,用<代码> [MyGlobal CONF][]/COD>(
  • )替换<代码>窗口[]/COD>。
    另外,请注意,我只测试
    componentSettings
    字段。如果您想测试每个参数,那么您必须对它们进行迭代,并对每个参数执行相同的检查。

    哦,天哪,代码太长了,我终于找到了插入eval(…)的入口点,您可以使用eval(…)尝试此解决方案:


    嗯,不是一个特定的值,而是整个配置,如
    CarouselConfig.hero
    本身就是一个json对象@Rajeshelement.slick未定义,您确定它存在吗?@Rajesh它不希望它们只是一个选项,请检查
    函数getComponent(element){return element==undefined?$(elementClass):$(element);}
    ,如果未定义,则将使用定义的“default”js类。@holi java,情况并非如此,如果您将设置删除到第43行的
    .Slick()
    中,它将起作用,因此您的问题是{componentSettings:“CarouselSettings”},您可以获得CarouselSettings变量而不是字符串?我希望避免将它们作为全局变量。此外,这些设置在它们自己的文件中都是实时的,那么
    myGlobalConf[]
    是如何工作的呢?是的,我之所以没有使用
    Eval()
    是因为我读到它可能无法预测。你看到它有什么问题吗?eval()是解决这个问题的简单方法。假设有一个字符串
    settings.options.debug
    ,如果你使用eval(…)那么事情就简单了。如果你使用属性访问器的方式,你必须用符号
    将所有的内容分割成一个数组,并使用循环来获得最终的值。如果你必须计算top对象中的某个内容。例如:
    var top={foo:'bar}
    ,你的表达式就是
    foo
    。你只能使用这个表达式,例如:
    eval('(top.+expression+))“)
    。这也使代码可读,但对于维护不友好。可能同时使用regex将使代码更可读。e、 g:
    eval((顶部['%name'])。替换(/%name/,表达式))
    var CarouselSettings = {
      accessibility: false,
      autoplay: true
    };
    
    var CarouselConfig = {
      hero: {
        accessibility: false,
        autoplay: true
      },
      product: {
        accessibility: true,
        autoplay: false
      }
    };
    
    "mediaQuery": "isBase2Medium"
    
        function applySettings(settings) {
            var componentSettings = settings.componentSettings;
            componentSettings = typeof componentSettings == 'string' ? eval('(' + componentSettings + ')') : componentSettings;
            settings.componentSettings = componentSettings;
            return settings;
        }
    
        function getSettings($element, settings) {
            settings = settings === undefined ? applySettings($element.data(elementConf)) : settings;
            ....
    
            return settings;
        }