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
  On 5/27/2011 at 4:23 PM, Int said:

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

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

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

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

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

  On 5/27/2011 at 4:49 PM, alanvanduke said:

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

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

  On 5/27/2011 at 1:15 PM, sigma77 said:

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

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

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

  On 5/27/2011 at 1:16 PM, Great Rash said:

Вообще это плохо... А если вдруг изменится структура 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
  On 5/27/2011 at 9:53 PM, s0rr0w said:

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

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

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

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

Link to comment
Share on other sites

  • 0
  On 5/27/2011 at 9:53 PM, s0rr0w said:

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

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

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

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

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

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

  On 5/27/2011 at 4:23 PM, Int said:

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

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

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

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

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

Link to comment
Share on other sites

  • 0
  On 5/28/2011 at 10:09 AM, Int said:

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

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

Link to comment
Share on other sites

  • 0
  On 5/28/2011 at 10:42 AM, sigma77 said:
Ну а представь проект отдали другому разработчику, заказчику
Я разработчик и я заказчик. Я пишу сайт для своего локалхоста. Если я кому-то его и отдам, то он сам этого хотел, я никому ничего не навязывал. Хоче - пусть разбирается. А уж я-то сам как-нибудь пойму, что яваскрипт у меня в .js, а меню, как ни странно, в menu.html.

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

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

Link to comment
Share on other sites

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

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

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

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

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

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

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

Link to comment
Share on other sites

  • 0
  On 5/30/2011 at 7:22 AM, Great Rash said:
  Quote
Как сделал бы я?

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

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

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

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

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

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

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

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

Link to comment
Share on other sites

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

  • 0
  On 5/30/2011 at 7:22 AM, Great Rash said:

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

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


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