Các thuộc tính dữ liệu tùy chỉnh HTML5 có hoạt động được không trong IE 6?


173

Thuộc tính dữ liệu tùy chỉnh: http://dev.w3.org/html5/spec/Overview.html#embpping-custom-non-visible-data

Khi tôi nói, hãy làm việc với nhau, ý tôi là, nếu tôi có HTML như thế này:

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

JavaScript sau đây:

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

sản xuất, trong IE 6, một cảnh báo với hệ thống Geoff de geoff 'trong đó?


117
HTML5 và IE6? Kinh dị ... O_o
Vivin Paliath

7
Lưu ý rằng đó data-geoffkhông phải là định danh JS hợp lệ do ký tự "-". Bạn sẽ cần sử dụng dataGeofftrong các tập lệnh.
outis

3
@outis: Theo thông số kỹ thuật (trong bản nháp), ý bạn là gì? Tôi đã thử nghiệm điều này trong FF 3.6 và Chromium 5.0.307.11 và việc truy xuất geoff.dataGeoffkhông hoạt động. Hóa ra ( whatwg.org/specs/web-apps/civerse-work/multipage/ mẹo ) nên như vậy geoff.dataset.geoff, nhưng element.datasetvẫn còn undefinedtrong các trình duyệt hiện đại, điều đó không được hỗ trợ.
Marcel Korpel

7
Các jeffth của jeffth, mười chín jeffty-jeff.
Matt Sach

2
@ANeves: mặc dù điều đó cho phép một người truy cập vào một thuộc tính có các ký tự không định danh, nhưng nó không áp dụng ở đây vì trình duyệt sẽ không kết nối thuộc tính HTML 'data-geoff' với thuộc tính cùng tên trong DOM.
outis

Câu trả lời:


153

Bạn có thể truy xuất các giá trị của các thuộc tính tùy chỉnh (hoặc của riêng bạn) bằng cách sử dụng getAttribute. Theo gương của bạn với

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

Tôi có thể nhận được giá trị của data-geoffviệc sử dụng

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

Xem MSDN . Và mặc dù có đề cập rằng bạn cần IE7 để hoạt động, tôi đã thử nghiệm điều này một thời gian trước với IE6 và nó hoạt động chính xác (ngay cả trong chế độ quirks).

Nhưng điều này không liên quan gì đến các thuộc tính dành riêng cho HTML5, tất nhiên.


4
Hoàn toàn, đây không phải là hỗ trợ thực tế của các thuộc tính dữ liệu HTML5. Nghe có vẻ như một cách để sử dụng chúng mặc dù.
Paul D. Chờ

Chính xác điều này không hỗ trợ API dữ liệu đưa mọi thứ vào bộ sưu tập hoặc bất cứ điều gì (không ai hỗ trợ điều này có). Tuy nhiên, như được hiển thị bởi get / Set Attribution, bạn có thể sử dụng chính các thuộc tính dữ liệu ngay lập tức trong bất kỳ trình duyệt nhận biết DOM tối thiểu nào. Bạn có thể cũng có thể vá các trình duyệt khỉ nếu bạn rất có xu hướng tạo ra các bộ sưu tập còn thiếu. Từ các thử nghiệm sách gần đây của tôi, rõ ràng các thuộc tính dữ liệu hiện có thể sử dụng được và vượt trội hơn nhiều so với sơ đồ phổ biến hiện tại là quá tải giá trị thuộc tính lớp để chứa thông tin kiểu và dữ liệu meta ngẫu nhiên.
Thomas Powell

Bạn có thể cũng có thể vá các trình duyệt khỉ nếu bạn rất có xu hướng tạo ra các bộ sưu tập còn thiếu. - Vâng, đó là điều hay về JavaScript so với CSS: vì đó là ngôn ngữ lập trình, bạn có thể tự khắc phục các sự cố tương thích.
Paul D. Chờ

Tôi thực sự ngạc nhiên khi câu trả lời này vẫn nhận được rất nhiều tín dụng, đặc biệt là IE 6 nên bị coi là "chết", theo nhiều nhà phát triển web.
Marcel Korpel

6
@Marcel: Tôi nghĩ rằng khá nhiều trang web vẫn có IE 6 là một phần không đáng kể trong đối tượng của họ. Có lẽ trong một 10 năm chúng tôi sẽ không phải lo lắng nữa.
Paul D. Chờ

141

Vâng, họ làm việc.

IE đã hỗ trợ getAttribute()từ IE4, đó là những gì jQuery sử dụng nội bộ data().

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

Vì vậy, bạn có thể sử dụng .data()phương thức của jQuery hoặc JavaScript vanilla đơn giản:

HTML mẫu

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

Javascript

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

jQuery

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

2
Câu trả lời này dường như mâu thuẫn một chút với canIuse. Bất kỳ đầu vào về lý do tại sao nó được đánh dấu là "một phần" được hỗ trợ? caniuse.com/dataset
Snekse

8
@Snekse Tôi tin rằng nó liên quan đến ghi chú ở phía dướiNote: 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 Thế còn <div lala="Tom"></div>, điều này có ổn trong IE6 không? Làm thế nào bạn sẽ đọc giá trị?
Royi Namir

@RoyiNamir Tôi tin rằng nó sẽ hoạt động tốt với bất kỳ thuộc tính nào nhưng bạn nên kiểm tra tốt nhất. Tôi không có IE6 ở bất cứ đâu.
Marko

Tôi ước jquery sẽ biến mất
SuperUberDuper

9

IE6 không chỉ không hỗ trợ tính năng Thuộc tính dữ liệu HTML5, trên thực tế hầu như không có trình duyệt hiện tại nào hỗ trợ chúng! Ngoại lệ duy nhất tại thời điểm này là Chrome.

Bạn hoàn toàn tự do sử dụng data-geoff="geoff de geoff"như một thuộc tính, nhưng chỉ Chrome của các phiên bản trình duyệt hiện tại mới cung cấp cho bạn .dataGeofftài sản.

May mắn thay, tất cả các trình duyệt hiện tại - bao gồm IE6 - có thể tham chiếu các thuộc tính không xác định bằng .getAttribute()phương thức DOM tiêu chuẩn , do đó .getAttribute("data-geoff")sẽ hoạt động ở mọi nơi.

Trong tương lai rất gần, các phiên bản mới của Firefox và Safari sẽ bắt đầu hỗ trợ các thuộc tính dữ liệu, nhưng do có một cách hoàn toàn tốt để truy cập nó hoạt động trong tất cả các trình duyệt, nên thực sự không có lý do gì để sử dụng phương thức HTML5 sẽ chỉ làm việc cho một số khách truy cập của bạn.

Bạn có thể xem thêm về trạng thái hỗ trợ hiện tại cho tính năng này tại CanIUse.com .

Mong rằng sẽ giúp.


1
"IE6 không chỉ không hỗ trợ tính năng Thuộc tính dữ liệu HTML5, trên thực tế hầu như không có trình duyệt hiện tại nào hỗ trợ chúng" - chắc chắn, mặc dù điều đó phụ thuộc vào định nghĩa "hỗ trợ" của bạn. Không có trình duyệt nào hỗ trợ thuộc datasettính, nhưng tất cả các trình duyệt cho phép bạn lưu trữ dữ liệu trong các thuộc tính có tiền tố là data-và (như bạn nói) truy xuất thông qua đó getAttribute. Vì vậy, theo một nghĩa nào đó, chúng hỗ trợ tính năng này, bởi vì bạn có thể sử dụng các thuộc tính một cách hiệu quả.
Paul D. Chờ

Tôi thấy quan điểm của bạn về việc không có lý do gì để sử dụng datasettài sản để truy cập vào chúng - tôi không biết những lợi ích mà nó mang lại sẽ mang lại lợi ích gì getAttribute.
Paul D. Chờ

2
@Paul - nó không cung cấp bất kỳ lợi thế nào so với getAttribution. Những gì nó cung cấp là một cách được tiêu chuẩn hóa để xử lý việc lưu trữ dữ liệu đối với thẻ bằng các thuộc tính. Điều này luôn hoạt động nhưng chưa bao giờ là tiêu chuẩn chính thức cho đến HTML5. HTML5 chỉ đơn giản là lấy một tính năng không chuẩn nhưng được sử dụng rộng rãi và phê chuẩn nó, thêm một số quy tắc để nói cách bạn nên đặt tên cho chúng và xác định một cách mới để truy cập chúng. Khi tôi nói nó không được hỗ trợ, tôi rõ ràng đề cập đến các .dataXYZthuộc tính; như bạn nói, chức năng cơ bản được hỗ trợ rộng rãi, nhưng không phải vì đó là HTML5.
Spudley

7

Tôi nghĩ IE đã luôn hỗ trợ điều này (ít nhất là bắt đầu từ IE4) và bạn có thể truy cập chúng từ JS. Chúng được gọi là "thuộc tính mở rộng". Xem bài viết MSDN cũ

Hành vi này có thể bị vô hiệu hóa bằng cách thiết lập expando tài sản false trên một phần tử DOM (đó là sự thật theo mặc định, vì vậy expando thuộc tính làm việc theo mặc định).

Chỉnh sửa: đã sửa URL


À, vâng, xin lỗi, tôi không nghĩ đó là ý nghĩa của tôi. Chỉ cần chỉnh sửa câu hỏi để làm rõ.
Paul D. Chờ

Tôi là người xin lỗi, liên kết đã sai. Nó giải thích cách vô hiệu hóa hành vi này thay vì giải thích tính năng này. Tôi đã sửa liên kết và văn bản.
Timores

1
getAttribution hoạt động trên nhiều trình duyệt, không cần phải dựa vào các quirks IE ở đây.
đánh lừa

tuyệt vời cảm ơn bạn. Bài viết hay quá, phải yêu thích Chào mừng bạn đến với cột Dude DHTML đầu tiên.
Paul D. Chờ

4

Nếu bạn muốn truy xuất tất cả các thuộc tính dữ liệu tùy chỉnh cùng một lúc như thuộc tính bộ dữ liệu trong các trình duyệt mới hơn, bạn có thể thực hiện các thao tác sau. Đây là những gì tôi đã làm và làm việc tuyệt vời cho tôi trong eg7 +.

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

Trong IE6 , nó có thể không hoạt động. Để tham khảo: MSDN

Tôi đề nghị sử dụng jQuery để xử lý hầu hết các trường hợp:

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

Hãy thử điều này trong mã hóa của bạn.


Trong IE6, nó hoạt động (xem câu trả lời được chấp nhận ) và tôi đã không hỏi về jQuery.
Paul D. Chờ

@Paul D. Chờ đợi: Xin lỗi, tôi đã từ chối cờ spam của bạn. Điều này có vẻ đáng ngờ.
BoltClock

@BoltClock: điều đó khá ổn. Đề xuất mã thực sự là một phần hợp lý, nhưng liên kết người đọc tin tức rõ ràng là hoàn toàn không liên quan.
Paul D. Chờ

Vậy thì tại sao nó vẫn ở đây 4 năm sau?
Dan Pantry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.