Эффективный способ передачи переменных из PHP в JavaScript
Время от времени мне приходится передавать некоторые переменные из PHP в JS script.
Пока я сделал это так:
var js-variable = "<?php echo $php-variable; ?>";
Но это очень уродливо, и я не могу скрыть свой JS script в .js файле, потому что он должен быть проанализирован PHP. Какое лучшее решение для этого?
Ответы
Ответ 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 ?>";