jQuery document.createElement에 해당합니까?


1251

오래된 JavaScript 코드를 리팩터링하고 있으며 많은 DOM 조작이 진행 중입니다.

var d = document;
var odv = d.createElement("div");
odv.style.display = "none";
this.OuterDiv = odv;

var t = d.createElement("table");
t.cellSpacing = 0;
t.className = "text";
odv.appendChild(t);

jQuery를 사용하여 더 좋은 방법이 있는지 알고 싶습니다. 나는 실험하고있다 :

var odv = $.create("div");
$.append(odv);
// And many more

그러나 이것이 더 나은지 확실하지 않습니다.


jsben.ch/#/ARUtz-jquery 와 createElement의 벤치 마크
— EscapeNetscape 17시 03 분


잡히지 않은 TypeError : $ .create는 함수가 아닙니다
— Tyguy7

답변:


1290

다음은 "한 줄"의 예입니다.

this.$OuterDiv = $('<div></div>')
    .hide()
    .append($('<table></table>')
        .attr({ cellSpacing : 0 })
        .addClass("text")
    )
;

업데이트 : 나는 여전히 약간의 트래픽을 받기 때문에이 게시물을 업데이트 할 것이라고 생각했습니다. 아래 주석에는 새로운 요소를 만드는 방법에 대한 $("<div>")vs $("<div></div>")vs 에 대한 토론 $(document.createElement('div'))이 있으며 "최고"입니다.

내가 함께 넣어 작은 벤치 마크를 위의 옵션을 10 회 반복의 대략 결과 여기에, 그리고 :

jQuery 1.4, 1.5, 1.6

               Chrome 11  Firefox 4   IE9
<div>            440ms      640ms    460ms
<div></div>      420ms      650ms    480ms
createElement    100ms      180ms    300ms

jQuery 1.3

                Chrome 11
<div>             770ms
<div></div>      3800ms
createElement     100ms

jQuery 1.2

                Chrome 11
<div>            3500ms
<div></div>      3500ms
createElement     100ms

나는 그것이 놀랍지 않다고 생각하지만 document.createElement가장 빠른 방법입니다. 물론 전체 코드베이스에서 리팩토링을 시작하기 전에 여기에서 이야기하는 차이점 (jQuery의 모든 고풍 버전 제외)은 천 요소 당 약 3 밀리 초와 동일하다는 것을 기억하십시오 .


업데이트 2

jQuery 1.7.2로 업데이트 되었고 JSBen.ch기본 벤치 마크보다 약간 더 과학적인 벤치 마크를 추가했으며 지금은 크라우드 소싱이 가능합니다!

http://jsben.ch/#/ARUtz


70
jQuery가 html 문자열을 요소로 변환하는 것보다 document.createElement가 훨씬 빠릅니다. (일을 더 효율적으로 만들고 싶은 충동이있는 경우)
— Sugendran

25
그것은 jQuery <1.3의 경우에 해당합니다. 지금은 속도와 같습니다.
— Rob Stevenson-Leggett

15
@Kevin, 그것은 사실이지만 jQuery가 더 많은 작업을 수행하도록합니다 (닫는 태그를 추가하기 위해 정규 표현식을 통해 실행). 위의 방법을 선호합니다. 또한 코드 $('div')가 시각적으로 매우 유사하지만 기능적으로 극점을 구분합니다.
— nickf February

14
기본적으로 @Sungendran과 @nickf의 조합이 $(document.createElement('div'))가장 빠를까요?
— Kolky

14
"올바른"방법은 $ ( '<div />')이며, IMO는 훨씬 더 "의미있는"방법을 가지고 있다고 생각합니다. 나쁜 점은 이런 식으로 모든 편집기에서 구문 강조를 중단한다는 것입니다. = (
— Erik Escobedo

139

jQuery 생성자에 추가하려는 요소의 HTML을 제공하면 $()jQuery의 append()메소드를 사용하여 DOM에 추가하기에 적합한 새로 작성된 HTML에서 jQuery 객체를 반환합니다 .

예를 들면 다음과 같습니다.

var t = $("<table cellspacing='0' class='text'></table>");
$.append(t);

원하는 경우이 테이블을 프로그래밍 방식으로 채울 수 있습니다.

이것은 당신이 사용하는 것보다 더 간결을 찾을 수있는 클래스 이름이나 다른 속성을 포함하여 당신이 좋아하는 임의의 HTML, 지정할 수 있습니다 createElement다음과 같은 속성을 설정 cellSpacing및 classNameJS를 통해입니다.


7
어쩌면 이것은 명백하고 귀하의 예에서 알 수 있지만 $ ( "<html string>") 구문을 사용하여 jQuery DOM 요소를 작성하는 것은 기본 <element> .appendChild 메소드를 사용하여 DOM에 추가 할 수 없습니다. jQuery 추가 메소드를 사용해야합니다.
— Adam

4
$(htmlStr)로 구현됩니다 document.createElement("div").innerHTML = htmlStr. 즉, 브라우저의 HTML 파서를 호출합니다. 잘못된 HTML은 IE에서 다른 브라우저와 다르게 작동합니다.
— Matthew

2
@Adam jQuery 객체에는 get기본 DOM 요소를 반환하는 함수가 있습니다. (이 주제는 오래
— 되었다는

1
당신은 그것을 구문 분석 할 수있는 HTML 문자열 시도에 문제가있는 경우 jQuery.parseHTML
— fguillen

1
@Adam 또는 코드 흐름 / 눈이 [dom element].appendChild($('<html>')[0]);
— 편한


49

나는 그렇게하고있다 :

$('<div/>',{
    text: 'Div text',
    class: 'className'
}).appendTo('#parentDiv');

44

을 jQuery1.8사용 $.parseHTML()하여 요소를 만드는 것이 더 나은 선택입니다.

두 가지 이점이 있습니다.

1. 이전과 같은 방식을 사용하는 $(string)경우 jQuery는 문자열을 검사하여 html 태그를 선택하거나 새 요소를 생성하는지 확인합니다. 을 사용 $.parseHTML()하면 jQuery에 새 요소를 명시 적으로 작성하려고하므로 성능이 약간 향상 될 수 있습니다.

2. 훨씬 더 중요한 것은 이전 방식을 사용하는 경우 교차 사이트 공격 ( 추가 정보 )으로 고통받을 수 있다는 것입니다 . 당신이 같은 것을 가지고 있다면 :

    var userInput = window.prompt("please enter selector");
    $(userInput).hide();

나쁜 사람이 <script src="xss-attach.js"></script>당신을 놀리기 위해 입력 할 수 있습니다. 다행스럽게도이 $.parseHTML()난처함을 피하십시오.

var a = $('<div>')
// a is [<div>​</div>​]
var b = $.parseHTML('<div>')
// b is [<div>​</div>​]
$('<script src="xss-attach.js"></script>')
// jQuery returns [<script src=​"xss-attach.js">​</script>​]
$.parseHTML('<script src="xss-attach.js"></script>')
// jQuery returns []

그러나 ajQuery 객체 인 반면 bhtml 요소는 다음과 같습니다.

a.html('123')
// [<div>​123​</div>​]
b.html('123')
// TypeError: Object [object HTMLDivElement] has no method 'html'
$(b).html('123')
// [<div>​123​</div>​]

"[모든] 요소 생성"에 대한 "더 나은 선택"은 강력 할 수 있습니다. @siergiej의 대답 은 parseHTML외부 소스에서 나오는 html에 좋지만 " 새 jQuery 객체로 결과를 래핑 한 후 모든 부스트가 사라졌습니다 " 라고 말하는 것이 좋습니다 . 즉, 새로운 jQuery-wrapped html 요소의 생성을 하드 코딩하려는 경우 $("<div>stuff</div>")스타일이 여전히 이길 것 같습니다.
— ruffin

38

최신 정보

최신 버전의 jQuery부터 다음 메소드는 두 번째 Object에 전달 된 속성을 할당하지 않습니다.

이전 답변

내가 사용하는 느낌 document.createElement('div')과 함께을 jQuery빠르게 :

$(document.createElement('div'), {
    text: 'Div text',
    'class': 'className'
}).appendTo('#parentDiv');

29

이것은 매우 오래된 질문이지만 최근 정보로 업데이트하는 것이 좋을 것이라고 생각했습니다.

jQuery 1.8부터 jQuery.parseHTML () 함수가 있는데, 이는 현재 요소를 작성하는 기본 방법입니다. 또한 $('(html code goes here)')공식 jQuery 웹 사이트 의 릴리스 노트 중 하나 에서 다음을 언급하는 HTML을 통해 HTML을 구문 분석하는 데 문제가 있습니다 .

편안한 HTML 구문 분석 : $ (htmlString)에서 태그 앞에 선행 공백이나 줄 바꾸기를 다시 사용할 수 있습니다. 외부 소스에서 얻은 HTML을 구문 분석 할 때 $ .parseHTML ()을 사용하는 것이 좋습니다. 향후 HTML 구문 분석을 추가로 변경할 수 있습니다.

실제 질문과 관련하여 제공된 예제는 다음과 같이 번역 될 수 있습니다.

this.$OuterDiv = $($.parseHTML('<div></div>'))
    .hide()
    .append($($.parseHTML('<table></table>'))
        .attr({ cellSpacing : 0 })
        .addClass("text")
    )
;

불행히도 just 사용하는 것보다 편리 $()하지는 않지만 더 많은 제어 기능을 제공합니다. 예를 들어 스크립트 태그를 제외하도록 선택할 수 있습니다 (인라인 스크립트는 그대로 둡니다 onclick).

> $.parseHTML('<div onclick="a"></div><script></script>')
[<div onclick=​"a">​</div>​]

> $.parseHTML('<div onclick="a"></div><script></script>', document, true)
[<div onclick=​"a">​</div>​, <script>​</script>​]

또한 다음은 새로운 현실에 맞게 조정 된 최상위 답변의 벤치 마크입니다.

JSbin 링크

jQuery 1.9.1

  $ .parseHTML : 88ms
  $ ($. parseHTML) : 240ms
  <div> </ div> : 138ms
  <div> : 143ms
  createElement : 64ms

보다 parseHTML훨씬 더 가까운 것처럼 보이지만 결과를 새로운 jQuery 객체로 래핑하면 모든 부스트가 사라집니다.createElement$()



6
var div = $('<div/>');
div.append('Hello World!');

jQuery에서 DIV 요소를 만드는 가장 짧고 쉬운 방법입니다.


5

방금 작은 jQuery 플러그인을 만들었습니다 : https://github.com/ern0/jquery.create

그것은 당신의 문법을 따릅니다 :

var myDiv = $.create("div");

DOM 노드 ID는 두 번째 매개 변수로 지정할 수 있습니다.

var secondItem = $.create("div","item2");

심각합니까? 아니요. 그러나이 구문은 $ ( "<div> </ div>") . 이는 그 돈에 매우 가치가 있습니다.

비슷한 기능을 가진 DOMAssistant에서 전환하는 새로운 jQuery 사용자입니다. http://www.domassistant.com/documentation/DOMAssistantContent-module.php

플러그인이 더 간단합니다. 연결 방법으로 attrs 및 내용을 추가하는 것이 좋습니다.

$("#container").append( $.create("div").addClass("box").html("Hello, world!") );

또한 간단한 jQuery 플러그인 (100 번째)에 대한 좋은 예입니다.


4

모두 매우 간단합니다! 여기 몇 가지 간단한 예가 있습니다 ...


var $example = $( XMLDocRoot );

var $element = $( $example[0].createElement('tag') );
// Note the [0], which is the root

$element.attr({
id: '1',
hello: 'world'
});

var $example.find('parent > child').append( $element );

1

이전 답변에서 언급되지 않았으므로 최신 jQuery를 사용하여 요소 요소를 만드는 방법과 콘텐츠, 클래스 또는 onclick 콜백과 같은 추가 속성을 사용하는 예제를 추가하고 있습니다.

const mountpoint = 'https://jsonplaceholder.typicode.com/users'

const $button = $('button')
const $tbody = $('tbody')

const loadAndRender = () => {
  $.getJSON(mountpoint).then(data => {

    $.each(data, (index, { id, username, name, email }) => {
      let row = $('<tr>')
        .append($('<td>', { text: id }))
        .append($('<td>', {
          text: username,
          class: 'click-me',
          on: {
            click: _ => {
              console.log(name)
            }
          }
        }))
        .append($('<td>', { text: email }))

      $tbody.append(row)
    })

  })
}

$button.on('click', loadAndRender)
.click-me {
  background-color: lightgrey
}
<table style="width: 100%">
  <thead>
    <tr>
      <th>ID</th>
      <th>Username</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>
  
  </tbody>
</table>

<button>Load and render</button>

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>


-2

기본 jQuery에는 createElement와 동일한 기능이 없습니다. 실제로 jQuery 작업의 대부분은 순수한 DOM 조작보다 innerHTML을 사용하여 내부적으로 수행됩니다. Adam이 위에서 언급 한 것처럼 유사한 결과를 얻을 수있는 방법입니다.

appendDOM , DOMEC 및 FlyDOM 과 같이 innerHTML을 통해 DOM을 사용하는 플러그인도 있습니다 . 성능면에서 네이티브 jquery는 여전히 가장 성능이 뛰어납니다 (주로 innerHTML을 사용하기 때문에)


5
최신 상태 여야합니다. jQuery는 innerHtml을 사용하지 않지만 HTML 문자열을 구문 분석하고 document.createElement ()를 사용하여 DOM 트리를 내부적으로 빌드합니다. 이것이 핵심 jQuery입니다.
— Vincent Robert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.