คุณลักษณะข้อมูลที่กำหนดเองของ HTML5“ ทำงาน” ใน IE 6 หรือไม่


173

แอตทริบิวต์ข้อมูลที่กำหนดเอง: http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data

เมื่อฉันพูดว่า "ทำงาน" ฉันหมายถึงถ้าฉันมี HTML เช่นนี้:

<div id="geoff" data-geoff="geoff de geoff">

จะใช้ JavaScript ต่อไปนี้:

var geoff = document.getElementById('geoff');
alert(geoff.dataGeoff);

ผลิตใน IE 6 การแจ้งเตือนด้วย "geoff de geoff" ในนั้น?


117
HTML5 และ IE6 หนังสยองขวัญ ... O_o
Vivin Paliath

7
โปรดทราบว่าdata-geoffไม่ใช่ตัวระบุ JS ที่ถูกต้องเนื่องจากตัวอักษร "-" คุณจะต้องใช้dataGeoffในสคริปต์
outis

3
@outis: ตามรายละเอียด (ในร่าง) คุณหมายถึงอะไร ฉันทดสอบด้วยตัวเองใน FF 3.6 และ Chromium 5.0.307.11 และการดึงข้อมูลgeoff.dataGeoffไม่ทำงาน มันปรากฏออกมา ( whatwg.org/specs/web-apps/current-work/multipage/ ...... ) ว่ามันควรจะเป็นgeoff.dataset.geoffแต่ในขณะที่element.datasetยังคงundefinedอยู่ในเบราว์เซอร์ที่ทันสมัย
Marcel Korpel

7
jeffth ของ jeffth สิบเก้า jeffty-jeff
Matt Sach

2
@ANeves: แม้ว่าจะอนุญาตให้คนหนึ่งเข้าถึงคุณสมบัติที่ไม่มีตัวระบุได้ แต่เบราว์เซอร์จะไม่เชื่อมแอตทริบิวต์ HTML 'data-geoff' กับคุณสมบัติของชื่อเดียวกันใน DOM
outis

คำตอบ:


153

คุณสามารถดึงค่าที่กำหนดเอง (หรือของคุณเอง) getAttributeโดยใช้แอตทริบิวต์ ทำตามตัวอย่างของคุณด้วย

<div id="geoff" data-geoff="geoff de geoff">

ฉันได้รับคุณค่าของการdata-geoffใช้

var geoff = document.getElementById("geoff");
alert(geoff.getAttribute("data-geoff"));

ดูMSDN และถึงแม้ว่ามันจะมีการกล่าวถึงว่าคุณต้องใช้ IE7 เพื่อให้มันใช้งานได้ แต่ฉันได้ทดสอบกับ IE6 เมื่อไม่นานมานี้และทำงานได้อย่างถูกต้อง (แม้ในโหมด quirks)

แต่สิ่งนี้ไม่เกี่ยวข้องกับคุณลักษณะเฉพาะของ HTML5 แน่นอน


4
ทั้งหมดนี่ไม่ใช่การสนับสนุนแอตทริบิวต์ข้อมูล HTML5 อย่างแท้จริง เสียงเหมือนวิธีที่จะใช้พวกเขา
Paul D. Waite

ถูกต้องสิ่งนี้ไม่สนับสนุน API ของข้อมูลที่ใส่สิ่งต่าง ๆ ในการรวบรวมหรืออะไรก็ตาม (ไม่มีใครสนับสนุนสิ่งนี้ใช่) อย่างไรก็ตามตามที่แสดงโดย get / Set Attribute คุณสามารถรับการใช้งานหลักของ data- attribute ได้ทันทีในเบราว์เซอร์ DOM ที่รู้ตัวน้อยที่สุด คุณอาจจะสามารถเบราว์เซอร์ตัวแก้ไขลิงหากคุณมีแนวโน้มที่จะทำคอลเล็กชันที่หายไป จากการทดลองหนังสือเล่มล่าสุดของฉันเป็นที่ชัดเจนว่า data- attribute สามารถใช้งานได้ในขณะนี้และเหนือกว่ารูปแบบทั่วไปในปัจจุบันของการบรรทุกเกินค่าแอตทริบิวต์ class เพื่อเก็บข้อมูลสไตล์และข้อมูล meta แบบสุ่ม
โทมัสพาวเวลล์

“ คุณอาจจะสามารถใช้เบราว์เซอร์ปะแก้ลิงหากคุณมีแนวโน้มที่จะทำคอลเล็กชันที่หายไป” - ใช่นั่นเป็นสิ่งที่ดีเกี่ยวกับ JavaScript เมื่อเทียบกับ CSS: เนื่องจากเป็นภาษาการเขียนโปรแกรมคุณสามารถแก้ไขปัญหาความเข้ากันได้ด้วยตัวเอง
Paul D. Waite

ฉันประหลาดใจจริง ๆ ที่คำตอบนี้ยังคงได้รับเครดิตมากมายโดยเฉพาะอย่างยิ่ง IE 6 ที่ควรได้รับการพิจารณาว่า "ตาย" ตามที่นักพัฒนาเว็บหลายคนบอก
Marcel Korpel

6
@Marcel: ฉันคิดว่ามีเว็บไซต์ไม่กี่แห่งที่ยังคงมี IE 6 ซึ่งเป็นส่วนที่ไม่สำคัญของผู้ชม บางทีในอีก 10 ปีเราไม่ต้องกังวลอีกต่อไป
Paul D. Waite

141

ใช่พวกเขาทำงาน

IE ได้รับการสนับสนุนgetAttribute()จาก IE4 ซึ่งเป็นสิ่งที่ jQuery data()ใช้ภายในสำหรับ

data = elem.getAttribute( "data-" + key ); // Line 1606, jQuery.1.5.2.js

ดังนั้นคุณสามารถใช้.data()วิธีการของ jQuery หรือ JavaScript แบบธรรมดา:

ตัวอย่าง HTML

<div id="some-data" data-name="Tom"></div>

จาวาสคริ

var el = document.getElementById("some-data");
var name = el.getAttribute("data-name");
alert(name);

jQuery

var name = $("#some-data").data("name");

2
คำตอบนี้ดูเหมือนจะขัดแย้งกับ canIuse มีการป้อนข้อมูลใด ๆ ว่าเพราะเหตุใดจึงทำเครื่องหมายว่ารองรับบางส่วน caniuse.com/dataset
Snekse

8
@Snekse ฉันเชื่อว่ามันเกี่ยวข้องกับบันทึกที่ด้านล่างNote: All browsers can already use data-* attributes and access them using getAttribute. "Supported" refers to accessing the values using the dataset property. Current spec only refers to support on HTML elements, only some browsers also have support for SVG/MathML elements.
Marko

@ Marko <div lala="Tom"></div>แล้วจะเป็นเช่นไรใน IE6 คุณจะอ่านค่าอย่างไร
Royi Namir

@RoyiNamir ฉันเชื่อว่ามันควรจะทำงานได้ดีกับคุณลักษณะใด ๆ แต่คุณควรตรวจสอบที่ดีที่สุด ฉันไม่มี IE6 สะดวกทุกที่
Marko

ฉันหวังว่า jquery จะหายไป
SuperUberDuper

9

ไม่เพียง แต่ IE6 จะไม่รองรับคุณสมบัติ HTML5 Data Attribute แต่ในความเป็นจริงไม่มีเบราว์เซอร์ปัจจุบันที่รองรับมัน! ข้อยกเว้นเพียงอย่างเดียวในขณะนี้คือ Chrome

คุณมีอิสระอย่างสมบูรณ์ที่จะใช้data-geoff="geoff de geoff"เป็นแอตทริบิวต์ แต่ Chrome ของเบราว์เซอร์รุ่นปัจจุบันเท่านั้นที่จะให้.dataGeoffคุณสมบัติแก่คุณ

โชคดีที่เบราว์เซอร์ปัจจุบันทั้งหมดรวมถึง IE6 สามารถอ้างอิงคุณสมบัติที่ไม่รู้จักโดยใช้.getAttribute()วิธีDOM มาตรฐานดังนั้น.getAttribute("data-geoff")จะทำงานได้ทุกที่

ในอนาคตอันใกล้นี้ Firefox และ Safari เวอร์ชันใหม่จะเริ่มให้การสนับสนุนคุณสมบัติของข้อมูล แต่เนื่องจากมีวิธีที่ดีในการเข้าถึงมันที่ใช้งานได้กับเบราว์เซอร์ทั้งหมดดังนั้นจึงไม่มีเหตุผลที่จะใช้วิธี HTML5 ที่จะ ใช้งานได้เฉพาะกับผู้เข้าชมบางส่วนเท่านั้น

ท่านสามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับสถานะปัจจุบันของการสนับสนุนสำหรับคุณลักษณะนี้ที่CanIUse.com

หวังว่าจะช่วย


1
"ไม่เพียง แต่ IE6 จะไม่รองรับคุณสมบัติ HTML5 Data Attribute แต่ในความเป็นจริงไม่มีเบราว์เซอร์ปัจจุบันรองรับ" - แน่นอนแม้ว่าจะขึ้นอยู่กับคำจำกัดความของ "การสนับสนุน" ของคุณ ไม่มีเบราว์เซอร์รองรับdatasetทรัพย์สิน แต่เบราว์เซอร์ช่วยให้คุณสามารถเก็บข้อมูลในแอตทริบิวต์ด้วยคำนำหน้าของdata-และ (ตามที่คุณกล่าวว่า) getAttributeเรียกดูได้ผ่านทาง ดังนั้นในแง่หนึ่งพวกเขาสนับสนุนคุณสมบัติเนื่องจากคุณสามารถใช้คุณลักษณะได้อย่างมีประสิทธิภาพ
Paul D. Waite

ผมเห็นจุดของคุณเกี่ยวกับการมีเหตุผลที่จะใช้ไม่มีdatasetคุณสมบัติการเข้าถึงพวกเขาแม้ว่า - getAttributeผมไม่ทราบว่าสิ่งที่เป็นประโยชน์ก็ควรจะมีมากกว่า
Paul D. Waite

2
@Paul - มันไม่มีข้อได้เปรียบใด ๆ เหนือ getAttribute สิ่งที่นำเสนอเป็นวิธีมาตรฐานในการจัดการการจัดเก็บข้อมูลกับแท็กโดยใช้แอตทริบิวต์ สิ่งนี้ใช้ได้เสมอ แต่ก็ไม่เคยเป็นมาตรฐานอย่างเป็นทางการจนกระทั่ง HTML5 HTML5 ใช้คุณสมบัติที่ไม่ได้มาตรฐาน แต่ใช้กันอย่างแพร่หลายและให้สัตยาบันเพิ่มกฎบางอย่างเพื่อบอกว่าคุณควรตั้งชื่ออย่างไรและกำหนดวิธีการใหม่ในการเข้าถึง เมื่อฉันบอกว่ามันไม่ได้รับการสนับสนุนฉันหมายถึง.dataXYZคุณสมบัติอย่างชัดเจน อย่างที่คุณพูดฟังก์ชั่นพื้นฐานได้รับการสนับสนุนอย่างกว้างขวาง แต่ไม่ใช่เพราะมันเป็น HTML5
Spudley

7

ฉันคิดว่า IE สนับสนุนเสมอ (อย่างน้อยเริ่มต้นจาก IE4) และคุณสามารถเข้าถึงได้จาก JS พวกเขาถูกเรียกว่า 'คุณสมบัติ expando' ดูบทความ MSDN เก่า

พฤติกรรมนี้สามารถปิดใช้งานได้โดยการตั้งค่าคุณสมบัติ expando เป็น false ในองค์ประกอบ DOM (เป็นค่าเริ่มต้นดังนั้นคุณสมบัติของ expando จะทำงานโดยค่าเริ่มต้น)

แก้ไข: แก้ไข URL


อ่าใช่ฉันไม่คิดว่าเป็นความรู้สึกที่ฉันตั้งใจ เพิ่งแก้ไขคำถามเพื่อชี้แจง
Paul D. Waite

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

1
getAttribute ทำงานข้ามเบราว์เซอร์ไม่จำเป็นต้องพึ่งพา IE ที่นี่
โง่

ยอดเยี่ยมขอบคุณ บทความที่ดีเช่นกันต้องรัก“ ยินดีต้อนรับสู่คอลัมน์ DHTML Dude แรก”
Paul D. Waite

4

หากคุณต้องการดึงข้อมูลแอตทริบิวต์ที่กำหนดเองทั้งหมดพร้อมกันเช่นคุณสมบัติชุดข้อมูลในเบราว์เซอร์ที่ใหม่กว่าคุณสามารถทำดังต่อไปนี้ นี่คือสิ่งที่ฉันทำและใช้งานได้ดีสำหรับฉันใน IE7 +

function getDataSet(node) {
    var dataset = {};
    var attrs = node.attributes;
    for (var i = 0; i < attrs.length; i++) {
        var attr = attrs.item(i);
        // make sure it is a data attribute
        if(attr.nodeName.match(new RegExp(/^data-/))) {
            // remove the 'data-' from the string 
            dataset[attr.nodeName.replace(new RegExp('^data-'), '')] = attr.nodeValue;
        }
    }
    return dataset;
}

0

ในIE6มันอาจไม่ทำงาน สำหรับการอ้างอิง: MSDN

ฉันแนะนำให้ใช้ jQuery เพื่อจัดการกับกรณีส่วนใหญ่:

var geoff = $("#geoff").data("data-geoff");
alert(geoff);

ลองสิ่งนี้ในการเขียนโค้ดของคุณ


ใน IE6 มันใช้งานได้ (ดูคำตอบที่ยอมรับ ) และฉันไม่ได้ถาม jQuery
Paul D. Waite

@Paul D. Waite: ขออภัยฉันปฏิเสธการตั้งค่าสถานะสแปมของคุณโดยไม่ได้ตั้งใจ สิ่งนี้ดูน่าสงสัย
BoltClock

@BoltClock: ไม่เป็นไร จริงๆแล้วการแนะนำรหัสนั้นค่อนข้างสมเหตุสมผล แต่ลิงก์ผู้อ่านข่าวนั้นไม่เกี่ยวข้องกันอย่างชัดเจน
Paul D. Waite

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