如何在不创建全局变量的情况下从外部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数组?
以前曾多次询问过这个问题:
问题:Access PHP var from external javascript file 一般承认的答案:Create global var
问题:Pass vars from php to js without ajax 回答:Use Ajax
问题:php file send variable to .js external file 回答:Use Ajax
问题:Reading a PHP file variables from external JS 回答:Use eval
问题:Return JSON data from PHP, and use it using Javascript 一般承认的答案:Create global var
答案 0 :(得分:2)
不,如果不将external.js
动态生成,就无法做到这一点。但是,您可以稍微改善一下策略。而不是让全局名为customers
的全局对象也用于附加所有全局变量:
window.Globals = {};
Globals.customers = <?php echo $customers; ?>;
Globals.something_else = <?php echo $something_else; ?>
不要将它命名为Globals
。将其命名为特定于您的公司或Web应用程序/站点的内容。这样,您将大大降低使用任何外部脚本冲突变量名称的风险,因为您只使用了一个全局变量,并且它以您网站特定的某些内容命名。
答案 1 :(得分:1)
你也可以使用requirejs“pattern”:
external.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);
}
}
更好的一部分是你可以把你正在做的事情分成小部分,这使得测试和调试变得更容易。
答案 2 :(得分:0)
如果你尝试使用自动完成插件,我认为你可以实现这一点。
$("#some_input_field").autocomplete("search.php", {
// your code
});
或者你也可以
$( "#some_input_field" ).autocomplete({
source: "search.php",
// some other code
});
此处source.php
将替换您加载数据的网址。