如何将变量从PHP传递到Javascript

3

我现在将所有的javascript代码放在我的视图(PHP)中。但我想分离它们(以便删除重复代码)。 我目前正在使用CodeIgniter框架,并且我使用像这样的函数:

$(function() {
    $("#serialNumber").autocomplete({
         source: "<?php echo site_url('manage/getSerials'); ?>",
         change: function(event, ui) {
             if (!ui.item) {
                 $(event.target).val("");
             }
         },
         focus: function(event, ui) {
             return false;
         }
    });
});

然而,您不能在PHP中使用JavaScript变量。

那么,我应该为每个链接创建一个变量,并在我的JavaScript中使用它,还是将JavaScript放在单独的PHP文件中,或者有更好的解决方法?

以下是ToniTornado提供的答案:

首先,创建一个类似于以下函数:

function getURL(link) {
    var site = "<?php echo site_url(); ?>";
    site += "/" + link;
    return site;
}

将它包含在你的jQuery、CSS文件集合中,然后像这样使用函数(jQuery):

$(function() {
    $("#serialNumber").autocomplete({
         source: getURL('controller/function'),
         change: function(event, ui) {
             if (!ui.item) {
                 $(event.target).val("");
             }
         },
         focus: function(event, ui) {
             return false;
         }
    });
});
2个回答

4

我认为,将多个变量从PHP传递到Javascript的最佳方法是将它们收集在一个PHP对象中,将该对象转换为JSON格式,并在网站上的脚本标记中打印出来。

在您的控制器中:

$config = new stdClass();
$config->site_url = site_url('manage/getSerials');
$config->user_name = 'David';

您需要以某种方式将$config变量传递到视图中。

在您的视图中:

<script type="text/javascript">
  var MyConfig = <?= json_encode($config); ?> // global var "MyConfig"
</script>

它将生成以下代码:
<script type="text/javascript">
  var MyConfig = {
    site_url: "what/your/function/returned",
    user_name: "David"
  }
</script>

最后,在JavaScript文件中可以像这样访问您的变量:
console.log(MyConfig.site_url)

全局Javascript变量MyConfig的额外好处是将所有动态变量命名空间化为Javascript对象。

比我的更干净。+1 - Frogmouth
1
啊,好的,现在我明白了。 :) 要从Javascript“直接”调用PHP函数,每次都需要进行AJAX请求才能调用该函数 - 我不确定您是否想这样做。 - RobDil
另一个想法... PHP中的site_url()函数是什么样子的?在JS中复制它的功能可行吗? - RobDil
1
定义一个变量"base_path",然后像这样使用它:MyConfig.base_path + "/sub/dir",怎么样? - RobDil
@ToniTornado 不错的想法,但如果您有一个大型应用程序需要大量请求数据,那么在每次调用控制器之前进行ajax请求可能不是很好。 - David
显示剩余5条评论

1
您可以创建一个 PHP 数组,并在每次为 JS 函数创建链接时添加一个新项,例如:
$links['refence'] = site_url('manage/getSerials');

*refence = JS变量的名称或包含所有链接的JS对象的属性名称。

现在,在您所有视图的末尾(标签之前),您可以创建以下内容:

<script type="text/javascript">
    var refLink = {
        <?php foreach($links as $key => $link): ?>
            <?php echo $key; ?> : <?php echo $link; ?>,
        <?php endif; ?>
    }
</script>

如果您在DOM准备就绪时使用此属性,则对象refLink将被评估为:

var refLink = {
     link1 : "yourpath/action",
     link2 : "yourpath/action2",
     link3 : "yourpath/action3",
}

现在您不需要在复杂的JS中使用php,而是全部都在一个单独的JS文件中。
$(function() {
            $("#serialNumber").autocomplete({
                source: refLink.link3,  //link3 is the key of you php array. 
                change: function(event, ui) {
                    if (!ui.item) {
                        $(event.target).val("");
                    }
                },
                focus: function(event, ui) {
                    return false;
                }
            });
        });

这是一种方法...也许不是最好的...但是...如果你想尝试。


1
你可以创建一个响应"base path / config.js"这样的URL的视图,返回一个包含Javascript对象或JSONP的"text/javascript"头部,但这完全取决于你的PHP应用程序架构。我认为... 最好的方法是最适合你且最容易理解的方式。 - Frogmouth
2
你可以直接在 $links 上调用 json_encode(),而不需要使用这个 foreach 循环。 - RobDil
这不会产生任何可测量的差异。 - RobDil
好的...所以你的方法比我的更简洁。 - Frogmouth
1
谢谢 ;) 但我们的答案基本思路是相同的! - RobDil
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接