คำถาม:
วิธีที่มีประสิทธิภาพที่สุดในการสร้างองค์ประกอบ HTML โดยใช้ jQuery คืออะไร
ตอบ:
เนื่องจากมันเกี่ยวกับ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
ได้ที่นี่ เป็นซอไม่ทำงาน ดังนั้นเพื่อตั้งค่า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
(ไม่ได้ทดสอบในทุกรุ่นก่อนหน้า)
BTW นำมาจากjQuery
รายงานข้อผิดพลาด
มีหลายวิธี สิ่งแรกคืออย่าใช้งานเลยเพราะมันไม่ได้ช่วยให้คุณประหยัดพื้นที่และนี่ช่วยปรับปรุงความชัดเจนของรหัส:
พวกเขาแนะนำให้ใช้วิธีการต่อไปนี้ ( ทำงานในวิธีก่อนหน้าเช่นกันทดสอบด้วย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');
อ่านเกี่ยวกับเสาเพราะมีความแตกต่างกันAttributes vs. Properties
มันแตกต่างกันไปตามรุ่น