PHP Var到外部JS - 没有Global,Ajax或Eval

时间:2012-06-02 05:30:30

标签: php javascript jquery json

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

3 个答案:

答案 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将替换您加载数据的网址。