Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

Зачем использовать getElementById, если можно получить элемент через переменную с именем, равным значению атрибута id?

Собственно век живи век учись!
window.onload = function() { div_1.onclick = function() { div_2.value = div_1.innerHTML; } }

TEXT

Работает во всех браузерах которые есть только на компе!
Вопрос: Зачем объявлять переменную типа как
var mydiv = document.getElementById("mydiv");
и потом к ней обращаться, если обращение можно сделать сразу к mydiv? Поясните!
UPD: @ling жду Ваш персональный визит! Ваши знания были испытаны собственным js кодом не раз)


Ответ

Для начала - немного теории. Эту ИМХО глупость, в свое время, начал IE, остальными браузерами это не поддерживалось, после - это стало поддерживаться хромом, в настоящее же время - такого рода поведение утвержденно html5 стандартом (да, и там кое-что через Ж, ну да не суть). Соответственно по поводу поддержки - это поддержка действительно на уровне.(за исключением того парадокса, что это не будет работать в старых не IE), более того - поддержка останеться и никуда она не денется, соответственно я не совсем понимаю - что правильного в ответе @Alex Silaev ? Ну а теперь перейдем к практической части, такого рода элементы хранятся в глобальной области видимости, соответственно, например, может возникнуть ситуация, типа:

классно работает!11!

var hello = function(){ /* function code... */ } hello.onclick = function(){ alert(this.innerHTML); } Что в таком случае произойдет я думаю понятно. Естественно кто-то может возразить, мол - если делать все акуратно, то все будет ок и я не отрицаю, нередко так все и будет. Но, мягко говоря - не всегда. Чем больше кода у вас будет - тем выше будет становиться вероятность поймать неприятный баг. Конечно если вы понимаете что глобальные переменные зло и т.д. и т.п. - вы будете грамотно структуировать свой код, но, в таком случае и элементы выбирать, тоже, будете по человечески. В противном случае - у вас идет жесткая привязка к структуре html, еще жоще чем при document.getElementById('someId'). На самом деле - все это выглядит как магия, соответственно просматривая код, банально, не понятно - откуда взялся, например, этот hello, особенно очевидным это становиться тогда, когда объемы кода становятся, хотя-бы 300+ строк. Допустим мне нужно изменить этот id, я меняю его в DOM'e, ищу по скриптам где он используется, но я так и не нахожу т.к. (уж будьте уверены) - искать я буду именно $ в случае jq, prototype и getElementById в случае "pure" JS, сейчас я пишу не в контексте себя лично, а в контексте человека который будет смотреть написанный вами код, вашего напарника или того, кто заменяет вас на работе. И, на самом деле - это нормально, знают это далеко не все и, даже в книгах, где об этом упомянаеться - кратко пишут мол, смотрите вот так вот можно делать, немного описывают как это работает и потом - можно, но не нужно и во всех книгах дальше пишется что-то типа - соответственно в нашей книге мы так делать не будем. Конечно я понимаю, что далеко не всегда в книгах все пишут правильно (особенно это справедливо с книгами по javascript'у), но то, что об этом написано далеко не во всех книгах и то, что, например, вы - до сиих пор не знали этого, по моему, уже говорит о том что никому это не нужно. оффтоп - и подтверждает поговорку "меньше знаешь - лучше спишь" =) Еще хотел бы добавить, к описаному выше, неудобство в плане парной работы с верстальщиком или, что, в данном случае, намного хуже - с другим JS разработчиком. Вообщем кратко резюмируя - так делать, в абсолютном большинстве случаев, мягко говоря - не рекомендую (не только я), причины (не выдумывая чего-то сложного, а, в реальной жизни, поверьте мне - будут проблемы поинтереснее) описаны выше. Что мы выигрываем? Да, собственно, практически ничего мы и не выигрываем... Еще одним "типа" аргументом может быть то, что это быстрее - возможно это и так, но getElementById работает настолько быстро (причем абсолютно везде), что руководствоваться этим - не серьезно. Но даже, если вы хотите, то сделайте хотя-бы как-то так: function getElementById(id) { return window[id] !== undefined && window[id].id === id ? window[id] : document.getElementById(id); } Собственно подобный подход решает проблему "стирания", но, в то-же время, невилизирует краткость записи. С другой стороны - эта функция будет нормально работать везде и в DOM, если элемент сохранился в window - не полезет. Еще раз акцентирую ваше внимание - это экономия на спичках. Парирую кусок UPD by @Антон Мухин по поводу id вида "div-id" - их легко и просто можно достать вызовом window["div-id"], ничего браузер не вычисляет. Постараюсь подвести очень краткие итоги - просто не используйте это, знайте для того, что-бы можно было понять как работает тот или иной javascript код, не более (ИМХО) PS: 2 @northerner никто не говорит что они там дураки, они хотят сделать как лучше. По поводу javascript без getElementById - если в вопросе явно спрашивается, "как лучше getElementById или так?", какое отношение к вопросу имеет то, о чем писали вы? Либо я чего-то недопонимаю, либо вы не внимательно читали вопрос. UPD: Время уже все показало, если бы это было-бы нужно это бы уже давно использовалось бы в широких кругах, т.к. ничего подобного не наблюдается - это никому не нужно (вернее кому-то нужно раз принимают такие стандарты, но вот кому - я без понятия). Еще раз подчерну - речь именно о браузерном javascript'е, возможно, где-то, это удобно и практикуется большинством, тогда конечно - юзайте на здоровье (спасибо кэп).

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

Отправить комментарий