【问题标题】:Return from json_encode fails从 json_encode 返回失败
【发布时间】:2018-07-03 15:45:42
【问题描述】:

我已经安装了 jssor 滑块并且可以正常工作。我正在尝试添加使用 php 从外部文件更改幻灯片类型的功能。在我未经编辑的 jssor 代码中,如果我输入以下内容作为幻灯片类型,它们将按预期工作:

    {$Duration:800,$Opacity:2},
    {$Duration:1000,y:1,$Easing:$Jease$.$InBounce,$Opacity:2}

当我尝试从函数加载时,如下面的代码所示,控制台命令的输出是

    0: "{$Duration:800,$Opacity:2},"​
    1: "{$Duration:1000,y:1,$Easing:$Jease$.$InBounce,$Opacity:2}"

如果我去掉引号并将它们放在 _SlideshowTransitions 函数中,它们就可以工作。那么是引起问题的引号吗?如果是这样,我该如何删除这些?还是 jssor 函数不适用于变量?或者是其他东西?

    function GetTransitions() {
        $xsisitons = array();
        $xsisitons[] = '{$Duration:800,$Opacity:2},';
        $xsisitons[] = '{$Duration:1000,y:1,$Easing:$Jease$.$InBounce,$Opacity:2}';
        return json_encode($xsisitons);
    }
    $jsondata = GetTransitions(); 

    <script>
    var xsitions = <?php echo $jsondata; ?>;
    console.dir(xsitions);

    var _SlideshowTransitions = [
      xsitions
    ];
    </script>

【问题讨论】:

  • 我不知道 jssor,但您正在构建看起来像 JSON 字符串的东西,然后对它们进行 JSON 编码。也许$xsisitons[] = [$Duration=&gt;800,$Opacity=&gt;2]; 等然后编码?

标签: php json jssor


【解决方案1】:

直接创建JS:

<?php
    function GetTransitions() {
        return $rawJS = '[
            {
                $Duration: 800,
                $Opacity: 2
            },
            {
                $Duration: 1000,
                y: 1,
                $Easing: $Jease$.$InBounce,
                $Opacity: 2
            }
        ]';
    }
    $options = GetTransitions(); 
?>
    <script>
    var xsitions = <?php echo $options; ?>;
    console.dir(xsitions);

    var _SlideshowTransitions = xsitions;
    </script>

这是阻止您使用json_encode 的行:

$Easing: $Jease$.$InBounce,

json_encode 会将$Jease$.$InBounce 视为字符串而不是 JS 代码,从而使其无法按预期运行。

这使得GetTransitions 极其危险,新变量名rawJS 暗示了这一点。请务必注意该函数的输出。

您可以通过在构建$rawJS 字符串时将输入变量转换为 int 或转义动态值(但不是整个字符串)来安全地在 PHP 中使 $Duration$Opacityy 动态化json_encode:

function GetTransitions($duration_1, $duration_2, $opacity, $y) {
    return $rawJS = '[
        {
            $Duration: ' . (int)$duration_1 . ',
            $Opacity: ' . (int)$opacity . '
        },
        {
            $Duration: ' . (int)$duration_2 . ',
            y: ' . (int)$y . ',
            $Easing: $Jease$.$InBounce,
            $Opacity: ' . (int)$opacity . '
        }
    ]';
}

【讨论】:

  • 感谢您的代码和安全建议。代码因错误而失败,但我注意到您更改了 _SlideshowTransitions = [ xsitions; ] 到 _SlideshowTransitions = xsitions;所以我用原始代码尝试了它并且它有效!我一直在摆弄这个一个月,所以我真的很感激这个修复,不管是有意还是无意。 :) 谢谢。
  • 这是一个有意的改变。括号(表示一个数组)是我提供的示例代码中 $rawJS 字符串的一部分。很高兴它对你有用!
【解决方案2】:

你想要的不是正确的 json,所以 json_encode 不会帮助你。但是,您可以自己构建 js 字符串。

$xsisitons[] = '{$Duration:800,$Opacity:2}';
$xsisitons[] = '{$Duration:1000,y:1,$Easing:$Jease$.$InBounce,$Opacity:2}';
return '[' . join(',', $xsisitons) . ']';

【讨论】:

  • 我试过你的代码。它将控制台输出更改为以下内容,但滑块仍然忽略类型: 0: Object { "$Duration": 800, "$Opacity": 2 } 1: Object { "$Duration": 1000, y: 1, "$Opacity": 2, ... }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2010-12-30
  • 1970-01-01
相关资源
最近更新 更多