Подтвердить что ты не робот

Эффективный способ передачи переменных из PHP в JavaScript

Время от времени мне приходится передавать некоторые переменные из PHP в JS script. Пока я сделал это так:

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

Но это очень уродливо, и я не могу скрыть свой JS script в .js файле, потому что он должен быть проанализирован PHP. Какое лучшее решение для этого?

4b9b3361

Ответ 1

Если вы не хотите использовать PHP для генерации вашего javascript (и не обращайте внимания на дополнительный вызов на ваш веб-сервер), используйте AJAX для извлечения данных.

Если вы хотите использовать PHP, всегда кодируйте его с помощью json_encode перед выходом.

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

Ответ 2

Пожалуйста, используйте rest/rpc api и передайте json в js. Это можно сделать следующим образом, если вы используете jquery:

rest.php

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

Затем из вашего js сделайте вызов вызова следующим образом:

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

Это самый простой пример, о котором я могу думать.

Ответ 3

<?php
header('content-type:text/javascript;charset=utf-8');
printf('var foo = %s;', json_encode($foo, JSON_PRETTY_PRINT));

json_encode обеспечивает действительный javascript. Заголовок сообщает браузеру, что он интерпретирует его как javascript.

то вы можете ссылаться на него как на файл:

<script src="script.php"></script>

В качестве альтернативы, может быть удобно встроить значение непосредственно в ваш html вместо отдельного HTTP-запроса. Сделайте это так:

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

Обязательно используйте JSON_HEX_TAG, если вы встраиваетесь в свой html, иначе вы рискуете атаками xss-инъекций. Там также есть другие флаги, которые вам могут понадобиться для большей безопасности в зависимости от контекста, в котором вы его используете: JSON_HEX_AMP, JSON_HEX_QUOT, JSON_HEX_APOS

Ответ 4

На мой взгляд, если вам нужно передать переменную непосредственно в JS, возможно, ваше веб-приложение не очень хорошо спроектировано.

Итак, у меня есть два совета: * Используйте файлы JSON для общих конфигураций, например /js/conf/userprefs.json

{
    "avatar": "/img/users/123/avatar.jpg",
    "preferred_color": "blue"
    // ...
}
  • или (лучший способ) вы можете получить json confs с помощью вызова AJAX.

С фреймворками PHP, такими как Symfony2, вы можете выбрать формат в конфигурации маршрутизации, оставляя вывод переменной в движке шаблона (например, Twig).

Я делаю пример для пользователей Symfony2, но это может использовать любой программист:

routing.yml

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

Внутри контроллера вы можете выполнять все запросы, необходимые для извлечения ваших переменных, помещая их в представление:

Ресурсы/Views/JsonPrefs/User.json

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

Внутри JS теперь вы сможете получить JSON с помощью простого вызова AJAX. Для достижения производительности вы можете кэшировать JSON (например) с помощью лака. Таким образом, ваш сервер не должен выполнять запрос каждый раз, когда вы читаете пользовательские настройки.

Ответ 5

Если вы измените файл .htaccess, чтобы включить

 AddType application/x-httpd-php .js

вы можете использовать файл .js, и он будет обрабатываться PHP, что составляет половину того, что вам нужно.

Что касается уродства этого решения, я бы сказал, что это наименее уродливый механизм. Вы можете попробовать передать весь JS script через PHP скрипт в виде строки и выполнить поиск и замену переменных, которые вам нужно вставить, но я думаю, что вы согласитесь, что это уродливое решение, в настоящее время используется.

Ответ 6

Поместите все ваши .js файлы в папку и настройте ваш HTTP-сервер для перенаправления всего запроса на эти файлы в файл PHP, который загружает файлы и выводит их.

Предположим, что у вас есть Apache и ваши .js файлы находятся в /js:

RewriteRule /js   /getjs.php

getjs.php:

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

Ответ 7

Чтобы избежать работы .js файлов с помощью парсера PHP, вы мало что можете сделать, за исключением, возможно, получения значения js-variable с помощью вызова AJAX.

Также вы можете рассмотреть вывод значения следующим образом:

var js_variable = <?php echo json_encode ($php_variable); ?>

чтобы избежать всех вещей, которые могут сломать ваш javascript.

Ответ 8

По крайней мере, вы можете использовать короткий код PHP, чтобы сделать ваше "уродливое" решение немного более чистым:

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