不创建全局变量的情况下从外部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。