Работают ли пользовательские атрибуты данных 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? Ужас ... О_о
Вивин Палиат
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

Таким образом, вы можете использовать .data()метод jQuery или простой ванильный 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");
Marko
источник
2
Этот ответ, кажется, немного конфликтует с canIuse. Любая информация о том, почему она помечена как «частично», поддерживается? caniuse.com/dataset
Снексе
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.
Марко
@ Марко Как насчет <div lala="Tom"></div>, это будет хорошо в IE6? Как бы вы прочитали значение?
Рой Намир
@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 .

Надеюсь, это поможет.

Spudley
источник
1
«IE6 не только не поддерживает функцию атрибутов данных HTML5, но фактически ни один из существующих браузеров их не поддерживает», - уверен, хотя это зависит от вашего определения «поддержка». Ни один браузер не поддерживает это datasetсвойство, но все браузеры позволяют хранить данные в атрибутах с префиксом data-и (как вы говорите) получать их через getAttribute. Так что в некотором смысле они поддерживают эту функцию, потому что вы можете эффективно использовать сами атрибуты.
Пол Д. Уэйт
Я понимаю вашу точку зрения о том, что нет никаких причин использовать datasetсобственность для доступа к ним, хотя - я не знаю, какие преимущества она должна предложить getAttribute.
Пол Д. Уэйт
2
@Paul - он не предлагает никаких преимуществ перед getAttribute. Он предлагает стандартизированный способ хранения данных в тегах с использованием атрибутов. Это всегда работало, но никогда не было официальным стандартом до HTML5. HTML5 просто взял существующую нестандартную, но широко используемую функцию и ратифицировал ее, добавив некоторые правила, определяющие, как их следует называть, и определив новый способ доступа к ним. Когда я говорю, что это не поддерживается, я явно ссылаюсь на .dataXYZсвойства; как вы говорите, базовая функциональность широко поддерживается, но не потому, что это HTML5.
Спадли
7

Я думаю, что IE всегда поддерживал это (по крайней мере, начиная с IE4), и вы можете получить к ним доступ из JS. Они были названы «свойства экспандо». Смотрите старую статью MSDN

Это поведение можно отключить, установив для свойства expando значение false для элемента DOM (по умолчанию оно имеет значение true, поэтому свойства expando работают по умолчанию).

Изменить: исправил URL

Timores
источник
Ах да, извините, я не думаю, что это смысл, который я намеревался. Просто отредактировал вопрос, чтобы уточнить.
Пол Д. Уэйт
Я извиняюсь, ссылка была неправильной. Он объяснил, как отключить это поведение вместо объяснения функции. Я исправил ссылку и текст.
Тимор
1
getAttribute работает кросс-браузерно, не нужно полагаться на причуды IE здесь.
Дурак
отлично, спасибо Хорошая статья тоже, должен любить «Добро пожаловать в первый столбец DHTML чувак.»
Пол Д. Уэйт
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;
}
user1767210
источник
0

В IE6 это может не работать. Для справки: MSDN

Я предлагаю использовать jQuery для обработки большинства случаев:

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

Попробуйте это в вашем коде.

HTML5 разработчик
источник
В IE6 это работает (см. Принятый ответ ), и я не спрашивал о jQuery.
Пол Д. Уэйт
@ Пол Д. Уэйт: Извините, я отклонил ваш спам-флаг по ошибке. Это выглядит подозрительно.
BoltClock
@BoltClock: все в порядке. Предложение кода на самом деле несколько разумно, но эта ссылка для чтения новостей, очевидно, совершенно не связана.
Пол Д. Уэйт
Тогда почему это все еще здесь 4 года спустя?
Дэн Кладовая