Создание HTML: PHP на стороне сервера против jQuery на стороне клиента


Это вопрос дизайна. У меня есть данные, которые должны быть помещены в таблицу HTML, которая позже будет обрабатываться пользователем. В основном пользователь сможет выбирать элементы в строках таблицы.

У меня есть два варианта - в обоих случаях я использую AJAX для получения данных:

  1. Создайте HTML-код с помощью PHP на стороне сервера, отправьте его клиенту в виде HTML. Затем пользователь манипулирует таблицей с помощью Javascript (по сути, jQuery).

  2. Отправка необработанных данных клиенту, использующему JSON, затем используйте jQuery как для создания HTML, так и для последующего управления им пользователем.

Какой подход рекомендуется с точки зрения дизайна/простоты кодирования/красоты? Спасибо за любую информацию.

Author: Tatu Ulmanen, 2010-02-22

6 answers

Зачем генерировать HTML на PHP:

  • JavaScript должен определять поведение, а не содержание.
  • Для создания в JavaScript требуется больше разметки (многострочные строки не так просты, как в PHP).
  • Сложнее поддерживать, если ваш HTML генерируется в нескольких местах (PHP и JS).
  • Вы могли бы использовать функции управления DOM jQuery для создания своего HTML, но в долгосрочной перспективе вы стреляете себе в ногу.
  • Быстрее создавать HTML на сервер, чем в браузере (в вычислительном смысле).
  • Циклическое выполнение проще с PHP – легко создавать разметку таблицы.
  • Вы сохраняете некоторую боеспособность, если у пользователя отключен JavaScript, если вы выводите разметку при загрузке страницы.

Зачем генерировать HTML в jQuery:

  • Вы бы сэкономили некоторую пропускную способность.
  • Привязка событий может быть проще.

Итак, я за первый вариант, создание HTML в PHP.


Визуальное сравнение двух методов, создание простой таблицы.  

Вариант 1, с использованием PHP:

// PHP

$html = '<table>';    
foreach($data as $row) {
    $html .= '<tr>';
    $html .= '<td><a href="#" class="button">Click!</a></td>';
    $html .= '<td>'.$row['id'].'</td>';
    $html .= '<td>'.$row['name'].'</td>';
    $html .= '</tr>';
}
$html .= '</table>'; 
echo $html;
?>

// jQuery

$('#container').load('handler.php', function() {
    $('#container a.button').click(function() {
        // Do something
    });
});

 

Вариант 2, используя jQuery:

// PHP

echo json_encode($data);

// jQuery

$.ajax({
    url: 'handler.php',
    dataType: 'json',
    success: function(data) {
        var table = $('<table />');

        var len = data.length;
        for(var i = 0; i < len; i++) {
            var row = $('<tr />');
            var a = $('<a />').attr('href', '#').addClass('button');

            row.append($('<td />').append(a));
            row.append($('<td />').html(data[i].id);
            row.append($('<td />').html(data[i].name);

            table.append(row);
        }

        table.find('.button').click(function() {
            // Do something
        });

        $('#container').html(table);
    }
});

С точки зрения дизайна/простоты кодирования/красоты, я бы определенно сказал, что следует использовать подход PHP.

 36
Author: Tatu Ulmanen, 2010-02-21 22:50:26

Аналогичное обсуждение состоялось в Почему возвращать сгенерированный HTML вместо JSON - это плохая практика? Или это так? с некоторыми хорошими моментами, не упомянутыми в этой теме.

 4
Author: Janek, 2017-05-23 11:46:18

Если сгенерированный HTML идентичен HTML страницы, вы можете использовать существующий код шаблона для создания того же HTML с меньшим количеством дублирования кода.

В противном случае JSON, как правило, более распространен, поскольку он, как правило, более компактен и позволяет создавать узлы и назначать им свойства, отличные от HTML, такие как обработчики событий, по ходу работы.

Однако, если вы создаете свои новые узлы, создавая строку HTML, вам необходимо использовать кодировку HTML, чтобы гарантировать, что <, & или кавычки экранированы правильно. В JavaScript нет встроенной функции для этого, такой как htmlspecialchars в PHP; написать ее довольно тривиально, но, похоже, никто не беспокоится. Результатом являются приложения jQuery, которые полны дыр в безопасности межсайтовых сценариев на стороне клиента, как раз в тот момент, когда мы начали добиваться некоторого прогресса в исправлении XSS на стороне сервера.

 2
Author: bobince, 2010-02-21 21:46:11

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

 1
Author: brian, 2010-02-21 21:42:40

Мне очень нравится идея объединить подобные вещи на стороне клиента. Я обнаружил, что JavaScriptMVC является хорошей платформой (версия 2.0 основана на jQuery) для этого, потому что у нее есть шаблоны представления на стороне клиента (хотя не всем нравится такой подход).

Только с помощью jQuery я нахожу довольно сложным создавать представления на стороне клиента (потому что это не то, для чего он предназначен), поэтому вам может быть лучше собрать все вместе на стороне сервера в PHP если таким образом вы сможете сохранить свое приложение таким же динамичным.

 1
Author: Daff, 2010-02-21 21:44:36

Оба варианта имеют как плюсы, так и минусы, однако андрас делает правильный вывод, указывая, нужно ли индексировать/искать контент. Я лично выбрал бы вариант 1, хотя я считаю, что архитектуру было бы проще создать.

 0
Author: RichW, 2010-02-21 22:06:39