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>(另外,请注意,我只测试
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;
}