Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Где хранить id (https://javascript.ru/forum/jquery/35698-gde-khranit-id.html)

Shitbox2 19.02.2013 11:45

Где хранить id
 
На сайте несколько меню, которые генерируются скриптом. Например ul.#menu1 и ul.#menu2, у каждого элемента внутри свой айдишник.

Логично было бы хранить их как li.#1, li.#2, ... Но т.к. меню два, то айдишники элементов будут повторяться, чего быть не должно. Поэтому храню как li.data('id',1), li.data('id',2), ...

Насколько плох первый способ (li.#1, li.#2, ...)? Действительно ли так критичен повтор в атрибуте id?

ffx 19.02.2013 11:50

а почему не class?

danik.js 19.02.2013 12:39

Shitbox2, а зачем вам эти как бы id?
Цитата:

Сообщение от Shitbox2
Действительно ли так критичен повтор в атрибуте id

Выборка по id вернет только один элемент с указанным id, причем какой из существующих - в спецификации не определено. И я подозреваю что каждый браузер как хочет так и делает. Не проверял, ибо не вижу необходимости в этом.

Deff 19.02.2013 12:49

Цитата:

Сообщение от Shitbox2
Выборка по id вернет только один элемент с указанным id

Давнишние дебаты http://javascript.ru/forum/misc/9459...tml#post193838

danik.js 19.02.2013 12:55

Deff, ты упустил один момент. Вопрос задан в контексте jQuery. А jQuery использует getElementById для селекторов типа #id. А getElementById возвращает только один элемент, причем какой из всех - спецификцией не определено.

Deff 19.02.2013 14:58

Если обернуть каждое меню в div c разными Id,
То достаточно просто обеспечить поиск идентичных Id в контексте данных разных оберток
<script src="http://code.jquery.com/jquery-latest.js"></script>
<div id=Wrp1>
  <ul id=menu>Тут меню 1   </ul>
</div>

<div id=Wrp2>
  <ul id=menu>Тут меню 2  </ul>
</div>

<script type="text/javascript">
var div1=$('#Wrp1');
var div2=$('#Wrp2');
alert($('#menu',div1).text()+'\n'+ $('#menu',div2).text())
</script>

рони 19.02.2013 15:49

Цитата:

Сообщение от Deff
$('#menu',div1).text()+

и каким боком здесь #menu учавствует?

Deff 19.02.2013 16:22

<script src="http://code.jquery.com/jquery-latest.js"></script>
<div id=Wrp1>
  <ul id=menu>Тут меню 1  </ul>
</div>

<div id=Wrp2>
  <span>участвует?</span>
  <ul id=menu>Тут меню 2  <span>и каким боком здесь #menu участвует?</span></ul>
</div>

<script type="text/javascript">
var div1=$('#Wrp1');
var div2=$('#Wrp2');
alert($('#menu',div1).text()+'\n\n'+ $('#menu span',div2).text())
</script>

Deff 19.02.2013 17:02

рони,
Cуть задачи поставить две менюшки с идентичными тегами и разным контентом и по возможности или использовать один скрипт для их работы(к примеру скрытия вкладок) для обоих меню; либо два скрипта, - второй скрипт с минимальными правками:
Пока две версии правки для варианта c двумя скриптами:

поправить все ID во втором скрипте и самом контенте меню:
#menu на #menu-2,

либо обернуть каждое меню в свой div и заменить в скрипте:
"#menu" на "#menu",div2

рони 19.02.2013 17:15

Deff,
Подскажите где про $('#menu',div1) такую выборку прочитать можно?
вот так бы я понял $("#Wrp2 #menu span").text()

рони 19.02.2013 17:24

Дзен-трансгуманист,
спасибо

Shitbox2 19.02.2013 21:38

NodeList с поиндексным доступом. Что за зверь такой? А как не хранить id? Каждый пункт меню должен содержать информацию в себе для связи с БД. Пункт может удалить или изменить себя или поменять положение в списке, но связь не должна нарушаться

danik.js 19.02.2013 21:47

<ul>
    <li>Item 0</li>
    <li>Item 1</li>
    <li class="item">Item 2</li>
</ul>
<script>
    var nodeList = document.querySelectorAll('ul li');
    alert( nodeList[1] );

    var item = document.querySelector('.item');
    // приведем NodeList к Array
    var array = Array.prototype.slice.apply(nodeList);
    alert ( array.indexOf(item) );
</script>


для jQuery соответственно это $(el).index();

Deff 19.02.2013 21:49

Shitbox2,
Заготовить массивы элементов для каждого меню
тогда удобнее проставлять классы(или даже тегов достаточно), нет смысла в id,
<ul>
  <li>Контент1
        <li>под-Контент1</li>
  </li>
  <li>Контент2</li>
  <li>Контент3</li>
</ul>

[ li.[Контент1,li.[под-Контент1]], li.[Контент2], li.[Контент3] ]

danik.js 19.02.2013 21:50

Вобще, без толку гадать пока Shitbox2 не объяснит нормально че к чему.

Shitbox2 20.02.2013 01:29

Цитата:

Сообщение от danik.js (Сообщение 235634)
Вобще, без толку гадать пока Shitbox2 не объяснит нормально че к чему.

Как еще объяснить-то? Вот пример, недавно делал: http://tamtakoe.ru/photoalbum/

Загружаете туда фотки (хоть всю папку кидаете), он создает для каждой элемент LI и этому элементу присваивается id-шник строки с картинкой из БД. Фотке можно приписать заголовок, соответственно поле обновляется по этому id, при удалении фотки на сервер так же отправляется запрос с удаляемым id, если поменять миниатюры местами, отправится список всех id в новом порядке. Сейчас id хранятся в $('li').data(). Это вполне удобно, но пустует специально созданный для такого атрибут id

danik.js 20.02.2013 01:58

Цитата:

Сообщение от Shitbox2
но пустует специально созданный для такого атрибут id

По задумке id должен быть уникален в пределах документа. Если так, то можно использовать.

ksa 20.02.2013 09:06

Цитата:

Сообщение от Shitbox2
Каждый пункт меню должен содержать информацию в себе для связи с БД.

Для "связи с БД" можно использовать любой атрибут...

<li idRec='ИД_из_БД'>...</li>

Т.е. не обязательно смешивать ИД записи в БД и ИД ДОМ-элемента...

danik.js 20.02.2013 09:37

Цитата:

Сообщение от ksa
можно использовать любой атрибут

Впринципе можно. Но в таком случае лучше использовать data-* атрибуты.

ksa 20.02.2013 09:43

Цитата:

Сообщение от danik.js
Но в таком случае лучше использовать data-* атрибуты.

Это уже как пожелаешь...:D

danik.js 20.02.2013 10:01

Цитата:

Сообщение от ksa
Это уже как пожелаешь...

Лучше не вы*бываться и делать так как предлагает спецификация, если нет особых причин не делать этого :)
Тем более что в перспективе - это доступ через свойство element.dataset.*

ksa 20.02.2013 10:02

Цитата:

Сообщение от danik.js
Лучше не вы*бываться и делать так как предлагает спецификация

Эва! :D

danik.js 20.02.2013 10:09

ksa, ты наверно так страницы верстаешь:
<!DOCTYPE html MYDOCTYPE>
<html>
<body>
    <style>
        шапка{
            ...
        }
    </style>
    <шапка>
        <меню>...</меню>
    </шапка>
    <абзац></абзац>
</body>

Какая разница что нужно использовать <header> и <nav> - кого это волнует? Так то удобнее! :D

ksa 20.02.2013 10:55

Цитата:

Сообщение от danik.js
ты наверно так страницы верстаешь

Наверно... :D

Цитата:

Сообщение от danik.js
Так то удобнее!

Разве нет? :blink:

danik.js 20.02.2013 10:57

Цитата:

Сообщение от ksa
Разве нет?

Ну если это работает в IE (надеюсь и в Firefox), и редактор кода подсвечивает нормально (ST2 не хочет), то да, удобнее). А еще можно javascript на кириллице писать, но это не совсем удобно :)

ksa 20.02.2013 11:09

Цитата:

Сообщение от danik.js
А еще можно javascript на кириллице писать, но это не совсем удобно

Я писал как-то на "e-practiс"... Там все по русски... Не особо понравилось. :(

Shitbox2 20.02.2013 14:25

По слухам $elem.data('id') работает быстрее чем $elem.attr('data-id'), т.к. первый не обращается к DOM. Это так?

danik.js 20.02.2013 14:39

Shitbox2, у тебя там сверхнагруженное приложение, в котором обращение к id идет миллионы раз в секунду? Тогда да, первое быстрее.

Shitbox2 20.02.2013 17:13

Нет, не высоконагруженное. Но если нет разницы, зачем платить больше? Еще в jQuery $elem.data('id') практически равен $elem.attr('data-id').
Т.е. <div data-id="9"></div> $('div').data('id') вернет 9, хотя обратная запись работать не будет. Дата-атрибуты можно использовать как значения по-умолчанию, больше плюсов в них не насмотрел...

danik.js 20.02.2013 17:51

Цитата:

Сообщение от Shitbox2
Дата-атрибуты можно использовать как значения по-умолчанию, больше плюсов в них не насмотрел...

Все верно )

ksa 21.02.2013 11:58

Цитата:

Сообщение от Shitbox2
Т.е.
<div data-id="9"></div>
$('div').data('id')
вернет 9, хотя обратная запись работать не будет. Дата-атрибуты можно использовать как значения по-умолчанию, больше плюсов в них не насмотрел...

Как плюс можно еще записать невозможность его изменить ;)

рони 21.02.2013 12:16

Цитата:

Сообщение от Shitbox2
хотя обратная запись работать не будет

Цитата:

Сообщение от ksa
невозможность его изменить

немного непонял чего нельзя изменить?
<!DOCTYPE HTML>

<html>

<head>
  <title></title>
<meta charset="utf-8" />
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>

<body>
<div data-id="9"></div>
<script type="text/javascript">
var id = $('div').data('id');
alert(id);
$('div').data('id', 10)
id = $('div').data('id');
alert(id);
</script>

</body>

</html>

ksa 21.02.2013 13:54

Цитата:

Сообщение от рони
чего нельзя изменить?

Выше писали
Цитата:

Сообщение от Shitbox2
Т.е.
<div data-id="9"></div>
$('div').data('id')
вернет 9, хотя обратная запись работать не будет

Основываясь на этом я и писал... :(

danik.js 21.02.2013 14:33

рони, ты не понял. ('div').data('id', 'xxx') не меняет значение атрибута data-id

рони 21.02.2013 15:16

danik.js,
ок

ksa 21.02.2013 15:21

Цитата:

Сообщение от danik.js
('div').data('id', 'xxx')
не меняет значение атрибута data-id

Почему тогда в его примере алерты с разными значениями?

рони 21.02.2013 15:24

Цитата:

Сообщение от ksa
Почему тогда в его примере алерты с разными значениями?

<!DOCTYPE HTML>

<html>

<head>
  <title></title>
<meta charset="utf-8" />
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>

<body>
<div data-id="9"></div>
<script type="text/javascript">
var id = $('div').data('id');
alert(id);
$('div').data('id', 10)
id = $('div').data('id');
alert(id);
$('div').wrap("<div></div>");
alert($('div').html());
</script>

</body>

</html>

ksa 21.02.2013 15:26

рони, так я и не понял почему второй алерт показал 10... :(

рони 21.02.2013 15:34

ksa,
видимо потому что дата работает свойством обьекта когда он есть/был проинициализирован data('id', 'xxx') а не с атрибутом.

ksa 21.02.2013 15:37

Цитата:

Сообщение от рони
видимо потому что дата работает свойством обьекта когда он есть/был проинициализирован data('id', 'xxx') а не с атрибутом.

Это фигово...
А я уш было обрадовался такому методу... Непонятки получаются. Вроде как значение атрибута осталось (что мне и нужно), а взять то значение - банан!


Часовой пояс GMT +3, время: 08:22.