jQuery를 사용하여 HTML 요소를 작성하는 가장 효율적인 방법은 무엇입니까?


425

최근에 나는 많은 모달 창 팝업을 수행하고 있었고 그렇지 않은 것은 jQuery를 사용했습니다. 페이지에서 새 요소를 만드는 데 사용한 방법은 다음과 같이 엄청나게 많습니다.

$("<div></div>");

그러나 이것이 최선의 방법이 아니라는 생각이 들었습니다. 성능 관점에서 jQuery에서 요소를 작성하는 가장 좋은 방법은 무엇입니까?

이 답변 에는 아래 제안에 대한 벤치 마크가 있습니다.


1
스타일도 제거해보고 속도가 빠른지 확인해보세요. CSS 응용 프로그램을 찾고 큰 페이지에서 가장 느리게 업데이트합니다.
CVertex

3
조기 최적화에주의하십시오. 한 번에 수백 개의 DOM 요소에 대해이 작업을 수행하지 않거나 매우 오래된 브라우저를 사용하는 경우 브라우저 성능에 차이가 없을 것입니다.
Blazemonger

1
@Blazemonger DOM 요소를 만드는 더 효율적인 방법이 필요 하지는 않았지만 대체 상황이 무엇이고 얼마나 효율적인지 숙고했습니다.
Darko Z

2
jQuery는 라이브러리입니다. 이러한 이유로 거의 항상 오버 헤드 성능 비용이 발생합니다. 통역사를 통해 누군가와 대화하는 것과 같습니다. 원시 JavaScript를 사용하지 않으려면 $ ( '<div>')를 작성하고 성능 적중을 수용하는 것이 얼마나 빠른지 활용하십시오.
Danny Bullis

1
jsben.ch/#/bgvCV <= 이 벤치 마크 는 귀하의 질문에 답변해야합니다
EscapeNetscape

답변:


307

$(document.createElement('div')); 벤치마킹을 사용 하면이 기술이 가장 빠릅니다. 나는 이것이 jQuery가 그것을 요소로 식별하고 요소 자체를 만들 필요가 없기 때문에 추측한다.

실제로 다른 자바 스크립트 엔진으로 벤치 마크를 실행하고 결과로 잠재 고객을 평가해야합니다. 거기에서 결정하십시오.


16
jQuery가 DOM에 "추가"합니까? 어디? 이것은 나에게별로 이해가되지 않습니다 .div는 어디로 갈까요?
strager

28
jquery에서 생성 된 div는 자바 스크립트와 마찬가지로 추가해야합니다. $ ( '<div>') 자체는 DOM을 무언가에 덧붙일 때까지 DOM에 첨부되지 않습니다.
Owen

6
@David-분명히 맞습니다. 나는 jQuery를 배우기 시작했을 때 약 2 년 전에 주석을 추가했음을 주목할 것입니다. 당신은 할 필요가 appendTo코멘트가 분명히 잘못했기 때문에, 내가 그들을 제거했습니다 ....
tvanfosson

16
벤치마킹 기준은 훌륭하지만 수만 개의 요소 생성을 테스트하고 있습니다. 일반적인 상황에서 언제 그 많은 요소를 다룰 것인가? 요소를 만드는 방법보다 걱정해야 할 것이 더 큽니다. document.createElement "0.097 초에 39,682 회 랭", $ ( '<div>') "0.068 초에 12,642 랭" 무언가가 1 초 안에 수천 번 달릴 수 있다면 안전합니다.
Danny Bullis

20
또한 $ (document.createElement ( 'div')); 여기저기서 한 번에 하나의 요소 만 만드는 경우 브라우저에서 얻을 수있는 실질적으로 적은 양의 혜택을 작성하는 데 시간이 오래 걸리기 때문에 효율성이 떨어집니다. 기술적으로, jQuery 자체는 조회 비용과 라이브러리를 사용함으로써 발생하는 오버 헤드 때문에 라이브러리로서 덜 효율적입니다. 누군가가 $ ( '<div>') 대신 document.createElement를 사용하여 소중한 천분의 1 밀리 초를 절약하려는 경우 $ ( '<div>') 때문에 jQuery :]를 사용해서는 안됩니다. 당신이 그것을 사용하는 이유 중 하나입니다!
Danny Bullis

163

개인적으로 (가독성을 위해) 제안하고 싶습니다.

$('<div>');

지금까지 제안에 대한 일부 숫자 (safari 3.2.1 / mac os x) :

var it = 50000;

var start = new Date().getTime();
for (i = 0; i < it; ++i)  {
  // test creation of an element 
  // see below statements
}
var end = new Date().getTime();
alert( end - start );                

var e = $( document.createElement('div') );  // ~300ms
var e = $('<div>');                          // ~3100ms
var e = $('<div></div>');                    // ~3200ms
var e = $('<div/>');                         // ~3500ms              

15
jquery 문서에서 : '단일 요소를 만들 때 닫는 태그 또는 XHTML 형식을 사용하십시오. 예를 들어 스팬을 만들려면 슬래시 / 태그를 닫지 않고 $ ( "<span />") 또는 $ ( "<span> </ span>")을 사용하십시오. '
tvanfosson

6
@Owen, 그 행동은 기능이 아니라 버그입니다. 쓰레기, 쓰레기-당신이 얻는 쓰레기가 받아 들여질 수 있습니다. 그러나 함수 사양이 변경되지 않는 한 jQuery 버전 간에는 의존하지 마십시오.
strager

2
예상대로 Mac OS X Chrome (createElement ()의 경우 100ms 대 텍스트 구문 분석의 경우 500ms) 및 Mac OS X Firefox (350ms 대 1000ms)에서 비슷한 숫자가 표시됩니다. 테스트 루프를 작성해 주셔서 감사합니다.
Annika Backstrom

3
@tvanfosson 이것은 현재 문서에서 분명히 변경되었습니다. "매개 변수에 단일 태그 (선택적인 닫기 태그 또는 빠른 닫기 포함)가있는 경우 — $ ("<img /> ") 또는 $ ("<img> " ), $ ( "<a> </a>") 또는 $ ( "<a>") — jQuery는 기본 JavaScript createElement () 함수를 사용하여 요소를 만듭니다. "
metatron

3
@MarcStober 공격이 없습니다. 그것은 여전히 여기 : http://api.jquery.com/jQuery/#jQuery2 . 문서에는 선택적인 닫는 태그 또는 빠른 닫힘에
metatron

155

질문:

jQuery를 사용하여 HTML 요소를 작성하는 가장 효율적인 방법은 무엇입니까?

대답:

그때 쯤에 jQuery(깨끗한) 접근 방식을 사용하는 것이 좋습니다.

$('<div/>', {
    'id':'myDiv',
    'class':'myClass',
    'text':'Text Only',
}).on('click', function(){
    alert(this.id); // myDiv
}).appendTo('body');

데모.

이런 식으로, 당신은 같은 특정 요소에 대한 이벤트 핸들러를 사용할 수 있습니다

$('<div/>', {
    'id':'myDiv',
    'class':'myClass',
    'style':'cursor:pointer;font-weight:bold;',
    'html':'<span>For HTML</span>',
    'click':function(){ alert(this.id) },
    'mouseenter':function(){ $(this).css('color', 'red'); },
    'mouseleave':function(){ $(this).css('color', 'black'); }
}).appendTo('body');

데모.

그러나 많은 동적 요소를 처리하는 경우 handlers특정 요소에 이벤트 를 추가하지 말고 대신 위임 된 이벤트 핸들러를 사용해야합니다.

$(document).on('click', '.myClass', function(){
    alert(this.innerHTML);
});

var i=1;
for(;i<=200;i++){
    $('<div/>', {
        'class':'myClass',
        'html':'<span>Element'+i+'</span>'
    }).appendTo('body');
}

데모.

따라서 동일한 클래스 (예 : ( myClass))로 수백 개의 요소를 생성하고 추가 하면 동적으로 삽입 된 모든 요소에 대해 하나의 핸들러 만 있으면 이벤트 처리에 더 적은 메모리가 사용됩니다.

업데이트 : 다음과 같은 접근 방식을 사용하여 동적 요소를 만들 수 있기 때문에

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    'size': '30'
}).appendTo("body");

그러나 size속성을 사용하여이 방법을 사용하여 설정할 수 없습니다 jQuery-1.8.0여기에 오래된 또는 이상 및 버그 보고서 에서, 모습 이 예를 사용하는 jQuery-1.7.2것을 보여주는 size속성이 설정되어 30예를 들어 위의 사용하지만 우리는 세트와 동일한 접근 방식을 수 없습니다 사용 size하여 속성을 jQuery-1.8.3여기에, A는 작동하지 않는 바이올린 . 따라서 size속성 을 설정하기 위해 다음 접근법을 사용할 수 있습니다

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    attr: { size: "30" }
}).appendTo("body");

아니면 이거

$('<input/>', {
    'type': 'Text',
    'value':'Some Text',
    prop: { size: "30" }
}).appendTo("body");

우리는 통과 할 수 attr/prop자식 개체로하지만 작동 jQuery-1.8.0 and later버전 확인 이 예제를 하지만 그것은 작동하지 않습니다 에서 jQuery-1.7.2 or earlier(모든 이전 버전에서 테스트하지).

jQuery버그 보고서 에서 가져온 BTW

몇 가지 솔루션이 있습니다. 첫 번째는 공간을 절약하지 않고 코드의 선명도를 향상시키기 때문에 전혀 사용하지 않는 것입니다.

그들은 다음과 같은 접근 방식을 사용하는 것이 좋습니다 ( 이전의 방법 에서도 작동하며에서 테스트 됨 1.6.4)

$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");

따라서이 접근법 인 IMO를 사용하는 것이 좋습니다. 이 업데이트는 내가 읽은 후 / 발견되어 이 답변 이 대답 쇼에서 당신이 사용하는 경우 'Size'(capital S)대신 'size'다음 것이다 단지 잘 작동 , 심지어에서version-2.0.2

$('<input>', {
    'type' : 'text',
    'Size' : '50', // size won't work
    'autofocus' : 'true'
}).appendTo('body');

또한 차이가 있기 때문에 prop 에 대해 읽어보십시오 Attributes vs. Properties. 버전에 따라 다릅니다.


이 $ ( '<div />', {.........})의 어떤 종류의 sintax가 있는지 찾았으며 $ ( '<div>)를 사용하여 비슷한 것을 발견했습니다. {......})?
라파엘 루이즈 Tabares

@RafaelRuizTabares, $('<div>', {...})모든 속성을 포함하는 객체를 전달하고 속성 $('<div>').attr({...})없이 요소를 생성하지만 attr()나중에 메소드를 사용하여 속성을 설정합니다 .
알파

@TheAlpha {} 안에 쓸 수있는 것에 대한 정보를 어디서 찾을 수 있습니까? 속성과 이벤트이지만 <div>의 경우 html도 사용합니다. 감사!
라파엘 루이즈 Tabares

검색 jQuery.com웹 사이트가 도움이 될 수 있습니다 @RafaelRuizTabares, 또는 구글 그것 :-)
The Alpha

2
이것은 훨씬 깨끗하고 읽기 쉬운 방법입니다! 아마도 빠른 방법은 아니지만 문자열 추가가 발생하기 쉬운 오류는 거의 없습니다. 감사합니다 @TheAlpha
Ares

37

실제로, 당신이하고있는 $('<div>')경우 jQuery도 사용 document.createElement()합니다.

( 117 행을 보십시오 ).

몇 가지 함수 호출 오버 헤드가 있지만 성능이 중요하지 않은 경우 (수백 개의 요소를 생성하는 경우) 일반 DOM 으로 되돌릴 이유가 없습니다 .

새로운 웹 페이지를위한 요소를 만드는 것만으로도 jQuery 방식 을 따르는 것이 가장 좋습니다 .


20

HTML 콘텐츠가 하나 뿐인 경우 (단일 div 이상) 숨겨진 컨테이너 내의 페이지에 HTML을 빌드 한 다음 업데이트하여 필요할 때 표시 할 수 있습니다. 이런 식으로, 브라우저에서 마크 업의 많은 부분을 미리 파싱 할 수 있으며 호출 될 때 JavaScript에 의해 혼란을 피할 수 있습니다. 도움이 되었기를 바랍니다!


충고 감사합니다. 나는이 접근법을 전에 사용했지만이 특별한 경우에는 특히 요소 생성에 대해 알고 싶습니다.
Darko Z

20

이것은 질문에 대한 정답은 아니지만 여전히 이것을 공유하고 싶습니다 ...

document.createElement('div')JQuery를 사용 하고 건너 뛰면 많은 요소를 즉시 만들고 DOM에 추가하려고 할 때 성능이 크게 향상됩니다.


16

최선의 방법을 사용하고 있다고 생각하지만 다음과 같이 최적화 할 수 있습니다.

 $("<div/>");

11

CPU의 관점에서 극히 드물게 수행되는 작업에서 원시 성능이 필요하지 않습니다.


얼마나 자주 수행하는지에 따라 다릅니다.
Rich Bradshaw

8
OP가 모달 팝업을 작성 중 입니다. 이 작업은 초당 수천 번 반복되지 않습니다. 대신, 최대 몇 초마다 한 번씩 반복됩니다. 이 jQuery(html :: String)방법을 사용하는 것은 완벽합니다. 상황이 매우 특이한 경우를 제외하고, 하나는 더 나은 달성 할 가능성이있을 것입니다 인식 성능을. 그것을 사용할 수있는 경우에 최적화 에너지를 사용하십시오. 또한 jQuery는 여러 가지 방법으로 속도에 최적화되어 있습니다. 그것으로 제정신의 일을하고 그것을 신뢰하지만 검증하십시오.
yfeldblum

9

jQuery를 처음 사용할 때는 요소 생성 성능의 중요성이 중요하지 않다는 것을 이해해야합니다.

실제로 사용하지 않는 한 요소를 작성하려는 실제 목적은 없습니다.

$(document.createElement('div'))vs $('<div>')와 같은 성능을 테스트하고 사용으로 큰 성능 향상을 원할 수도 $(document.createElement('div'))있지만 아직 DOM에없는 요소 일뿐입니다.

그러나 하루가 끝나면 어쨌든 요소를 ​​사용하여 실제 테스트에 f.ex가 포함되어야합니다. .appendTo ();

서로에 대해 다음을 테스트하면 볼 수 있습니다.

var e = $(document.createElement('div')).appendTo('#target');
var e = $('<div>').appendTo('#target');
var e = $('<div></div>').appendTo('#target');
var e = $('<div/>').appendTo('#target');

결과가 다를 수 있습니다. 때로는 한 가지 방법이 다른 방법보다 성능이 좋습니다. 이것은 컴퓨터의 백그라운드 작업 수가 시간이 지남에 따라 변경되기 때문입니다.

여기서 자신을 테스트

따라서 하루가 끝나면 요소를 만드는 가장 작고 읽기 쉬운 방법을 선택하려고합니다. 그렇게하면 최소한 스크립트 파일이 가장 작아집니다. DOM에서 요소를 사용하기 전에 요소를 작성하는 방법보다 성능 포인트에서 더 중요한 요소 일 수 있습니다.


나는 이것이 오래 document.getElementById('target).appendChild(document.createElement('div'));
되었다는


7

한 가지 요점은 수행하기가 더 쉽다는 것입니다.

$("<div class=foo id=bar style='color:white;bgcolor:blue;font-size:12pt'></div>")

그런 다음 jquery 호출로 모든 작업을 수행하십시오.


3

jquery.min v2.0.3 사용하고 있습니다. 다음을 사용하는 것이 좋습니다.

var select = jQuery("#selecter");
jQuery("`<option/>`",{value: someValue, text: someText}).appendTo(select);

다음과 같이 :

var select = jQuery("#selecter");
jQuery(document.createElement('option')).prop({value: someValue, text: someText}).appendTo(select);

첫 번째 코드의 처리 시간은 두 번째 코드보다 훨씬 낮습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.