แอตทริบิวต์ที่ไม่ได้มาตรฐานบนแท็ก HTML สิ่งที่ดี? สิ่งที่ไม่ดี? ความคิดของคุณ?


92

HTML (หรืออาจเป็นเพียง XHTML?) ค่อนข้างเข้มงวดเมื่อพูดถึงแอตทริบิวต์ที่ไม่ได้มาตรฐานบนแท็ก หากไม่ได้เป็นส่วนหนึ่งของข้อมูลจำเพาะรหัสของคุณจะถือว่าไม่เป็นไปตามข้อกำหนด

อย่างไรก็ตามแอตทริบิวต์ที่ไม่ได้มาตรฐานมีประโยชน์พอสมควรสำหรับการส่งผ่านข้อมูลเมตาไปยัง Javascript ตัวอย่างเช่นหากสมมติว่าลิงก์แสดงป๊อปอัปคุณสามารถตั้งชื่อป๊อปอัปในแอตทริบิวต์:

<a href="#null" class="popup" title="See the Popup!" 
   popup_title="Title for My Popup">click me</a>

หรือคุณสามารถจัดเก็บหัวเรื่องสำหรับป๊อปอัปในองค์ประกอบที่ซ่อนอยู่เช่นช่วง:

<style>
    .popup .title { display: none; }
</style>
<a href="#null" title="See the Popup!" class="popup">
    click me
    <span class="title">Title for My Popup</span>
</a>

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

ฉันอยากรู้ว่าชุมชนนี้คิดอย่างไร คุณรับมือกับสถานการณ์เช่นนี้อย่างไร? ความเรียบง่ายของวิธีแรกมีมากกว่าข้อเสียที่อาจเกิดขึ้น (ถ้ามี) หรือไม่?


3
สิ่งเหล่านี้เรียกว่าแอตทริบิวต์ "expando" หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับคุณลักษณะเหล่านี้
Jason Bunting

2
AFAIK แอตทริบิวต์ expando ถูกตั้งค่าที่รันไทม์โดยใช้ javascript พวกเขาไม่ได้เป็นส่วนหนึ่งของ XHTML
Philippe Leybaert

คำตอบ:


50

ฉันเป็นแฟนตัวยงของโซลูชัน HTML 5 ที่นำเสนอ ( data-แอตทริบิวต์ที่นำหน้า) แก้ไข: ฉันจะเพิ่มว่าอาจมีตัวอย่างที่ดีกว่าสำหรับการใช้แอตทริบิวต์ที่กำหนดเอง ตัวอย่างเช่นข้อมูลที่แอปพลิเคชันแบบกำหนดเองจะใช้ซึ่งไม่มีอะนาล็อกในแอตทริบิวต์มาตรฐาน (เช่นการปรับแต่งสำหรับตัวจัดการเหตุการณ์ตามสิ่งที่ไม่จำเป็นต้องแสดงใน className หรือ id)


2
ตอนนี้ฉันมักจะทำตามวิธีแก้ปัญหานี้แม้ว่าจะไม่เป็นไปตามมาตรฐานก็ตาม
Tom Ritter

1
ฉันหลีกเลี่ยงสิ่งนี้มาโดยตลอดเนื่องจากไม่สามารถตรวจสอบได้ แต่ตอนนี้ฉันคิดเกี่ยวกับเรื่องนี้การยัดเยียดทุกอย่างในแอตทริบิวต์ class = "" (เช่น jquery metadata) ไม่จำเป็นต้องดีไปกว่านี้ วิธีนี้ใน <HTML5 land มีข้อเสียในทางปฏิบัติหรือไม่ โดยพื้นฐานแล้ว - จะมีปัญหาอะไรเกิดขึ้นบ้าง? ดูเหมือนจะไม่เหมาะ แต่ก็ไม่มีผลข้างเคียงที่ฉันคิดได้
rocketmonkeys

@Rocketmonkeys ฉันไม่แน่ใจ แต่ฉันคิดว่าการใช้ข้อมูลภายในแอตทริบิวต์คลาสอาจบังคับให้เบราว์เซอร์ลองใช้กฎ css ที่ไม่ได้กำหนดกับองค์ประกอบซึ่งอาจทำให้เกิดปัญหาหรือปัญหาด้านประสิทธิภาพได้ อีกครั้งฉันไม่แน่ใจ
Vitim.us

@ Vitim.us หากมีการแสดงที่ยอดเยี่ยมเช่นนี้ก็จะไม่สำคัญ เบราว์เซอร์ค่อนข้างมีประสิทธิภาพในสิ่งนั้น Hit สำหรับการนำสไตล์ไปใช้จริงจะมากกว่า และอย่าลืมว่าคลาสไม่ใช่สิ่งที่คิดค้นขึ้นเพื่อจุดประสงค์ในการจัดรูปแบบ แต่เป็นเพียงข้อมูลองค์ประกอบเหมือนแอตทริบิวต์อื่น ๆ สามารถใช้แอตทริบิวต์ใด ๆ ในตัวเลือกได้ดังนั้นหากมีการตีประสิทธิภาพดังกล่าวจะใช้กับแอตทริบิวต์ใด ๆ (รวมถึงdata-คำนำหน้า) ที่คุณเพิ่มลงในองค์ประกอบ
เปลือกตา

@eyelidlessness นั่นเป็นข้อโต้แย้งที่ดีฉันต้องยอมรับแม้ว่าฉันค่อนข้างจะใช้โครงสร้างข้อมูลอย่างถูกต้องใน Javascript ฉันพบว่าบางกรณีการใช้แอตทริบิวต์ข้อมูลนั้นเหมาะสม ฉันหลีกเลี่ยง jquery เช่น rocketmonkeys กล่าว ฉันต้องหยุดรบกวนผู้คนเกี่ยวกับการเพิ่มประสิทธิภาพแบบไมโคร
Vitim.us

27

แอตทริบิวต์ที่กำหนดเองเป็นวิธีที่สะดวกในการนำข้อมูลเพิ่มเติมไปยังฝั่งไคลเอ็นต์ Dojo Toolkit ทำสิ่งนี้เป็นประจำและมีการชี้ ( Debunking Dojo Toolkit Myths ) ว่า:

แอตทริบิวต์ที่กำหนดเองเป็น HTML ที่ถูกต้องเสมอเพียง แต่ไม่สามารถตรวจสอบได้เมื่อทดสอบกับ DTD [... ] ข้อกำหนด HTML ระบุว่าแอตทริบิวต์ใด ๆ ที่ไม่รู้จักจะถูกละเว้นโดยเอ็นจินการแสดงผล HTML ในตัวแทนผู้ใช้และ Dojo อาจใช้ประโยชน์จากสิ่งนี้เพื่อปรับปรุงความสะดวกในการพัฒนา


9

อีกทางเลือกหนึ่งคือการกำหนดสิ่งนี้ใน Javascript:

<script type="text/javascript">
var link_titles = {link1: "Title 1", link2: "Title 2"};
</script>

จากนั้นคุณสามารถใช้สิ่งนี้ในภายหลังในโค้ด Javascript โดยสมมติว่าลิงก์ของคุณมี ID ที่ตรงกับ ID ในแฮชแท็กนี้

ไม่มีข้อเสียของอีกสองวิธี: ไม่มีคุณลักษณะที่ไม่ได้มาตรฐานหรือช่วงซ่อนเร้นที่น่าเกลียด

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

นอกจากนี้คุณยังแยกข้อมูลออกจากการจัดรูปแบบซึ่งเป็นสิ่งที่ดีสำหรับการบำรุงรักษา

คุณสามารถมีบางอย่างเช่นนี้ (ซึ่งคุณไม่สามารถทำได้ด้วยวิธีการอื่น ๆ ):

var poi_types = {1: "City", 2: "Restaurant"};
var poi = {1: {lat: X, lng: Y, name: "Beijing", type: 1}, 2: {lat: A, lng: B, name: "Hatsune", type: 2}};

...

<a id="poi-2" href="/poi/2/">Hatsune</a>

และเนื่องจากคุณอาจใช้ภาษาการเขียนโปรแกรมฝั่งเซิร์ฟเวอร์เป็นส่วนใหญ่ตารางแฮชนี้จึงควรมีความสำคัญในการสร้างแบบไดนามิก (เพียงจัดลำดับให้เป็น JSON และพ่นในส่วนส่วนหัวของหน้า)


4

ในกรณีนี้ทางออกที่ดีที่สุดคือ

<a href="#" alt="" title="Title of My Pop-up">click</a>

และใช้แอตทริบิวต์หัวเรื่อง

บางครั้งฉันก็ทำลายสเป็คถ้าฉันต้องการจริงๆ แต่น้อยครั้งและด้วยเหตุผลที่ดีเท่านั้น

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


4

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


2

คุณสามารถซ้อนองค์ประกอบอินพุตที่ซ่อนอยู่ภายในองค์ประกอบจุดยึด

<a id="anchor_id">
  <input type="hidden" class="articleid" value="5">
  Link text here
</a>

จากนั้นคุณสามารถดึงข้อมูลออกมาได้อย่างง่ายดายโดย

$('#anchor_id .articleid').val()

1
ใช่ <input type="hidden" title="article_id" value="5" />แต่วิธีที่ดีที่สุดคือการใช้งาน: เนื่องจากคลาสเป็นสิ่งสำหรับ CSS การให้โค้ดที่ไม่ถูกต้องในความเป็นจริงหากคลาสไม่อยู่ในข้อมูลสไตล์ แม้ว่า JS หรือ CSS จะปิดข้อมูลก็จะยังคงซ่อนอยู่
เยติ

1
@Yeti คลาสไม่ใช่สิ่งสำหรับ CSS หรือไม่ถูกต้องหากไม่ปรากฏในสไตล์ เป็นเพียงข้อมูลในองค์ประกอบเช่นเดียวกับแอตทริบิวต์อื่น ๆ การเชื่อมโยงกับ CSS คือตัวเลือกที่ได้รับการสนับสนุนอย่างดี
เปลือกตา

0

วิธีแก้ปัญหาของฉันในตอนท้ายคือการซ่อนข้อมูลเพิ่มเติมในแท็ก id ที่คั่นด้วยตัวคั่นบางประเภท (หนึ่งขีดล่างคือช่องว่างสองคือจุดสิ้นสุดของอาร์กิวเมนต์นั้น) อาร์กิวเมนต์ที่สองมี id:

<a href="#" class="article" id="Title_of_My_Pop-up__47">click</a>

น่าเกลียดและถือว่าคุณไม่ได้ใช้แท็ก id สำหรับอย่างอื่น แต่เป็นไปตามมาตรฐานในทุกเบราว์เซอร์


-1

ความรู้สึกส่วนตัวของฉันในตัวอย่างของคุณคือเส้นทางช่วงนั้นเหมาะสมกว่าเนื่องจากเป็นไปตามมาตรฐานของข้อกำหนด XHTML อย่างไรก็ตามฉันเห็นส่วนแบ่งสำหรับแอตทริบิวต์ที่กำหนดเอง แต่ฉันคิดว่าพวกเขาเพิ่มระดับความสับสนที่ไม่จำเป็น


10
เส้นทาง SPAN เป็นการใช้แท็กในทางที่ผิด อาจเป็นไปตามมาตรฐานการตรวจสอบความถูกต้อง แต่ไม่เป็นไปตามมาตรฐานความหมาย
ceejayoz

-1

ฉันคิดเรื่องนี้มาตลอดเหมือนกัน ฉันชอบความสามารถในการอ่านแอตทริบิวต์ที่ไม่ได้มาตรฐาน แต่ฉันไม่ชอบที่มันจะทำลายมาตรฐาน ตัวอย่าง hidden span เป็นไปตามข้อกำหนด แต่อ่านไม่ได้มากนัก แล้วสิ่งนี้:

<a href="#" alt="" title="" rel="{popup_title:'Title of My Pop-up'}">click</a>

ที่นี่รหัสสามารถอ่านได้มากเนื่องจากสัญกรณ์คู่คีย์ / ค่าของ JSON คุณสามารถบอกได้ว่านี่คือข้อมูลเมตาที่เป็นของลิงก์เพียงแค่ดูที่มัน ข้อบกพร่องเดียวที่ฉันเห็นข้างการหักหลังแอตทริบิวต์ "rel" คือสิ่งนี้จะทำให้วัตถุที่ซับซ้อนยุ่งเหยิง ฉันชอบแนวคิดของแอตทริบิวต์ที่มีคำนำหน้า "data-" ดังกล่าวข้างต้นมาก เบราว์เซอร์ปัจจุบันรองรับสิ่งนี้หรือไม่

นี่คือสิ่งอื่นที่ต้องคิด โค้ดที่ไม่สอดคล้องกับ SEO มีผลกระทบมากแค่ไหน?


7
แอตทริบิวต์ rel อธิบายความสัมพันธ์ระหว่างเพจปัจจุบันและทรัพยากรที่เชื่อมโยง ไม่ใช่แอตทริบิวต์ "จัดเก็บข้อมูลที่คุณต้องการ" ทั่วไป นี่เป็นเรื่องที่น่ากลัว
Quentin

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