PHP var 到 external JS -- 没有 global、ajax 或 eval


PHP Var to External JS -- Without Global, Ajax, or Eval

如何在

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

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

$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接受的答案:创建全局变量

问题:在没有 ajax 的情况下将 vars 从 php 传递到 js热门答案: 使用阿贾克斯

问题:php 文件将变量发送到外部文件.js热门答案: 使用阿贾克斯

问题:从外部JS读取PHP文件变量热门答案: 使用评估

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

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

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

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

你也可以

使用requirejs"模式":

外部.js:

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

在页面上:

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

(一般来说)拥有某种"init"方法来触发网站的增强的一个很大好处是你可以做这样的事情。例如:

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);
   }
}
其中

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

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

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

或者你也可以做

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

在这里,source.php将替换为从中加载数据的 URL。