programing

jQuery에서 html 요소를 만드는 가장 명확한 방법

telebox 2023. 10. 9. 22:30
반응형

jQuery에서 html 요소를 만드는 가장 명확한 방법

저는 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);

그 밖에 사용할 수 있는 방법이나 스타일을 자유롭게 설명해 주시기 바랍니다.

템플릿은 훌륭하며 프로젝트에서 템플릿에 접근할 수 있는 경우 사용할 것을 제안합니다.언더스코어 또는 로다시를 사용하는 경우 내장되어 있습니다.그러나 리팩토링이든 테스트이든 간에 코드에 HTML을 작성해야 하는 경우도 있습니다.그것이 요구사항일 때 아래 서식이 읽기에 가장 명확하다는 것을 알았습니다.

참고: HTML 사양은 마크업에서 속성에 대해 단일 OR 두 개의 따옴표를 허용하므로 모든 미친 듯이 빠져나가지 마십시오.

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"));

한참을 둘러본 끝에 드디어 마음에 드는 스타일을 찾았습니다.일단 제가 콧수염을 사용해서 템플릿을 만들었는데 효과가 좋았습니다.하지만 때로는 재사용하지 않고 한 번만 요소를 구축하거나 다른 라이브러리를 도입하지 않는 다른 동기를 갖기만 하면 됩니다.이런 상황에서 다음을 사용하게 되었습니다.

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

은 이기 가 있습니다.append()연결된 개체에 대한 참조를 반환합니다.append()동일한 개체에 부착합니다.적절한 들여쓰기를 사용하면 마크업의 구조가 명확하며, 이렇게 하면 수정하기 쉽습니다.물론 템플릿을 사용하는 것보다 느리지만(전체를 하나씩 구축해야 함) 초기화나 이와 유사한 작업에만 사용하는 경우에는 큰 타협점이 됩니다.

이런 구조물을 포맷할 수 있는 방법은 여러 가지가 있지만, 저는 상황을 분명히 하기 위해 선택했습니다.제가 사용한 규칙은 각 선에 최대 하나의 여는 괄호와 하나의 닫는 괄호가 있어야 한다는 것입니다.또한 이 부록 트리의 잎은 jQuery constructor에게 전달할 필요가 없지만 시각적 반복을 위해 여기서 수행했습니다.

DOM building에 관해서는 문자열 연결이 미묘한 버그와 제대로 인코딩되지 않은 출력을 초래할 수 있기 때문에 이를 피하려고 합니다.

나는 이것이 좋습니다.

$('<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 tree building을 위해 일치하는 열림과 닫힘 태그가 일치합니다.

나의 충고: jQuery로 html 요소를 만들려고 하지 마세요. 그것은 그것의 책임이 아닙니다.

콧수염이나 핸들바J와 같은 자바스크립트 템플릿 시스템을 사용합니다.

매우 제한된 수의 행을 사용하여 자바스크립트 객체에서 직접 html 요소를 만들 수 있습니다.복잡하지 않고 두 가지 기능과 템플릿만 있습니다.

<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);

편집:
html, 순수 자바스크립트가 없는 또 다른 예 (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);

이것은 일련의 연결보다 훨씬 더 유지보수성이 뛰어납니다.

2015년 답변:

ES6의 경우 JavaScript 템플릿 문자열을 사용합니다.

var str = `
<!doctype html>
<html>
    <body>
        <h1>❤ unicorns</h1>
    </body>
</html>`

이전 브라우저의 경우 다중 줄을 사용합니다.

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

이것은 베어의 대답을 각색한 것입니다.읽기 쉽고, 배열을 생성하고 참여할 필요가 없으며, 모든 행에 인용문을 붙일 필요가 없습니다.

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 )

참고로, 성능이 문제가 되지 않고 요소에 동적 데이터가 많이 포함되어 있을 때, 저는 가끔 이렇게 코드를 씁니다. 폐쇄 컴파일러는 인용되지 않은 클래스 속성에 대해 경고를 보내지만, 현대 브라우저에서는 잘 작동합니다.

$(
      '<a></a>'

    , {
           text     : this.fileName
         , href     : this.fileUrl
         , target   : '_blank'
         , class    : 'file-link'
         , appendTo : this.container
      }
)

$(htmlString)을 사용하고 HTML 코드의 표준 레이아웃을 모방하는 예는 다음과 같습니다.

function getPage(title, contents) {
  return (
    $("<div>", {id: "container", class: "box"}).append(
      $("<div>", {class: "title"}).append(
        $("<h1>").text(title)
      ),
      $("<div>").html(contents)
    )
  );
}

javascript view 템플릿을 확인할 수 있습니다.

http://embeddedjs.com/

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

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

저는 기능적 접근이 매우 편리하다고 생각합니다.예를 들어.

// 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>

편집하다

이제 html_uty.js와 같은 접근 방식을 개선했습니다.

백틱을 이용한 가장 간단한 방법은

var optionsForLength =  `
    <option value="Kilometre">Kilometre</option>
    <option value="Metre">Metre</option>
    <option value="Centimetre">Centimetre</option>
    <option value="Milimetre">Milimetre</option>
    <option value="Micrometre">Micrometre</option>
    <option value="Nanometre">Nanometre</option>
    <option value="Mile">Mile</option>
    <option value="Yard">Yard</option>
    <option value="Foot">Foot</option>
    <option value="Inch">Inch</option>
`;

또는 작은 따옴표를 사용하여 HTML을 자바스크립트 안에 래핑할 수도 있습니다.

var optionsForLength = 
'<option value="Kilometre">Kilometre</option>'+
'<option value="Metre">Metre</option>'+
'<option value="Centimetre">Centimetre</option>'+
'<option value="Milimetre">Milimetre</option>'+
'<option value="Micrometre">Micrometre</option>'+
'<option value="Nanometre">Nanometre</option>'+
'<option value="Mile">Mile</option>'+
'<option value="Yard">Yard</option>'+
'<option value="Foot">Foot</option>'+
'<option value="Inch">Inch</option>'+
'<option value="Nautical mile">Nautical mile</option>';

언급URL : https://stackoverflow.com/questions/9760328/clearest-way-to-build-html-elements-in-jquery

반응형