JavaScript 在对象内转换字符串时出现问题(在循环内)

JavaScript problem converting strings inside object (inside loop)

在为 Joomla 构建轮播模块时,我遇到了 2 个 JavaScript 无法修复的问题。我已经尝试了 2 天。希望这里有人能指出我做错了什么。

  1. 我无法从字符串 "0" 或字符串"1"
  2. 中获取布尔值
  3. 而且我不能 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)
        });

    };

});

轮播属性 itemsmargin 是数字。没问题,但这些从一开始就以数字形式收到。

问题:

  1. 属性 loopcenter 应该 return 一个布尔值,基于回调函数 eval()。但他们只是 return 字符串 "0""1".
  2. 属性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].