Jump to content
  • 0

obj.parentNode.parentNode.parentNode...


DjTarik
 Share

Question

Вот такая ситуация:


<div>
<div>
<div>
<a href="#" id="link">link</a>
</div>
</div>
</div>

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

Чтобы не плодить кучу id, хотел сделать так:


var obj = document.getElementById('link');
obj.parentNode.parentNode.parentNode;

Меня смущает огромное кол-во 'parentNode'.

Так как я написал - это нормально вообще?

Или грамотнее присвоить диву id и обращаться к нему напрямую?

P.S. Повторю, что хотелось бы меньше 'id'-шников иметь в коде.

Спасибо.

Link to comment
Share on other sites

19 answers to this question

Recommended Posts

  • 0

Правильней присвоить id, имхо.

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

Link to comment
Share on other sites

  • 0

Нашёл из-за чего комплексовать.

getid('profilemenu').insertBefore(adminlink,getid('profilemenu').firstChild.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling);

Вчера написал.

И да, мамой клянусь, что структура не изменится сама по себе. А если я её буду менять, то позабочусь переписать и яваскрипт. Вы так пишете "вдруг изменится", как будто инопланетяне прилетят и без вашего ведома что-то поменяют.

Link to comment
Share on other sites

  • 0

Нашёл из-за чего комплексовать.

getid('profilemenu').insertBefore(adminlink,getid('profilemenu').firstChild.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling);

Вчера написал.

И да, мамой клянусь, что структура не изменится сама по себе. А если я её буду менять, то позабочусь переписать и яваскрипт. Вы так пишете "вдруг изменится", как будто инопланетяне прилетят и без вашего ведома что-то поменяют.

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

Действительно. Если блок сохраняет свою HTML структуру, то здесь ничего зазорного нет.

Гонево. Имхо.

Правильней присвоить id, имхо.

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

Пральна Оксан, я точно так же считаю, айдишник надёжнее в разы.

Вообще это плохо... А если вдруг изменится структура HTML? Получится, что скрипт перестанет работать.

Именно.

Link to comment
Share on other sites

  • 0

Родителя-то найти проще. А то получится как у меня. А представь, если бы у меня было 20 пунктов меню и надо вставить предпоследний пункт. А с родителями - всего один-два уровня вложенности.

Link to comment
Share on other sites

  • 0

Как сделал бы я?

Присвоил бы div'у некий класс, например "findMe"

А потом бы от ссылки путешествовал циклично вверх по дереву, пока не встретил нужный мне класс, и работал бы с найденным результатом уже.

У меня в библиотеке лежат весьма частоиспользуемые функции под названием getParentByClassName (или pcn) и getParentByTagName (или ptn).

  • Like 2
Link to comment
Share on other sites

  • 0

Как сделал бы я?

Присвоил бы div'у некий класс, например "findMe"

А потом бы от ссылки путешествовал циклично вверх по дереву, пока не встретил нужный мне класс, и работал бы с найденным результатом уже.

Конечно же, вот он отличный вариант, и я бы делал точно так же. ;)

Link to comment
Share on other sites

  • 0

Как сделал бы я?

Присвоил бы div'у некий класс, например "findMe"

А потом бы от ссылки путешествовал циклично вверх по дереву, пока не встретил нужный мне класс, и работал бы с найденным результатом уже.

У меня в библиотеке лежат весьма частоиспользуемые функции под названием getParentByClassName (или pcn) и getParentByTagName (или ptn).

Почему не присвоить айдишник родительскому блоку. И уже внутри него найти нужную ссылку ( по классу например ), и ей задать событие?

Хотя это зависит от ситуации.

Нашёл из-за чего комплексовать.

getid('profilemenu').insertBefore(adminlink,getid('profilemenu').firstChild.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling);

Вчера написал.

И да, мамой клянусь, что структура не изменится сама по себе. А если я её буду менять, то позабочусь переписать и яваскрипт. Вы так пишете "вдруг изменится", как будто инопланетяне прилетят и без вашего ведома что-то поменяют.

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

Link to comment
Share on other sites

  • 0

Не вижу никаких десятков файлов. Один файл html и один js-файл

Ну а представь проект отдали другому разработчику, заказчику, пресловутой секретарше Зиночке ;) и т.д., в проект уже могут вносится любые изменения, не подконтрольные тебе. Ну и не верю я в настолько уникальную память, чтобы помнить, что, где и почему было написано спустя месяц, полгода, год. С присвоением же айдишника или класса, скрипт будет продолжать работать.

Link to comment
Share on other sites

  • 0
Ну а представь проект отдали другому разработчику, заказчику
Я разработчик и я заказчик. Я пишу сайт для своего локалхоста. Если я кому-то его и отдам, то он сам этого хотел, я никому ничего не навязывал. Хоче - пусть разбирается. А уж я-то сам как-нибудь пойму, что яваскрипт у меня в .js, а меню, как ни странно, в menu.html.

И если вдруг этот пункт меню окажется не перед ссылкой "выход", а перед какой-то другой, со мной точно не случится сердечный приступ. Я вообще мог добавить его в конец, просто не логично ставить его после выхода. Можно было ещё вести отсчёт от последнего элемента, но это лишний код писать.

Проблем просто не будет, потому что я сильно сомневаюсь, что у меня когда-либо появится желание модифицировать этот сайт. До сих пор же не появилось желание доделать старые сайты, мне проще написать с нуля. А ещё я использую одинаковую структуру для своих сайтов, так что разберусь если нужно будет.

Link to comment
Share on other sites

  • 0
Как сделал бы я?

Присвоил бы div'у некий класс, например "findMe"

А потом бы от ссылки путешествовал циклично вверх по дереву, пока не встретил нужный мне класс, и работал бы с найденным результатом уже.

У меня в библиотеке лежат весьма частоиспользуемые функции под названием getParentByClassName (или pcn) и getParentByTagName (или ptn).

Рекурсия? Насколько это быстро?

Если я кому-то его и отдам, то он сам этого хотел, я никому ничего не навязывал. Хоче - пусть разбирается. А уж я-то сам как-нибудь пойму, что яваскрипт у меня в .js, а меню, как ни странно, в menu.html.

К сожалению так же думают и те, кто пишет скрипты не для локалхоста... И это очень печально.

Link to comment
Share on other sites

  • 0
Как сделал бы я?

Присвоил бы div'у некий класс, например "findMe"

А потом бы от ссылки путешествовал циклично вверх по дереву, пока не встретил нужный мне класс, и работал бы с найденным результатом уже.

У меня в библиотеке лежат весьма частоиспользуемые функции под названием getParentByClassName (или pcn) и getParentByTagName (или ptn).

Рекурсия? Насколько это быстро?

Рекурсия? А где тут рекурсия?

Если я кому-то его и отдам, то он сам этого хотел, я никому ничего не навязывал. Хоче - пусть разбирается. А уж я-то сам как-нибудь пойму, что яваскрипт у меня в .js, а меню, как ни странно, в menu.html.

К сожалению так же думают и те, кто пишет скрипты не для локалхоста... И это очень печально.

Да, это точно :)

Link to comment
Share on other sites

  • 0
К сожалению так же думают и те, кто пишет скрипты не для локалхоста... И это очень печально.
Я обычно пишу на заказ сайты по 500 рублей, так что винить меня за мой код никому в голову не придёт :) Да и "обычно" - это раза 2-3 за всё время. И то один раз только диплом здать и забыть, а другой раз он даже до сих пор в инете висит, но на него наверное забили.
Link to comment
Share on other sites

  • 0

Рекурсия? Насколько это быстро?

Нет, не рекурсия.


var $pcn = function ( node, className ) {
try {

var node = $( node );

while ( node.parentNode && !$matchClassName( node.parentNode, className ) ) {
node = node.parentNode;
};
if ( !node.parentNode ) return;
return node.parentNode;

} catch ( e ) { return }
}

Самая медленная инструкция тут - $matchClassName.

Да и скорость выполнения этой операции не сильно важна, так как в 99% случаев делается всего один раз

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy