php方式傳遞資料 - php呼叫js function




將變量從PHP傳遞到JavaScript的有效方法 (6)

在我看來,如果你需要直接在JS中傳遞變量,可能你的Web應用程序設計得不好。

所以,我有兩個提示:*使用JSON文件進行常規配置,例如/js/conf/userprefs.json

{
    "avatar": "/img/users/123/avatar.jpg",
    "preferred_color": "blue"
    // ...
}
  • 或者(更好的方法)你可以通過AJAX調用檢索你的json confs。

使用像Symfony2這樣的PHP框架,您可以在路由配置中確定一種格式,將變量的輸出留給模板引擎(如Twig)。

我為Symfony2用戶做了一個例子,但任何程序員都可以使用它:

使用routing.yml

userprefs:
    pattern: /js/confs/userprefs.{_format}
    defaults: { _controller: CoreBundle:JsonPrefs:User, _format: json }
    requirements:
        _format: json
        _method: GET

在控制器內部,您可以執行檢索變量所需的所有查詢,並將這些變量放在視圖中:

資源/瀏覽/ JsonPrefs / User.json

{
    "avatar": "{{ user.avatar }}",
    "preferred_color": "{{ user.preferred_color }}"
    // ...
}

現在,您可以通過簡單的AJAX調用來檢索JSON。 出於性能目的,您可以使用Varnish緩存JSON(例如)。 這樣,每次讀取用戶首選項時,服務器都不需要執行查詢。

這個問題在這裡已有答案:

我不時要將一些變量從PHP傳遞給JS腳本。 現在我這樣做了:

var js-variable = "<?php echo $php-variable; ?>";

但這非常難看,我無法在.js文件中隱藏我的JS腳本,因為它必須由PHP解析。 處理這個問題的最佳解決方案是什麼?


如果您不想使用PHP生成您的javascript(並且不介意對您的Web服務器進行額外調用),請使用AJAX來獲取數據。

如果您確實想使用PHP,請在輸出之前始終使用json_encode進行編碼。

<script>
    var myvar = <?php echo json_encode($myVarValue); ?>;
</script>

將所有.js文件放在一個文件夾中,並配置HTTP服務器將所有請求重定向到那些加載文件並輸出文件的PHP文件。

假設你有Apache,你的.js文件在/ js中:

RewriteRule /js   /getjs.php

getjs.php:

<?php
header('Content-Type: text/javascript');
include_once($_SERVER['SCRIPT_NAME']);
?>

至少,您可以使用PHP短代碼使您的“醜陋”解決方案更清潔:

var js-variable = "<?= $php-variable ?>";

請使用rest / rpc api並將json傳遞給你的js。 如果您使用jquery,可以通過以下方式完成此操作:

rest.php

<?php echo "{name:biplav}" ?>

然後從你的js撥打這樣的電話:

var js_var;
$.get("rest.php", function(data) {
         js_var=data;
});

這是我能想到的最簡單的例子。


<?php
// filename: output-json.php
header('content-type:application/json;charset=utf-8');
printf('var foo = %s;', json_encode($foo, JSON_PRETTY_PRINT));

json_encode是一個強大的函數,可確保輸出被編碼並格式化為有效的javascript / json。 content-type標頭告訴瀏覽器如何解釋響應。

如果您的回答是真正的JSON,例如:

{"foo": 5}

然後將其聲明為content-type:application/json;charset=utf-8 。 與javascript相比,JSON解析速度更快,並且使用xss的可能性要小得多。 但是,如果您需要在響應中使用真正的javascript,例如:

var obj = {foo: 5};

然後將其聲明為content-type:text/javascript;charset=utf-8

您可以像文件一樣鏈接到它:

<script src="output-json.php"></script>

或者,可以方便地將值直接嵌入到html中,而不是單獨生成http請求。 這樣做:

<script>
    <?php printf('var foo = %s;', json_encode($foo, JSON_HEX_TAG | JSON_PRETTY_PRINT)) ?>
</script>

如果通過<script>標記嵌入到html中,請確保使用JSON_HEX_TAG ,否則會冒xss注入攻擊的風險。 根據您使用的上下文,還可能需要使用其他標誌以獲得更高的安全性: JSON_HEX_AMP, JSON_HEX_QUOT, JSON_HEX_APOS 。 這些標誌使響應的可讀性降低,但通常對安全性和兼容性有好處,因此您應該只使用它們。

我真的想強調聲明內容類型和可能使用JSON_HEX_TAG標誌的JSON_HEX_TAG ,因為它們都可以幫助緩解xss注入。

除非你想誘惑xss攻擊,否則要這樣做:

<script>
    var myvar = <?php echo json_encode($myVarValue); ?>;
</script>




cakephp-2.0