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

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

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

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

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

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

38
задан Tatu Ulmanen 21 February 2010 в 21:52
поделиться

5 ответов

Почему стоит генерировать HTML в PHP:

  • JavaScript должен определять поведение, а не содержание.
  • Создание на JavaScript требует больше разметки (многострочные строки не так просты, как в PHP).
  • Сложнее поддерживать, если ваш HTML генерируется в нескольких местах (PHP и JS).
  • Вы можете использовать функции jQuery по работе с DOM для создания 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
ответ дан 27 November 2019 в 03:51
поделиться

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

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

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

2
ответ дан 27 November 2019 в 03:51
поделиться

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

.
1
ответ дан 27 November 2019 в 03:51
поделиться

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

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

1
ответ дан 27 November 2019 в 03:51
поделиться

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

0
ответ дан 27 November 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: