3

如何在不创建全局变量的情况下从外部 JavaScript 文件中的 PHP 变量访问 JSON 数组?

我有一个 PHP 变量 $customers 包含一个 json_encoded 数组:

$customers = [{"id":"12","name":"Abe Adams"},{"id":"17","name":"Bill Brown"}]

我想在 jQuery UI 自动完成文本输入中使用数组的内容。

与其对自动完成选项发出 Ajax 请求,我更愿意使用 $customers 数组中的值,该数组在用户到达页面时传入并准备就绪。

我知道我可以在加载外部 JavaScript 文件之前将 $customers 的内容传递给 JavaScript 变量:

<script>var customers = <?php echo $customers; ?></script>
<script src="external.js"></script>

但这需要创建一个全局 JavaScript 变量。

有没有更好的方法从我的外部 JS 文件访问 $customers 数组?


这个问题之前已经被问过好几次了:

问题:从外部 javascript 文件访问 PHP var 已 接受答案:创建全局 var

问题:在没有 ajax 的情况下将 vars 从 php 传递给 js 最佳答案:使用 Ajax

问题:php 文件将变量发送到 .js 外部文件 最佳答案:使用 Ajax

问题:从外部 JS 读取 PHP 文件变量 最佳答案:使用 eval

问题:从 PHP 返回 JSON 数据,并使用 Javascript 接受答案:创建全局变量

4

3 回答 3

2

external.js不,如果不动态生成,您将无法做到这一点。但是,您可以稍微改进您的策略。而不是有一个全局命名customers有一个全局对象来附加所有的全局变量:

window.Globals = {};
Globals.customers = <?php echo $customers; ?>;
Globals.something_else = <?php echo $something_else; ?>

不要命名它Globals。将其命名为特定于您的公司或 Web 应用程序/站点的名称。这样,您将大大降低变量名称与任何外部脚本冲突的风险,因为您只使用一个全局变量,并且它是以您网站的特定内容命名的。

于 2012-06-02T05:40:22.917 回答
1

您还可以使用 requirejs “模式”:

外部.js:

define([], {
    init: function (customerData) {
        ... all your setup
    }
});

在页面上:

require(['external'], function (externalSetupFile) {
    var customers = <?php echo $customers?>;
    externalSetupFile.init(customers);
});

(通常)拥有某种“初始化”方法来增强网站的一大好处是你可以做这样的事情。例如:

Application = {
   init: function (bootstrapData) {
       UserModel.create(bootstrapData.userModelData); //for example 
       this.config = bootstrapData;
       this.setupUI();
   },
   setupUI: function () {
      //setup autocomplete and the like
      $("#someEl").autocomplete(this.config.customers);
   }
}

更好的部分是你可以将你正在做的事情分成小部分,这使得测试和调试变得更加容易。

于 2012-06-02T06:31:13.933 回答
0

如果您尝试使用自动完成插件,我认为您可以实现这一点。

$("#some_input_field").autocomplete("search.php", {
    // your code
});

或者你也可以

$( "#some_input_field" ).autocomplete({
     source: "search.php",
     // some other code
});

这里source.php将替换为您加载数据的 url。

于 2012-06-02T05:50:48.670 回答