มีวิธีที่ดีในการแนบวัตถุ JavaScript กับองค์ประกอบ HTML หรือไม่?


96

ฉันต้องการเชื่อมโยงวัตถุ JavaScript กับองค์ประกอบ HTML มีวิธีง่ายๆในการทำเช่นนี้หรือไม่?

ฉันสังเกตว่าHTML DOMกำหนดเมธอด setAttribute และดูเหมือนว่าสิ่งนี้ถูกกำหนดสำหรับชื่อแอตทริบิวต์โดยพลการ อย่างไรก็ตามสามารถตั้งค่าสตริงเท่านั้น (แน่นอนคุณสามารถใช้สิ่งนี้เพื่อจัดเก็บคีย์ลงในพจนานุกรม)

ข้อมูลเฉพาะ (แม้ว่าฉันจะสนใจคำถามทั่วไปเป็นส่วนใหญ่):

โดยเฉพาะอย่างยิ่งฉันมีองค์ประกอบ HTML ที่แสดงโหนดในต้นไม้และฉันกำลังพยายามเปิดใช้งานการลากแล้วปล่อย แต่เหตุการณ์การปล่อย jQuery จะให้องค์ประกอบที่ถูกลากและวางเท่านั้น

รูปแบบปกติสำหรับการรับข้อมูลไปยังตัวจัดการเหตุการณ์ดูเหมือนว่าจะสร้างองค์ประกอบ HTML ในเวลาเดียวกับที่คุณกำลังสร้างวัตถุ JavaScript จากนั้นกำหนดตัวจัดการเหตุการณ์โดยการปิดทับวัตถุ JavaScript เหล่านี้ - อย่างไรก็ตามสิ่งนี้ไม่ได้ผลเช่นกัน กรณี (ฉันสามารถมีวัตถุส่วนกลางที่ได้รับการเติมข้อมูลเมื่อการลากเริ่มต้นขึ้น ... แต่รู้สึกน่ารังเกียจเล็กน้อย)

คำตอบ:


44

คุณดูวิธีjQuery data () แล้วหรือยัง? คุณสามารถกำหนดวัตถุที่ซับซ้อนให้กับองค์ประกอบได้หากคุณต้องการหรือคุณสามารถใช้ประโยชน์จากวิธีการนั้นเพื่อเก็บข้อมูลอ้างอิงไปยังวัตถุ (หรือข้อมูลอื่น ๆ ) อย่างน้อยที่สุด


8
ขอบคุณ: นี่คือสิ่งที่ฉันกำลังมองหา ที่น่าสนใจในการกำหนดวิธีนี้ jquery จะเก็บคีย์ไว้ในพจนานุกรมส่วนกลางในแอตทริบิวต์สตริงในแต่ละองค์ประกอบ ชื่อของแอตทริบิวต์สตริงนี้ถูกสร้างขึ้นแบบสุ่มเมื่อโหลด jquery ครั้งแรก (แนะนำว่าไม่มีวิธีที่ดีในการทำไม่มีวิธีที่ดีกว่าในการดำเนินการนี้โดยใช้ DOM เท่านั้น)
user47741

6
เป็นที่น่าสังเกตว่า jQuery data() ทำงานโดยใช้คำตอบที่ Bobince ให้ ดังนั้นหากคุณยังไม่ได้ใช้ jquery คุณก็อาจใช้สิ่งนั้นได้เช่นกัน
Eamon Nerbonne

6
ตลกดีที่ฉันสามารถย้อนกลับไปดูคำตอบนี้ในอีก 6 ปีต่อมาและคิดว่า "นี่เป็นคำตอบที่ไม่เหมาะสมมาก @bobince ควรมีคำตอบที่ยอมรับ"
Phil.Wheeler

6
ไม่มีแท็ก jQuery ในคำถามนี้
MichałPerłakowski

112

ออบเจ็กต์ JavaScript สามารถมีคุณสมบัติที่กำหนดให้กับพวกมันได้โดยไม่มีอะไรพิเศษที่คุณต้องทำเพื่ออนุญาต ซึ่งรวมถึงองค์ประกอบ DOM แม้ว่าพฤติกรรมนี้ไม่ได้เป็นส่วนหนึ่งของมาตรฐาน DOM แต่ในกรณีนี้กลับไปใช้ JavaScript เวอร์ชันแรกและมีความน่าเชื่อถือโดยสิ้นเชิง

var div= document.getElementById('nav');
div.potato= ['lemons', 3];

6
@ tat.wright - คุณสมบัติที่กำหนดเองในองค์ประกอบ HTML ที่เขาพูดถึงเรียกว่าคุณสมบัติ Expando โปรดทราบว่า div.potato ไม่ได้หมายถึง div.getAttribute ("มันฝรั่ง")
nickytonline

37
@ Tim Down: ถ้าอย่างนั้นอย่าทำ ฉันไม่เห็นว่าเหตุใดจึงไม่น่าเชื่อถือ - เหมือนกับการบอกว่าวัตถุ String ไม่น่าเชื่อถือเพราะคุณสามารถตั้งค่าเป็น null ได้
ไซมอน

5
@ TimDown: แต่จะไม่ตั้งค่าdocument.expando = falseตัวแบ่งjQuery.dataด้วย?
Joey Adams

8
จากประสบการณ์ของฉันสาเหตุที่อาจไม่ดีคือการรั่วไหลของหน่วยความจำ อาจมีวิธีง่ายๆในการหลีกเลี่ยง แต่เมื่อฉันออกแบบที่ใช้สิ่งนี้อย่างหนักมันมีหน่วยความจำรั่วไหลมากมาย ฉันคิดว่าคุณต้องระมัดระวังเป็นพิเศษเนื่องจากการนับอ้างอิงไม่ได้รับการจัดการให้คุณ (ไม่ได้ทำความสะอาด) หากองค์ประกอบถูกลบออกจากหน้าและอาจเป็นไปในทางกลับกัน
eselk

8
คำเตือนที่เป็นธรรม: ฉันทำตามคำตอบอย่างมีความสุข แต่แทนที่จะใช้ชื่อฟิลด์ว่า "มันฝรั่ง" ฉันใช้ "ขอบเขต" ปรากฎว่า "ขอบเขต" เป็นแอตทริบิวต์ขององค์ประกอบเซลล์ตาราง ( <td>) และวัตถุที่ฉันกำหนดให้กับฟิลด์นี้คือ # toString'ed ฉันรู้สึกสับสนมากที่เห็น td.scope === '[object Object]'
David Groomes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.