jquery .html () 대 .append ()


248

빈 div가 있다고 가정 해 보겠습니다.

<div id='myDiv'></div>

이거 :

$('#myDiv').html("<div id='mySecondDiv'></div>");

다음과 같습니다 :

var mySecondDiv=$("<div id='mySecondDiv'></div>");
$('#myDiv').append(mySecondDiv);

21
아니요, 두 번째 것은 ID가 없으므로 동일한 텍스트가 출력되지 않습니다.
매트 엘렌

.html은 처음 실행 한 후에 훨씬 빠릅니다. 처음 실행할 때 두 번째 정도 걸릴 수 있습니다.
sukhjit dhot

답변:


316

jQuery의 메소드에 HTML 문자열을 전달할 때마다 다음과 같은 상황이 발생합니다.

임시 요소가 만들어지면 x라고합시다. x innerHTML는 전달한 HTML 문자열로 설정됩니다. 그런 다음 jQuery는 생성 된 각 노드 (즉, x 's childNodes)를 새로 작성된 문서 조각으로 전송 한 후 다음에 캐시합니다. 그런 다음 조각을 childNodes새로운 DOM 컬렉션으로 반환합니다 .

jQuery는 여러 브라우저 간 검사 및 기타 다양한 최적화를 수행하므로 실제로는 그보다 훨씬 복잡합니다. 당신은 그냥 통과하면 예는 <div></div>하기 위해 jQuery(), jQuery를 바로 가기을 간단하게 할 것입니다 document.createElement('div').

편집 : jQuery가 수행하는 많은 양의 검사를 보려면 여기 , 여기여기를 살펴보십시오 .


innerHTML이다 일반적으로 당신은 모든 시간을 무엇을 지배하는 것을하지 않지만, 빠른 방법. jQuery의 접근 방식은 간단하지는 않습니다. element.innerHTML = ...앞에서 언급했듯이 확인 및 최적화가 많이 발생합니다.


올바른 기술은 상황에 따라 크게 다릅니다. 많은 수의 동일한 요소를 생성하려면 마지막 반복은 매번 반복 할 때마다 새 jQuery 객체를 생성하는 대규모 루프를 생성하는 것입니다. 예를 들어 jQuery로 100 div를 만드는 가장 빠른 방법 :

jQuery(Array(101).join('<div></div>'));

가독성 및 유지 관리 문제도 고려해야합니다.

이:

$('<div id="' + someID + '" class="foobar">' + content + '</div>');

... 이보다 유지하기가 훨씬 어렵습니다.

$('<div/>', {
    id: someID,
    className: 'foobar',
    html: content
});

5
jQuery (Array (101) .join ( '<div> </ div>')); <-왜 100 대신 101입니까?
tacone

2
데이터 포인트를 추가하고 싶었습니다. <li>의 큰 (10K +) 배치를 <ul>에로드하고 .append ( giantListHTMLAsASingleString)에서 .html (giantListHTMLAsASingleString)로 이미 'join'트릭을 수행하거나 목록에 큰 html 문자열을 작성하는 경우이 두 가지 방법에는 분명히 성능 차이가 있습니다.
omnisis

9
@tacone 결합 "접착제"가 배열 요소 사이 에 적용되기 때문 입니다. 1013 개의 요소를 결합하면 2 개의 접착제가있는 것처럼 100 개의 접착제가 적용됩니다 EL-glue-EL-glue-EL. James의 예에서 배열 요소는 "빈"이므로 N 개의 빈 요소를 결합하면 N-1 개의 연속 접착제가 생성됩니다.
Fabrício Matté

5
위에서 사용한 jquery 구문에 대한 참조와 허용되는 내용에 관심이있는 사람은 api.jquery.com/jquery/#jQuery-html-attributes를 참조하십시오 .
Thaddeus Albers

1
돔에 첨부 된 모든 데이터가 손실된다는 점에서 큰 차이가 있습니다.
Adrian Bartholomew

68

그들은 동일하지 않습니다. 첫 번째 다른 jQuery 객체를 먼저 만들지 않고 HTML을 대체 합니다. 두 번째는 두 번째 div에 대한 추가 jQuery 래퍼를 만든 다음 첫 번째 div에 추가 합니다.

하나의 jQuery 래퍼 (예 :) :

$("#myDiv").html('<div id="mySecondDiv"></div>');

$("#myDiv").append('<div id="mySecondDiv"></div>');

두 개의 jQuery 래퍼 (예 :) :

var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').html(mySecondDiv);

var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').append(mySecondDiv);

몇 가지 다른 사용 사례가 있습니다. 내용을 바꾸려면 .html의 상당 부분부터 호출하십시오 innerHTML = "...". 그러나 컨텐츠를 추가하려는 경우 추가 $()랩퍼 세트가 필요하지 않습니다.

div나중에 추가 한 내용을 조작해야하는 경우에는 두 개의 래퍼 만 사용하십시오 . 이 경우에도 여전히 하나만 사용해야 할 수도 있습니다.

var mySecondDiv = $("<div id='mySecondDiv'></div>").appendTo("#myDiv");
// other code here
mySecondDiv.hide();

알 겠어? 문자열 연결은 이미 여기에 오류가 발생했습니다 (이스케이프되지 않은 따옴표). 내 게시물보기 : P
kizzx2

20

에 의한 경우 .add당신은 의미 .append, 결과는 경우 동일 #myDiv비어 있습니다.

성능이 동일합니까? 몰라

.html(x) 결국 같은 일을 .empty().append(x)


또한 첫 번째 것에는 분명히 mySecondDiv의 ID가 있고 다른 하나에는 ID가 없습니다. 작은 따옴표를 사용하려면 구문은 큰 따옴표를 사용하는 .html ( "<div id = 'mySecondDiv'> </ div>")이어야합니다.
ryanulit 2016 년


7

두 번째 방법으로 다음과 같은 방법으로 동일한 효과를 얻을 수 있습니다.

var mySecondDiv = $('<div></div>');
$(mySecondDiv).find('div').attr('id', 'mySecondDiv');
$('#myDiv').append(mySecondDiv);

Luca는 html()HTML을 삽입하면 성능이 더 빨라진다 고 언급했습니다 .

그러나 어떤 경우에는 두 번째 옵션을 선택하십시오.

// Clumsy string concat, error prone
$('#myDiv').html("<div style='width:'" + myWidth + "'px'>Lorem ipsum</div>");

// Isn't this a lot cleaner? (though longer)
var newDiv = $('<div></div>');
$(newDiv).find('div').css('width', myWidth);
$('#myDiv').append(newDiv);

5
이것은 매우 비효율적이며 깨진 jQuery 코드입니다. 당신이 피하고 싶은 경우 연결이 작업을 수행 : (또한주의가 px필요하지 않습니다)$('<div />', { width: myWidth }).appendTo("#myDiv");
더그 Neiner

3
이것이 어떻게 "유용하지 않습니까"? 포스터는 "차이"(키워드는 "vs")를 요청하여 그 차이를 알려줍니다. 코드는 장황하지만 하나의 라이너가 아니라는 이유로 "비효율적"이라고 말하지는 않습니다. 사람들에게 물건을 설명 할 때 장황하지 않아야합니까?
kizzx2 2016 년

3

.html() 모든 것을 대체합니다.

.append() 끝에 추가됩니다.


2

주어진 답변 외에 다음과 같은 경우가 있습니다.

<div id="test">
    <input type="file" name="file0" onchange="changed()">
</div>
<script type="text/javascript">
    var isAllowed = true;
    function changed()
    {
        if (isAllowed)
        {
            var tmpHTML = $('#test').html();
            tmpHTML += "<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
            $('#test').html(tmpHTML);
            isAllowed = false;
        }
    }
</script>

즉, 파일이 업로드 된 경우 파일 업로드를 자동으로 하나 더 추가하려는 경우, 언급 된 코드가 작동하지 않습니다. 파일이 업로드 된 후 첫 번째 파일 업로드 요소가 다시 작성되므로 업로드 된 파일이 삭제됩니다. . 대신 .append ()를 사용해야합니다.

    function changed()
    {
        if (isAllowed)
        {
            var tmpHTML = "<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
            $('#test').append(tmpHTML);
            isAllowed = false;
        }
    }

0

이것은 나에게 일어났다. jquery 버전 : 3.3. 객체 목록을 반복하고 각 객체를 부모 dom 요소의 자식으로 추가하려는 경우 .html과 .append는 매우 다르게 작동합니다. .html마지막 요소 만 부모 요소에 .append추가하고 모든 목록 개체를 부모 요소의 자식으로 추가합니다.

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