【问题标题】:Specify inline jQuery function within PHP object then to jQuery using json_encode在 PHP 对象中指定内联 jQuery 函数,然后使用 json_encode 指定 jQuery
【发布时间】:2017-04-19 19:28:21
【问题描述】:

我有一个 PHP 脚本,它在 PHP 中创建一个对象,然后在通过 json_encode() 运行后由 jQuery 使用。我一直在尝试在 PHP 对象中包含一个 jQuery 倾斜函数,该函数将在运行 json_encode 后适用于我的 jQuery 脚本,但我无法正确处理。

例如,PHP:

function get_columns_object() {

    foreach( ... ) {
        $columns[ $table ][] = array(
            'data'           => $name === 'cb' ? null : $name,
            'title'          => $header[ 'title' ],
            'callback'       =>       <<== HOW TO SPECIFY INLINE FN HERE?
        );
    }
}

然后,在输出页面 HTML 的 PHP 脚本中,我包括:

<script async>
    var columns = <?php echo json_encode( get_columns_object() ); ?>;
</script>

这适用于变量,但如何使用这种方法包含 jQuery 回调函数和内联 jQuery 函数?或者我可以吗? :S

【问题讨论】:

  • json_encode()无法理解function,所以建议先保存函数代码,在创建javascript时重写。
  • @twisty 所以整个解决方法是排除内联函数“字符串”进行编码?也许我过于简单化了。第二篇文章很棒。谢谢你。
  • 我认为它不了解它是什么对象类型,只是做了一些快速研究。我同意,第二篇文章更清晰,更有帮助,只是更旧。现在应该可以在 jQuery 3.0+ 中使用JSON.parse()
  • 函数不包含在 json 类型中,请查看json.org。一种解决方法是在之前声明函数并使用名称作为字符串引用它,看看:stackoverflow.com/questions/912596/…

标签: php jquery


【解决方案1】:

扩展我的评论,并查看现代技术,您可以执行以下操作:

PHP

function get_columns_object() {
  foreach( ... ) {
    $columns[ $table ][] = array(
      'data'     => $name === 'cb' ? null : $name,
      'title'    => $header[ 'title' ],
      'callback' => "function() { alert('Callback Event'); }"
     );
  }
}

JavaScript

var columns = JSON.parse(<?php echo json_encode( get_columns_object() ); ?>);

经过进一步研究,我发现:jQuery execute string as function

这也可以。

<?php
$columns = array(
    "table1" => array(
        "data" => "MyName",
        "title" => "Name",
        "callback" => "function(){ alert('Callback Event'); }"
    )
);

$json_data = json_encode($columns);
?>
<html>
    <head>
        <title>Test Passing Function</title>
        <script src="https://code.jquery.com/jquery-3.1.1.js"></script>
        <script>
            var columns = <?php echo $json_data; ?>;
            columns.table1.callback = eval(columns.table1.callback);
            console.log(columns);
            $(function(){
                var link = $("<a>", {
                    href: "#"
                }).html("Click Me");
                link.click(columns.callback);
                link.appendTo($("#sandbox"));
            });
        </script>
    </head>
    <body>
        <p>Test Passing:</p>
        <pre><?php echo $json_data; ?></pre>
        <div id="sandbox">
        </div>
    </body>
</html>

在 phpfiddle.org 中进行测试,但他们看到 eval() 并杀死它。

更新

可以在这里测试:https://jsfiddle.net/Twisty/z0xpqorz/2/

var columns = <?php echo json_encode( get_columns_object() ); ?>;
$(function() {
  var link = $("<a>", {
    href: "#"
  }).html("Click Me");
  link.click(eval('(' + columns.table1.callback + ')'));
  link.appendTo($("#sandbox"));
});

查看更多:Passing a JavaScript function from JSON encoded PHP

还请阅读Ricardo Enrique Ibarra Cabrera 提到的帖子。好的建议。这些帖子建议出于充分的理由不惜一切代价避免eval()

【讨论】:

  • 由于明显的安全风险,我将无法在此应用程序中使用 eval()。您的 jsfiddle 效果很好,我看不出我对 `new function() 的使用是如何不起作用的。这种方法是否适用于简单的回调?所以不是指定一个内联函数,而是只指定函数名?显然,jQuery 问题在技术上是内联函数被用引号括起来,否则 json 字符串将是正确的。
  • 就像new Date() 构造一个新的 Date 对象一样,new Function() 将构造一个新的函数对象。 functionBody包含构成函数定义的 JavaScript 语句的字符串因此,既然你的函数内容来自 JSON,你可以将它传递给构造函数。
  • @rwkiii 如果您打算传回各种函数,这可能会有所帮助:jsfiddle.net/Twisty/z0xpqorz/6
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2014-03-28
  • 2015-09-11
  • 2019-09-17
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多