Чи "працює" користувацькі атрибути 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в сучасних браузерах, це не підтримується.
Марсель Корпель

7
Джефф-джефф, дев’ятнадцять джеффі-джефф.
Метт Сах

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, і він функціонував правильно (навіть у режимі диваків).

Але це, звичайно, не має нічого спільного з атрибутами, характерними для HTML5.


4
Загалом, це фактична підтримка атрибутів даних HTML5. Це звучить як спосіб їх використання.
Пол Д. Вейт

Виправте це, не підтримує API даних, що містять речі у колекції чи будь-що інше (ніхто не підтримує це так). Однак, як показано в get / Set Attribute, ви можете отримати головне використання атрибутів даних негайно в будь-якому браузері, що знає мінімально DOM. Можливо, ви також могли б переглядати браузери з патч-мавпами, якщо ви настільки схильні робити відсутні колекції. З моїх останніх експериментів із книгою видно, що атрибути даних зараз є зручними та значно перевершують існуючу загальну схему перевантаження значення атрибутів класу, щоб містити інформацію про стиль та випадкові метадані.
Томас Пауелл

"Ви, мабуть, також могли б переглядати браузери з патч-мавпами, якщо ви настільки схильні робити відсутні колекції". - Так, це приємна річ у JavaScript порівняно з CSS: оскільки це мова програмування, ви можете вирішити проблеми сумісності самостійно.
Пол Д. Уейт

Я насправді вражений, що ця відповідь все ще отримує стільки кредитів, тим більше, що IE 6 слід вважати "мертвим", на думку багатьох веб-розробників.
Марсель Корпель

6
@Marcel: Я думаю, що досить багато сайтів все ще мають IE 6 як незначну частину своєї аудиторії. Можливо, ще через 10 років нам більше не доведеться хвилюватися.
Пол Д. Уейт

141

Так, вони працюють.

IE підтримує getAttribute()IE4, для чого jQuery використовує внутрішньо data().

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

Таким чином, ви можете використовувати jQuery .data() метод або звичайний ванільний JavaScript:

Зразок HTML

<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
Ця відповідь, здається, трохи суперечить 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 Що з цього <div lala="Tom"></div>, це буде нормально в IE6? Як би ви прочитали значення?
Royi Namir

@RoyiNamir Я вважаю, що це має працювати нормально з будь-яким атрибутом, але найкраще перевірити. У мене IE6 не підходить ніде.
Марко

Я б хотів, щоб jquery просто пішов
SuperUberDuper

9

Мало того, що IE6 не підтримує функцію атрибутів даних HTML5, насправді практично жоден браузер не підтримує їх! На сьогодні єдиний виняток - Chrome.

Ви абсолютно можете вільно використовувати data-geoff="geoff de geoff"як атрибут, але лише Chrome поточних версій браузера надасть вам .dataGeoffвластивість.

На щастя, всі поточні браузери, включаючи IE6, можуть посилатися на невідомі атрибути за допомогою стандартного .getAttribute()методу DOM , тому .getAttribute("data-geoff")вони працюватимуть всюди.

Найближчим часом нові версії Firefox та Safari почнуть підтримувати атрибути даних, але враховуючи, що існує ідеально хороший спосіб доступу до нього, який працює у всіх браузерах, то справді немає причин використовувати метод HTML5, який буде працюють лише для деяких ваших відвідувачів.

Більше про поточний стан підтримки цієї функції можна дізнатися на сайті CanIUse.com .

Сподіваюся, що це допомагає.


1
"IE6 не тільки не підтримує функцію атрибутів даних HTML5, насправді практично жоден поточний браузер їх не підтримує" - впевнено, хоча це залежить від вашого визначення поняття "підтримка". Жоден браузер не підтримує datasetвластивість, але всі браузери дозволяють зберігати дані в атрибутах з префіксом data-та (як ви кажете) отримувати їх через getAttribute. Так що в одному сенсі вони підтримують цю функцію, оскільки ви можете ефективно використовувати самі атрибути.
Пол Д. Уейт

Я бачу вашу думку про те, що немає ніяких причин використовувати datasetмайно для доступу до них, хоча я не знаю, які переваги він пропонує getAttribute.
Пол Д. Уейт

2
@Paul - він не пропонує жодних переваг перед getAttribute. Він пропонує стандартизований спосіб поводження зі зберіганням даних проти тегу за допомогою атрибутів. Це завжди працювало, але ніколи не було офіційним стандартом до HTML5. HTML5 просто взяв існуючу нестандартну, але широко використовувану функцію та ратифікував її, додавши деякі правила, щоб сказати, як слід їх називати, та визначивши новий спосіб доступу до них. Коли я кажу, що це не підтримується, я прямо посилаюся на .dataXYZвластивості; як ви кажете, основна функціональність широко підтримується, але не тому, що це HTML5.
Спудлі

7

Я думаю, що IE завжди підтримував це (принаймні, починаючи з IE4), і ви можете отримати доступ до них з JS. Їх називали "властивості експандо". Побачити стару статтю MSDN

Цю поведінку можна відключити, встановивши властивість експандо на значення false на елементі DOM (це правда за замовчуванням, тому властивості розширення працюють за замовчуванням).

Редагувати: виправлено URL-адресу


Ах, так вибачте, я не думаю, що це сенс, який я мав намір. Щойно відредагував питання, щоб уточнити.
Пол Д. Уейт

Мені шкода, посилання було невірним. Він пояснював, як відключити цю поведінку замість пояснення функції. Я поправив посилання та текст.
Тиморес

1
getAttribute працює між браузером, тут не потрібно покладатися на примхи IE.
foolip

чудово, дякую Приємна стаття, теж треба любити "Ласкаво просимо до першої колонки DHTML Dude".
Пол Д. Уейт

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: Вибачте, я помилково відхилив ваш прапор спаму. Це виглядає підозріло.
BoltClock

@BoltClock: це цілком нормально. Пропозиція щодо коду насправді є дещо розумною, але ця посилання для читання новин очевидно повністю не пов'язана.
Пол Д. Уейт

Тоді чому це все ще тут через 4 роки?
Комора Ден
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.