JavaScript 在对象内转换字符串时出现问题(在循环内)
JavaScript problem converting strings inside object (inside loop)
在为 Joomla 构建轮播模块时,我遇到了 2 个 JavaScript 无法修复的问题。我已经尝试了 2 天。希望这里有人能指出我做错了什么。
- 我无法从字符串
"0"
或字符串"1"
中获取布尔值
- 而且我不能
JSON.parse()
到 将对象字符串转换为 JavaScript 对象
情况:
为了能够在 1 个页面上有多个实例,我将每个模块的单独设置(通过 php)传递到我的 javascript 文件中的 1 个对象。每个模块都是对象内部的 1 个键值对,值是它自己的设置对象。基本上,这就是 JS 接收它的方式:
const moduleSettings = {
"103":{"items":3,"margin":5,"loop":"1","center":"0","responsive":"{0:{items:1}}"},
"105":{"items":3,"margin":5,"loop":"0","center":"1","responsive":"{0:{items:2}}"}
};
接下来我需要遍历每个模块来初始化设置。这是在准备就绪时使用 jQuery.
完成的
jQuery(document).ready(function() {
// Loop over each module
const modules = Object.keys(moduleSettings);
for (const id of modules) {
const target = "carousel-" + id;
const params = moduleSettings[id];
// Callback to evaluate true/false params
function eval(singleParam) {
return params[singleParam] === "1";
};
// Initialize carousel
jQuery(target).owlCarousel({
items: params.items,
margin: params.margin,
loop: eval("loop"),
center: eval("center"),
responsive: JSON.parse(params.responsive)
});
};
});
轮播属性 items
和 margin
是数字。没问题,但这些从一开始就以数字形式收到。
问题:
- 属性
loop
和 center
应该 return 一个布尔值,基于回调函数 eval()
。但他们只是 return 字符串 "0"
或 "1"
.
- 属性
responsive
应该return一个对象。但这仍然是一个字符串对象 "{...}"
.
控制台错误:
上面的第一个问题不会阻止功能。它有效,但我想了解为什么我的值不是布尔值。
然而,第二个问题导致控制台错误并使轮播无法工作。这仅在 responsive 不是空字符串时才会出现。当 responsive 为空字符串时,它起作用。但是我需要响应式设置。
我这两天一直在寻找这个问题的原因。越来越令人沮丧了。任何指针都是最有帮助的。谢谢!
而不是使用 eval
函数,您可以使用下面的
jQuery(target).owlCarousel({
items: params.items,
margin: params.margin,
loop: !!params.loop,
center: !!params.center,
responsive: JSON.parse(params.responsive)
});
对于第二个问题,您需要更改服务器端代码的结构以生成此模块设置JSON。响应对象不是正确的 JSON。它应该像
responsive: {items:1}
或 responsive: [{items:1}]
如果你能post那个代码,那么我可以告诉你需要在那里做的改变。
在您提供的示例中,您不是按作为 singleParam
参数提供的名称评估 params 字段,而是实际的 params.singleParam
字段,即 undefined
.要按名称获取字段,请使用方括号语法:params[singleParam]
.
在为 Joomla 构建轮播模块时,我遇到了 2 个 JavaScript 无法修复的问题。我已经尝试了 2 天。希望这里有人能指出我做错了什么。
- 我无法从字符串
"0"
或字符串"1"
中获取布尔值
- 而且我不能
JSON.parse()
到 将对象字符串转换为 JavaScript 对象
情况:
为了能够在 1 个页面上有多个实例,我将每个模块的单独设置(通过 php)传递到我的 javascript 文件中的 1 个对象。每个模块都是对象内部的 1 个键值对,值是它自己的设置对象。基本上,这就是 JS 接收它的方式:
const moduleSettings = {
"103":{"items":3,"margin":5,"loop":"1","center":"0","responsive":"{0:{items:1}}"},
"105":{"items":3,"margin":5,"loop":"0","center":"1","responsive":"{0:{items:2}}"}
};
接下来我需要遍历每个模块来初始化设置。这是在准备就绪时使用 jQuery.
完成的jQuery(document).ready(function() {
// Loop over each module
const modules = Object.keys(moduleSettings);
for (const id of modules) {
const target = "carousel-" + id;
const params = moduleSettings[id];
// Callback to evaluate true/false params
function eval(singleParam) {
return params[singleParam] === "1";
};
// Initialize carousel
jQuery(target).owlCarousel({
items: params.items,
margin: params.margin,
loop: eval("loop"),
center: eval("center"),
responsive: JSON.parse(params.responsive)
});
};
});
轮播属性 items
和 margin
是数字。没问题,但这些从一开始就以数字形式收到。
问题:
- 属性
loop
和center
应该 return 一个布尔值,基于回调函数eval()
。但他们只是 return 字符串"0"
或"1"
. - 属性
responsive
应该return一个对象。但这仍然是一个字符串对象"{...}"
.
控制台错误:
上面的第一个问题不会阻止功能。它有效,但我想了解为什么我的值不是布尔值。
然而,第二个问题导致控制台错误并使轮播无法工作。这仅在 responsive 不是空字符串时才会出现。当 responsive 为空字符串时,它起作用。但是我需要响应式设置。
我这两天一直在寻找这个问题的原因。越来越令人沮丧了。任何指针都是最有帮助的。谢谢!
而不是使用 eval
函数,您可以使用下面的
jQuery(target).owlCarousel({
items: params.items,
margin: params.margin,
loop: !!params.loop,
center: !!params.center,
responsive: JSON.parse(params.responsive)
});
对于第二个问题,您需要更改服务器端代码的结构以生成此模块设置JSON。响应对象不是正确的 JSON。它应该像
responsive: {items:1}
或 responsive: [{items:1}]
如果你能post那个代码,那么我可以告诉你需要在那里做的改变。
在您提供的示例中,您不是按作为 singleParam
参数提供的名称评估 params 字段,而是实际的 params.singleParam
字段,即 undefined
.要按名称获取字段,请使用方括号语法:params[singleParam]
.