Самый простой способ построить HTML-элементы в JQuery - PullRequest
67 голосов
/ 18 марта 2012

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

var title = "Title";
var content = "Lorem ipsum";

// escaping endlines for a multi-line string
// (aligning the slashes is marginally prettier but can add a lot of whitespace)
var $element1 = $("\
    <div><h1>" + title + "</h1>\
        <div class='content'>  \
        " + content + "        \
        </div>                 \
    </div>                     \
");

// all in one
// obviously deficient
var $element2 = $("<div><h1>" + title + "</h1><div class='content'>" + content + "</div></div>");

// broken on concatenation
var $element3 = $("<div><h1>" +
                title + 
                "</h1><div class='content'>" +
                content +
                "</div></div>");

// constructed piecewise
// (I've seen this with nested function calls instead of temp variables)
var $element4 = $("<div></div>");
var $title = $("<h1></h1>").html(title);
var $content = $("<div class='content'></div>").html(content);
$element4.append($title, $content);

$("body").append($element1, $element2, $element3, $element4);

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

Ответы [ 9 ]

68 голосов
/ 13 февраля 2014

Шаблоны великолепны, и если у вас есть доступ к ним в вашем проекте, я предлагаю вам использовать их. Если вы используете Underscore или Lodash , он встроен. Однако в некоторых случаях вам потребуется встроить HTML в код, будь то рефакторинг или тестирование. Я обнаружил, что приведенный ниже формат является наиболее понятным для чтения, когда это требуется.

Примечание: HTML-спецификация допускает одинарные ИЛИ двойные кавычки для атрибутов в вашей разметке, так что не беспокойтесь обо всех этих безумных побегах.

this.$fixture = $([
  "<div>",
  "  <div class='js-alert-box'></div>",
  "  <form id='my-form-to-validate'>",
  "    <input id='login-username' name='login-username'>",
  "  </form>",
  "</div>"
].join("\n"));
45 голосов
/ 17 августа 2012

Посмотрев немного, я нашел стиль, на котором наконец остановился. Во-первых, я скажу, что я использовал Усы для шаблонизации, и это сработало хорошо. Однако иногда вам просто нужно создать элемент один раз, не используя его повторно, или у вас есть какая-то другая мотивация, чтобы не вводить другую библиотеку. В этой ситуации я принял к использованию:

$("body")
.append(
    $("<div>")
    .append(
        $("<div>")
        .append(
            $("<h1>").text(title)
        )
    )
    .append(
        $("<div>").text(content)
    )
);​

Это работает, потому что append() возвращает ссылку на объект, который вы добавляете к , поэтому цепочка append() s присоединяется к тому же объекту. При правильном отступе структура разметки очевидна, и ее легко изменить. Очевидно, что это медленнее, чем использование шаблонов (все должно быть построено по частям), но если вы используете его только для инициализации или чего-то подобного, то это отличный компромисс.

Есть много способов, которыми можно отформатировать такую ​​конструкцию, но я выбрал способ прояснить, что происходит. Правило, которое я использовал, заключается в том, что в каждой строке должно быть не более одной открывающей скобки и / или одной закрывающей скобки. Кроме того, листья этих деревьев дополнений не нужно передавать конструктору jQuery, но я сделал это здесь для визуального повторения.

29 голосов
/ 18 марта 2012

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

Мне нравится этот:

$('<div/>', {
    html: $('<h1/>', {
        html: title
    }).after(
        $('<div/>', {
            'text': content,
            'class': 'content'
        })
    )
}).appendTo('body');

генерирует:

    ...
    <div><h1>some title</h1><div class="content">some content</div></div>
</body>

и обеспечивает правильную кодировку HTML и построение дерева DOM с соответствующими открывающими и закрывающими тегами.

23 голосов
/ 18 марта 2012

Мой совет: не пытайтесь создавать html-элементы с помощью jQuery, это не его ответственность.

Используйте систему шаблонов Javascript, например Усы или HandlebarJs .

Имея очень ограниченное количество строк, вы можете создавать html-элементы непосредственно из объекта Javascript. Это не сложно, всего 2 функции и шаблон.

<div class="entry">
  <h1>{{title}}</h1>
  <div class="body">
    {{body}}
  </div>
</div>

var context  = {title: "My New Post", body: "This is my first post!"}
var template = Handlebars.compile($("#template-skeleton"));
var html     = template(context);

Edit:
Другой пример без HTML, чистый Javascript (из ICanHaz ):

var skeleton = '<div><h1>{{title}}</h1><div class="content">{{content}}</div></div>';
var data = { title: "Some title", content: "Some content" };
var html = Mustache.to_html(skeleton, data);

Это гораздо более легко обслуживаемо, чем серия конкатенаций.

12 голосов
/ 27 апреля 2015

2015 ответ : для старых браузеров используйте multiline .

var str = multiline(function(){/*
<!doctype html>
<html>
    <body>
        <h1>❤ unicorns</h1>
    </body>
</html>
*/});

Для ES6 используйте Строки шаблона JavaScript

var str = `
<!doctype html>
<html>
    <body>
        <h1>❤ unicorns</h1>
    </body>
</html>`
6 голосов
/ 27 января 2015

Это адаптировано из ответа Бэра.Я считаю его более читабельным, нет необходимости создавать и присоединять массив, нет необходимости помещать кавычки вокруг каждой строки:

http://jsfiddle.net/emza5Ljb/

var html =

    '                                                           \
      <div>                                                     \
        <div class="js-alert-box"></div>                        \
        <form id="my-form-to-validate">                         \
          <input id="login-username" name="login-username">     \
        </form>                                                 \
      </div>                                                    \
    '

// using jQuery:
//
var dom = $( html )

// or if you need performance, don't use jQuery
// for the parsing.
// http://jsperf.com/create-dom-innerhtml-vs-jquery
//
var div       = document.createElement( 'div' )
div.innerHTML = html
var dom = $( div )

FYI, когда производительность неПроблема и элементы содержат много динамических данных, иногда я просто пишу такой код (обратите внимание, что компилятор закрытия закрывает предупреждение о свойстве класса без кавычек, но в современных браузерах это прекрасно работает):

$(
      '<a></a>'

    , {
           text     : this.fileName
         , href     : this.fileUrl
         , target   : '_blank'
         , class    : 'file-link'
         , appendTo : this.container
      }
)
2 голосов
/ 05 июля 2017

Вот пример, который использует $ (htmlString) и имитирует стандартную компоновку HTML-кода:

function getPage(title, contents) {
  return (
    $("<div>", {id: "container", class: "box"}).append(
      $("<div>", {class: "title"}).append(
        $("<h1>").text(title)
      ),
      $("<div>").html(contents)
    )
  );
}
2 голосов
/ 29 ноября 2016

Я считаю функциональный подход очень удобным.Например,

// reusable generics TABLE constructor helpers
var TD = function(content) { return $('<td>', { html: content }) }
var TH = function(content) { return $('<th>', { html: content }) }
var TR = function(cell, cells) {  // note the kind of cell is a 2^order parameter
    return $('<tr>', { html: $.map(cells, cell) })
}

// application example
THEAD = $('<thead>', {html:
    TR(TH, [1,2,3,4])})
TBODY = $('<tbody>', {html: [
    TR(TD, ['a','b','c','d']),
    TR(TD, ['a','b','c','d']),
]})

теперь вызов

$('#table').append($('<table>', {html: [THEAD, TBODY]}))

дает

<table><thead><tr><th>1</th><th>2</th><th>3</th><th>4</th></tr></thead><tbody><tr><td>a</td><td>b</td><td>c</td><td>d</td></tr><tr><td>a</td><td>b</td><td>c</td><td>d</td></tr></tbody></table>

edit

Я усовершенствовал свой подход, теперь доступный, например, как html_uty.js

2 голосов
/ 18 марта 2012

Вы можете посмотреть шаблоны представления javascript:

http://embeddedjs.com/

http://jupiterjs.com/news/jquery-view-client-side-templates-for-jquery

http://javascriptmvc.com/docs.html#!jQuery.View

...