Передача параметров в JavaScript файлы

Владимир | | HTML, JavaScript, PHP, Web разработка.

js parameters

Приветствую всех!

Сегодня я хочу обсудить два способа передачи параметров в JavaScript файлы.

Прежде всего, объясню, в чем заключается проблема. Обычно в конфигурационных файлах серверных (PHP) скриптов хранится множество настроек. И к некоторым из них нужно получить доступ из JavaScript. Если все эти параметры собраны в одном месте (конфигурационном файле или БД), то значительно упростится поддержку приложения.

Существует два широко распространенных решения этой задачи.

1) Генерация JS кода с помощью серверного скрипта.

Тут нужно помнить о том, что любой запуск скриптов на сервере создает дополнительную нагрузку. Поэтому генерировать JS скрипты целиком не правильно. Гораздо проще вставить небольшой фрагмент JS кода, который создаст массив с параметрами, прямо внутрь страницы, а основную часть JS кода разместить в статичных файлах.

Поясню сказанное на примере.

Допустим у нас есть страница (index.php) и js файл (my-scripts.js). Нам нужно передать несколько параметров из массива $config.

Страница будет выглядеть так.

<script type="text/javascript">
	$(function() {
		$.config = {
			par1:<?php echo $config['par1']; ?>
		};
	});
</script>
<script type="text/javascript" src="my-script.js"></script>

Как видите, мы создали глобальный хеш ($.config) и установили для его элемента par1 значение из массива $config.

Примечание. Для работы этого примера нужно подключить библиотеку jQuery.

Теперь хеш $.config можно использовать в my-script.js. Например, так

$(function() {
	alert($.config.par1);
});

Примечание. Если вам нужно передавать сложные структуры с параметрами, то будет удобнее использовать JSON формат.

2) Передача параметров в атрибуте src скрипта.

Этот способ используется загрузчиком библиотеки Script.aculo.us.

Идея следующая.

1) Необходимые параметры добавляются прямо к адресу скрипта. Напрмер, так

src="my-script.js?par1=myValue&par2=value2

Т.е. мы формируем GET запрос. Но естественно статичный JS файл его обработать не может.

2) Чтобы получить доступ к этим параметрам, мы добавляем в JS файл код, который:

2.1) находит соответствующий тег script;

2.2) читает его атрибут src;

2.3) получает строку с параметрами, например, с помощью такого регулярного выражения
/my-script\.js(\?.*)?$/

2.4) разбирает строку с параметрами (это можно сделать с помощью функции split).

Приводить пример для этого способа я не буду, т.к., во-первых, его можно посмотреть в исходниках script.aculo.us (файл scriptaculous.js, строки 48-56), а во-вторых, на мой взгляд, он обладает несколькими серьезными недостатками.

1) Вы не сможете передать большой объем данных таким способом, т.к. существуют ограничения на длину URL.

2) Значительно усложняется код как серверной, так и клиентской частей приложения. Сервер должен преобразовать массив с данными в строку, а браузер выполняет обратную операцию.

В общем, я понимаю, почему этот способ использовали разработчики script.aculo.us. Они передают только названия компонентов библиотеки, которые нужно подключить. И для пользователя такая запись перечня компонентов выглядит проще, чем вставка отдельного тега script. Но для передачи более сложных параметров этот метод подходит плохо.

На этом известные мене способы передачи параметров заканчиваются 🙂

Если у вас возникли идеи, пишите, буду рад обсудить!

  • куки?? (-:
    ну как вариант (-:

  • куки?? (-:
    ну как вариант (-:

  • Похоже на первый способ, но тем не менее: генерация параметров для тегов. Например, для мультиязычного сайта к тегу html цепляется параметр language с выбранным из PHP значением, а JavaScript уже читает этот параметр во время своего выполнения.

    • Тут есть ограничение. Хотелось бы чтобы валидатор не показывал ошибок.

  • Похоже на первый способ, но тем не менее: генерация параметров для тегов. Например, для мультиязычного сайта к тегу html цепляется параметр language с выбранным из PHP значением, а JavaScript уже читает этот параметр во время своего выполнения.

    • Тут есть ограничение. Хотелось бы чтобы валидатор не показывал ошибок.

  • Andron

    Последний коментарий (от Kapetdusaya) по теме 😉
    Кажется что первый вариант лучший в данной ситуации.

    • Такие комментарии «по теме» капитально достали 🙂 Иногда в день по 10-20 штук приходит.

  • Andron

    Последний коментарий (от Kapetdusaya) по теме 😉
    Кажется что первый вариант лучший в данной ситуации.

    • Такие комментарии «по теме» капитально достали 🙂 Иногда в день по 10-20 штук приходит.

  • Vl444

    dawy