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
ไม่ข้อความที่สองไม่มีรหัสดังนั้นข้อความเดียวกันจะไม่ถูกส่งออก
Matt Ellen

.html เร็วขึ้นมากหลังจากที่คุณเรียกใช้ครั้งแรก อาจใช้เวลาประมาณวินาทีหรือมากกว่านั้นเมื่อคุณเรียกใช้ครั้งแรก
sukhjit dhot

คำตอบ:


316

เมื่อใดก็ตามที่คุณส่งสตริง HTML ไปยังวิธีการใด ๆ ของ jQuery สิ่งนี้จะเกิดขึ้น:

มีการสร้างองค์ประกอบชั่วคราวลองเรียกมันว่า x x's innerHTMLถูกตั้งค่าเป็นสตริงของ HTML ที่คุณส่งผ่าน จากนั้น jQuery จะถ่ายโอนแต่ละโหนดที่ผลิต (นั่นคือ x's childNodes) ไปยังส่วนเอกสารที่สร้างขึ้นใหม่ซึ่งจะทำการแคชในครั้งต่อไป จากนั้นจะส่งคืนแฟรกเมนต์childNodesเป็นคอลเล็กชัน DOM ใหม่

โปรดทราบว่าจริงๆแล้วมันซับซ้อนกว่านั้นมากเนื่องจาก jQuery ทำการตรวจสอบข้ามเบราว์เซอร์และการเพิ่มประสิทธิภาพอื่น ๆ อีกมากมาย เช่นถ้าคุณผ่านเพียง<div></div>เพื่อjQuery(), jQuery document.createElement('div')จะใช้ทางลัดและก็ทำ

แก้ไข : หากต้องการดูปริมาณที่แท้จริงของการตรวจสอบว่า jQuery ดำเนินการได้ดูที่นี่ , ที่นี่และที่นี่


innerHTMLคือโดยทั่วไปวิธีการได้เร็วขึ้นแม้ว่าจะไม่ปล่อยให้ที่ควบคุมสิ่งที่คุณทำอยู่ตลอดเวลา วิธีการของ jQuery นั้นไม่ง่ายเหมือนelement.innerHTML = ...ที่ฉันพูดถึงมีการตรวจสอบและการเพิ่มประสิทธิภาพที่เกิดขึ้นมากมาย


เทคนิคที่ถูกต้องขึ้นอยู่กับสถานการณ์อย่างมาก หากคุณต้องการสร้างองค์ประกอบที่เหมือนกันจำนวนมากสิ่งสุดท้ายที่คุณต้องการคือสร้างลูปขนาดใหญ่สร้างวัตถุ jQuery ใหม่ในทุกการวนซ้ำ เช่นวิธีที่เร็วที่สุดในการสร้าง 100 div ด้วย jQuery:

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

นอกจากนี้ยังมีประเด็นเรื่องความสามารถในการอ่านและการบำรุงรักษาที่คำนึงถึง

นี้:

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

... มีมากยากที่จะรักษากว่านี้:

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

5
jQuery (อาร์เรย์ (101) .join ( '<div> </ div>')); <- เพราะเหตุใดจึงเป็น 101 แทนที่จะเป็น 100
tacone

2
แค่ต้องการเพิ่มดาต้าพอยท์ ทำการทดสอบประสิทธิภาพในแอปที่โหลดชุดใหญ่ (10K +) ที่ <li> ลงใน <ul> และเห็นการเพิ่มขึ้นของเวลาการเรนเดอร์ (ไม่โหลด) จาก ~ 12s -> .25s โดยการสลับ. append ( GiantListHTMLAASingleString) เป็น. html (GiantListHTMLAsASingleString) หากคุณกำลังทำเคล็ดลับ 'เข้าร่วม' หรือสร้างสตริง html ขนาดใหญ่ในรายการของคุณมีวิธีที่แตกต่างกันสองวิธีนี้
omnisis

9
@tacone เนื่องจากมีการใช้ "กาว" เข้าร่วมระหว่างองค์ประกอบของอาร์เรย์ 101จะมี 100 กาวนำมาใช้เช่นเดียวกับการเข้าร่วม 3 องค์ประกอบจะมี 2 EL-glue-EL-glue-ELกาว: ในตัวอย่างของ James องค์ประกอบของอาร์เรย์คือ "empty" ดังนั้นการเข้าร่วม N องค์ประกอบที่ว่างเปล่าส่งผลให้กาว N-1 ติดกัน
FabrícioMatté

5
สำหรับผู้ที่สนใจในการอ้างอิงสำหรับไวยากรณ์ jQuery สินค้าด้านบนและสิ่งที่ได้รับอนุญาตให้ดูapi.jquery.com/jquery/#jQuery-html-attributes
แธดเดียส Albers

1
มีความแตกต่างอย่างมากในการที่จะสูญเสียข้อมูลใด ๆ ที่แนบมากับ doms
Adrian Bartholomew

68

พวกเขาไม่เหมือนกัน อันแรกแทนที่ HTML โดยไม่ต้องสร้างวัตถุ jQuery อื่นก่อน ตัวที่สองสร้างตัวเสริม jQuery เพิ่มเติมสำหรับ div ตัวที่สองจากนั้นต่อท้ายส่วนแรก

หนึ่ง jQuery Wrapper (ต่อตัวอย่าง):

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

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

สอง jQuery Wrappers (ต่อตัวอย่าง):

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

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

คุณมีกรณีการใช้งานที่แตกต่างกันเกิดขึ้น หากคุณต้องการที่จะเปลี่ยนเนื้อหาเป็นสายที่ดีตั้งแต่เทียบเท่าของ.html innerHTML = "..."อย่างไรก็ตามหากคุณต้องการเพิ่มเนื้อหาชุดเสริมพิเศษ$()จะไม่จำเป็น

ใช้สอง wrappers เท่านั้นหากคุณต้องการจัดการเพิ่มใน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)


นอกจากนี้อันแรกจะเห็นได้ชัดว่ามี id ของ mySecondDiv ในขณะที่อีกอันจะไม่มี id อยู่ และไวยากรณ์จะต้องเป็น. html ("<div id = 'mySecondDiv'> </div>") โดยใช้เครื่องหมายคำพูดคู่เพื่อให้สามารถใช้เครื่องหมายคำพูดเดี่ยวได้
ryanulit


7

คุณสามารถใช้วิธีที่สองเพื่อให้ได้ผลเหมือนกันโดย:

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

Luca กล่าวว่าhtml()เพียงแค่แทรก hte 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");
Doug Neiner

3
สิ่งนี้ "ไม่มีประโยชน์" อย่างไร ผู้โพสต์ถามถึง "ความแตกต่าง" (คำหลักคือ "vs") ดังนั้นฉันจึงบอกความแตกต่าง รหัสนั้น verbose แต่ฉันจะไม่พูดว่า "ไม่มีประสิทธิภาพ" เพียงเพราะความจริงที่ว่ามันไม่ได้เป็นหนึ่งซับ เราไม่ควรพูดอย่างละเอียดเมื่ออธิบายสิ่งของให้ผู้คนฟัง?
kizzx2


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 หากคุณวนลูปผ่านรายการวัตถุและต้องการเพิ่มแต่ละวัตถุเป็นลูกขององค์ประกอบพาเรนต์บางส่วนดังนั้น. html และ. ผนวกจะทำงานแตกต่างกันมาก .htmlจะลงเอยด้วยการเพิ่มเฉพาะวัตถุสุดท้ายไปยังองค์ประกอบหลักในขณะที่.appendจะเพิ่มวัตถุรายการทั้งหมดเป็นรายการลูกขององค์ประกอบหลัก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.