วิธีที่ต้องการในการสร้างองค์ประกอบใหม่ด้วย jQuery


227

ฉันมี 2 วิธีที่ฉันสามารถสร้างการ<div>ใช้งานjQueryได้

ทั้ง:

var div = $("<div></div>");
$("#box").append(div);

หรือ:

$("#box").append("<div></div>");

อะไรคือข้อเสียของการใช้วิธีที่สองนอกเหนือจากการใช้งานซ้ำอีกครั้ง?


8
มันเป็นเพียงเรื่องของการใช้ซ้ำ การโทรของคุณ
Roko C. Buljan

@ gdoron โดยการนำกลับมาใช้ใหม่ฉันหมายถึง: หากคุณมีองค์ประกอบอยู่ภายในตัวแปรกว่าที่คุณสามารถเรียก var นั้นได้ทุกที่ที่คุณต้องการเหมือนในตัวอย่างของคุณ
Roko C. Buljan

2
ทำไม.htmlแต่ไม่ใช่.appendในกรณีที่ 2?
วิศวกร

@Engineer - ขออภัยนั่นเป็นข้อผิดพลาดที่นี่ ฉันแก้ไขมัน
Ashwin

ฉันคิดว่าวิธีหลังนั้นเร็วกว่าในแง่ของการประมวลผลความเร็ว แต่อันแรกดูเหมือนว่า (10% ~ 40%) เร็วกว่า: jsperf.com/jquery-append-string-vs-append-jquery-reference
Fabrizio Calderan

คำตอบ:


339

ตัวเลือกแรกให้ความยืดหยุ่นแก่คุณมากกว่า:

var $div = $("<div>", {id: "foo", "class": "a"});
$div.click(function(){ /* ... */ });
$("#box").append($div);

และแน่นอน.html('*')แทนที่เนื้อหาในขณะที่.append('*')ไม่ แต่ฉันเดาว่านี่ไม่ใช่คำถามของคุณ

แนวทางปฏิบัติที่ดีอีกวิธีหนึ่งคือการเติมตัวแปร jQuery ของคุณด้วย$:
มีเหตุผลใดบ้างที่อยู่เบื้องหลังการใช้ $ กับตัวแปรใน jQuery

การใส่เครื่องหมายคำพูดรอบ ๆ"class"ชื่อคุณสมบัติจะทำให้เข้ากันได้กับเบราว์เซอร์ที่มีความยืดหยุ่นน้อยลง


10
แนวทางที่ดีในการเริ่มต้นชื่อคอลเลกชัน jQuery ด้วย " $" ในความคิดของฉัน เพิ่งสังเกตว่าสิ่งที่คุณทำไม่ได้ต้องการ$div:$("<div>", {id: 'foo', class: 'a', click: function () {}}).appendTo("#box");
ยาระเบิดใน

สัญญาณดอลลาร์เหล่านั้นจำเป็นหรือพิมพ์ผิดหรือไม่? $div. ฉันไม่เคยเห็นรูปแบบนั้นมาก่อน แต่ฉันใหม่กับ Jquery
felwithe

ฉันมักจะใช้ $ เป็นตัวแปรเป็นวัตถุ jquery, $ _ ถ้ามันเป็นคอลเลกชัน jQuery และ _var ถ้ามันเป็นเคาน์เตอร์ var สำหรับตัวแปรปกติ
Casey

1
เอกสารสำหรับวิธีการสร้างองค์ประกอบนี้อยู่ที่ไหน $("<div>", {id: "foo", class: "a"});. ฉันต้องการทราบว่ามีตัวเลือกอื่นสำหรับมันไหม
Saba Ahang

@ gdoron โปรดดูที่คำถามของฉันstackoverflow.com/questions/35413044/…
คง

74

โดยส่วนตัวฉันคิดว่ามันสำคัญกว่าสำหรับรหัสที่จะอ่านและแก้ไขได้มากกว่านักแสดง ไม่ว่าคุณจะมองดูแบบใดง่ายกว่าและควรเป็นตัวเลือกที่คุณเลือกสำหรับปัจจัยด้านบน คุณสามารถเขียนมันเป็น:

$('#box').append(
  $('<div/>')
    .attr("id", "newDiv1")
    .addClass("newDiv purple bloated")
    .append("<span/>")
      .text("hello world")
);

และวิธีแรกของคุณเป็น:

// create an element with an object literal, defining properties
var $e = $("<div>", {id: "newDiv1", name: 'test', class: "aClass"});
$e.click(function(){ /* ... */ });
// add the element to the body
$("#box").append($e);

แต่เท่าที่อ่านไป; วิธีการ jQuery เป็นที่ชื่นชอบ ทำตามเคล็ดลับ jQuery ที่เป็นประโยชน์นี้บันทึกและแนวทางปฏิบัติที่ดีที่สุด


ขอบคุณสำหรับการเชื่อมโยงไปยังที่อ้างอิง jQuery ในการสร้างองค์ประกอบ Google ยากที่จะทำเช่นนั้น
Bob Stein

ทำได้ดีกว่าเช่น: stackoverflow.com/a/43719563/383904
Roko C. Buljan

25

วิธีแสดงออกมากขึ้น

jQuery('<div/>', {
    "id": 'foo',
    "name": 'mainDiv',
    "class": 'wrapper',
    "click": function() {
      jQuery(this).toggleClass("test");
    }}).appendTo('selector');

เอกสารอ้างอิง: เอกสาร


4
classควรอยู่ในเครื่องหมายคำพูดอ้างอิงจากเอกสาร (ผ่านลิงก์เอกสารด้านบน): "ชื่อ" คลาส "จะต้องอ้างอิงในวัตถุเนื่องจากเป็นคำที่สงวนไว้ของ JavaScript และไม่สามารถใช้" className "ได้เนื่องจากอ้างถึงคุณสมบัติ DOM ไม่ใช่แอตทริบิวต์ "
Isaac Gregson

5

ตามเอกสารอย่างเป็นทางการของ jQuery

เพื่อสร้างองค์ประกอบ HTML $("<div/>")หรือ$("<div></div>")เป็นที่ต้องการ

แล้วคุณสามารถใช้อย่างใดอย่างหนึ่งappendTo, append, before, afterและอื่น ๆ ,. เพื่อแทรกองค์ประกอบใหม่ไปยัง DOM

PS: jQuery เวอร์ชัน 1.11.x


2

ตามเอกสารประกอบสำหรับ3.4เป็นที่ต้องการใช้แอตทริบิวต์กับattr()เมธอด

$('<div></div>').attr(
  {
    id: 'some dynanmic|static id',
    "class": 'some dynanmic|static class'
  }
).click(function() {
  $( "span", this ).addClass( "bar" ); // example from the docs
});

ฉันเพิ่มคำพูด หากคุณไม่ใส่classเครื่องหมายคำพูดสิ่งนี้จะล้มเหลวอย่างเงียบ ๆ และอาจส่งผลให้เกิดความวิกลจริต
John Henckel

0

ฉันจะแนะนำตัวเลือกแรกที่คุณสร้างองค์ประกอบโดยใช้ jQuery วิธีที่สองเพียงแค่กำหนดคุณสมบัติ innerHTML ขององค์ประกอบเป็นสตริงซึ่งเกิดขึ้นเป็น HTML และมีข้อผิดพลาดเกิดขึ้นได้ง่ายกว่าและมีความยืดหยุ่นน้อยกว่า


1
@Ash ด้วยวิธีที่สองคุณอาจล้างลูกอื่น ๆ ทั้งหมดของคอนเทนเนอร์ที่คุณกำลังแก้ไข: jsfiddle.net/jbabey/RBXq5/1
jbabey

0

ถ้า#boxว่างเปล่าไม่มีอะไร แต่ถ้าไม่ใช่สิ่งเหล่านี้จะทำสิ่งที่แตกต่างกันมาก อดีตจะเพิ่มเป็นโหนดสุดท้ายของเด็กdiv #boxหลังแทนที่เนื้อหาของ#boxด้วยdivข้อความที่ว่างเปล่าเดียวและทั้งหมด


โอ้ .. ฉันไม่ได้ใช้ผนวกที่นี่;)
Ashwin

0

นอกจากนี้ยังเป็นไปได้ที่จะสร้างองค์ประกอบ div ด้วยวิธีต่อไปนี้:

var my_div = document.createElement('div');

เพิ่มคลาส

my_div.classList.add('col-10');

ยังสามารถดำเนินการappend()และappendChild()

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