Поддержка Zepto для данных- * атрибуты через .data()

#javascript #jquery #arrays #zepto

#javascript #jquery #массивы #zepto

Вопрос:

Я использую Zepto.js , облегченный клон jquery. Но эта платформа не использует .data() так же, как jquery. Теперь мне нужно использовать этот код:

 var position = new Array;
$('#ipadmenu > section').each(function() {
    position.push($(this).data('order'));
});
  

Но я понятия не имею, как заставить это работать в моей среде.
Как мне преобразовать это в чистый javascript? Я никогда по-настоящему не работал с массивами, поэтому я совсем потерялся … кроме того, мог ли я что-то пропустить в документе zepto (https://github.com/madrobby/zepto ) что могло бы мне в этом помочь? например, get()?

Вот HTML-код. В принципе, я хочу добавить все разделы (количество может измениться) в массив:

 <nav id="ipadmenu">
    <section data-order="0">
        <a><p>text</p></a>
    </section>
    <section data-order="1">
        <a><p>text</p></a>
    </section>
</nav>
  

спасибо за вашу помощь!

Комментарии:

1. Небольшая придирка … jQuery — это «настоящий JavaScript».

2. .push будет иметь мало общего с фреймворком, поскольку вы вызываете его в массиве.

3. jQuery — это просто предварительно написанные библиотеки кода JavaScript..

4. да, верно, я изменил его на «чистый»: p

5. Я погуглил это, и да, я думаю, это так 🙂

Ответ №1:

Основываясь на моем 30-секундном обзоре документов zepto, это будет выглядеть так.

 var position = new Array;
$('#ipadmenu > section').each(function() {
    position.push($(this).data('order'));
});
  

в документах zepto, на которые вы ссылались, говорится, что он поддерживает все методы jquery в вашем фрагменте.

Что насчет данных, которые он не обрабатывает? Если он действительно не обрабатывает data то же самое, он также поддерживает attr , так что вы могли бы сказать:

 var position = new Array;
$('#ipadmenu > section').each(function() {
    position.push($(this).attr('data-order'));
});
  

Комментарии:

1. спасибо за ваш ответ. Doe sit поддерживает данные? Я не знаю, я в замешательстве, не очень хорошо разбираюсь в javascript. Попытался прочитать обе документации, и они сказали разные вещи, и мой код не выполняется. Я думаю, что тогда я допустил еще одну ошибку. Спасибо за помощь, я тоже попробую attr :).

Ответ №2:

Вот альтернативное «чистое» решение javascript:

 var position = [];
var aSections = document.getElementById('ipadmenu').childNodes;
for (iIndex in aSections) {
    if (aSections[iIndex].nodeName == 'SECTION') {
        position.push(aSections[iIndex].getAttribute('data-order'));
    }
}
  

Также смотрите Мой jsfiddle.

=== ОБНОВЛЕНИЕ ===

Немного меньшее решение:

 var position = [];
var aSections = document.getElementById('ipadmenu').getElementsByTagName('SECTION');
for (i = 0; i < aSections.length; i  ) {
    position.push(aSections[i].getAttribute('data-order'));
}
  

Вот новый jsfiddle.

Комментарии:

1. прекрасно! по моему мнению, всегда лучше использовать «чистый» javascript! для скорости, конечно! так что спасибо вам за вашу работу.

Ответ №3:

Если вы используете атрибуты data- *, вы можете получить к ним доступ через новый объект dataset, доступный в HTMLElement. dataset — это объект StringMap, поэтому вы получаете доступ к значениям, используя имена атрибутов в верблюжьей форме в качестве ключей. Если набор данных недоступен (если браузер не совместим с HTML5 или спецификация набора данных не реализована в браузере), вы можете получить доступ к атрибуту, используя обычный метод поиска атрибутов.

Итак, если у вас есть:

 <script type="text/javascript">
var dataSet = document.getElementById("input1").dataset;
for(var key in dataSet) {
    console.log("attribute is: "   key);
    console.log(dataSet[key]);
}
</script>
<input type="text" id="input1" data-custom-attribute="some value"/>
  

Ответ №4:

Zepto поддерживает метод $(elem).data(«attr-name»), когда вы используете пользовательскую сборку Zepto с модулем «data». Таким образом, вы можете использовать тот же код для jquery и Zepto