Каковы распространенные методы отправки переменных конфигурации первоначального клиента Ajax при загрузке страницы? - PullRequest
6 голосов
/ 27 сентября 2011

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

Каковы возможные способы передачи переменных в клиентское приложение во время его загрузки (скрытые переменные?JSON где-то встроен?), И каковы плюсы / минусы каждого метода?

Я знаю несколько способов взломать вещи вместе, но мне интересно, если кто-нибудь определил хорошие шаблоны проектирования для использования, илилучшие практики, которыми они могут поделиться.

Хотя я бы предпочел общую информацию об этом, мой основной стек - jLAMP (jQuery, Apache, MySQL, PHP)

РЕДАКТИРОВАТЬ: У меня уже есть приложения, которые делают это, поэтому Я не ищу быстрое исправление или предложения для совершенно другой парадигмы (как, например, не загрузка конфигурации).Я ищу обсуждение с опциями и плюсами / минусами каждого , чтобы я мог настроить то, что у меня есть, или новому пользователю было бы предложено множество вариантов, чтобы принять хорошее дизайнерское решение изначало.Спасибо!

Ответы [ 6 ]

4 голосов
/ 11 октября 2011

Как уже отмечали другие, если во время загрузки вашего приложения требуется много информации для передачи, я бы не рекомендовал использовать AJAX, поскольку вы накладываете накладные расходы на ваше соединение.

Мой выбранный метод будет состоять в том, чтобы отображать всю информацию о конфигурации в теге head вашего приложения, используя PHP, таким образом, как только ваши события будут запущены (после завершения загрузки DOM, я бы предположил), у вас есть вся информация в вашем распоряжении.

Пример кода:

<head>
<script type="text/javascript">
 //Some js code here....
  var myConfigurationName = "<?=$myConfigurationNameFromDatabase;?>";
 //Some more js code here...
</script>
</head>

То, как вы форматируете свои данные конфигурации, полностью зависит от вас, все зависит от того, насколько все они связаны, или от того, сколько разных мест / объектов / функций вам может понадобиться для их использования.

Вы можете создавать несколько различных объектов конфигурации в зависимости от ваших данных или только один, который объединяет все из них. Это действительно зависит от дизайна приложения, которое у вас есть.

Если у вас в JS-коде хорошо продуман дизайн OO, вы можете проверить этот сайт и посмотреть, соответствует ли какой-либо из базовых шаблонов вашим потребностям.

Не стесняйтесь более подробно рассказать о своем дизайне (если можете), чтобы помочь нам понять, где вы находитесь и как мы можем вам помочь.

Удачного кодирования!

3 голосов
/ 11 октября 2011

Пока я использую php-файл для хранения пользовательских настроек для своего приложения. Затем включите их на странице, как мне нужно. Не забудьте установить тип содержимого "text / javascript"

В качестве иллюстрации мой файл конфигурации будет выглядеть так:

<?php header('Content-type: text/javascript'); ?>

var myApp = {
    // setTimeOut id
    timeoutID : null,

    // Cards clearance delay
    cardsClearanceDelay : 1500,

    // Add other attribute as needed
}

И включите их в страницу

<html>
    <head>
        <script type="text/javascript" src="web/get_configuration"></script>
    </head>

Я создаю свое приложение, используя CI, web/get_configuration, просто вызывая действие контроллера для рендеринга моего файла конфигурации JavaScript.

3 голосов
/ 27 сентября 2011

Для меня это передача в массив JSON.Это так гибко на стороне клиента, я не уверен, почему вы бы не использовали его.На бэкэнде я создаю его, используя обычный массив PHP, а затем просто преобразую его в JSON, используя json_encode, прежде чем переходить на веб-страницу.

<script>var myObject = <?=$mySettings?></script>

и все готово.В качестве бонуса я просто преобразую объект json в строку перед тем, как передать его обратно в PHP, используя одну переменную в сообщении, и преобразовать его обратно в массив PHP для манипуляции и включения в базу данных.

0 голосов
/ 15 октября 2011

Простые постоянные выбранные пользователем параметры, вероятно, лучше всего устанавливаются с помощью файлов cookie.Все более сложное лучше обрабатывается значениями json.

Очевидно, что вы можете поместить собственный код javascript в свой заголовок, чтобы установить переменные js, но это требует от вас рендеринга кода динамически, что (IMHO) безобразно и подвержено ошибкам.С другой стороны, вы можете визуализировать пользовательские метатеги, содержащие все ваши пользовательские данные, и позже прочитать их с помощью javascript.

В прошлом моим простым и элегантным решением было просто отобразить json в теге script в заголовке.

<script id="initparams" type="application/json"> 
    [ output of json.dumps({a: "AAA", ....}) ]  
</script>

И позже в обработчике готовности документа jQuery (который может быть загружен из внешнего файла):

var initparams = $.parseJSON($('#initparams').html());

Поскольку я использую дамп json и анализирую обе стороны, никаких шансов длянеправильное экранирование или атака внедрения.

Я сделал то же самое встраивание параметров json в <div class="options"> для опций, принадлежащих jstree или таблице данных, когда мне потребовалось всего несколько локальных параметров, не требующих вызова AJAX.Вы можете либо скрыть div.options с помощью CSS, либо удалить его из dom при анализе:

var tableoptions = $.parseJSON($('table.mydata > div.options').remove().html());
0 голосов
/ 15 октября 2011

Сначала вам нужно выяснить, что для вас важнее - точная настройка предпочтений сервера, производительность на стороне пользователя, модульность или что-то еще.

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

Вместо распределения конфигурации по модулям вы можете разделить различные виды конфигурации:

  1. Некоторые временные настройки могут быть сохранены в localStorage (или аналогичных, даже cookie), и вы получите выгоду от добавления событий, которые могут перенести конфигурацию на все открытые вкладки. Конечно, это было бы здорово, только если у одного пользователя только один компьютер, но вы все равно можете разрешить сохранение этой конфигурации на своем сервере.
  2. Пользовательские настройки могут быть помещены в один сериализованный объект (JSON довольно легок) и отправлены с вызовами AJAX. Вы можете кэшировать эти настройки на стороне PHP после того, как пользователь изменит их и просто сериализует пары ключ-значение.
  3. Конфигурацию всего сайта, вероятно, следует сделать отдельной, поскольку она редко изменяется и может храниться в файле JS. Вы хотите загрузить его после загрузки страницы? Хорошо - вы можете сделать это с AJAX и затем запустить eval. Что бы вы получили? Вы также можете статически загрузить один и тот же файл JS, и он будет кэшироваться браузером и не загружаться каждый раз, а интерпретатор PHP вообще не затронет его.

И вы можете смешать все это, как это обычно происходит в большинстве случаев с большими веб-сайтами, которые я видел.

Что касается формата, я бы предпочел JSON. Он довольно легкий (особенно при сравнении с XML), и вы можете красиво его GZIP, чтобы сделать его еще легче. JSON также легко расширяется с течением времени (вы можете добавлять и удалять опции без фатальных сбоев) и почти полностью поддерживает JS.

Что касается того, как генерировать JSON ... Хорошо, КЭШИТЕ ЭТО. Помимо некоторых специфических предпочтений, большинство параметров конфигурации не будут меняться слишком часто (не так часто, как при чтении).

Также обратите внимание, что конфигурацию можно понимать по-разному - в MediaWiki / Wikipedia вы можете добавить свой собственный JavaScript.

Также вы можете указать больше параметров, чем это необходимо, если вы хотите, чтобы ваши пользователи создавали дополнительные сценарии.

0 голосов
/ 10 октября 2011

Вы когда-нибудь пробовали jQuery taconite.

http://jquery.malsup.com/taconite/

JSON - отличный формат обмена данными.Но это не лучшее решение для каждой проблемы.

Для сравнения, модель Taconite требует только, чтобы сервер возвращал действительный XHTML.На клиенте вообще не требуется кодирование!

...