Страницы

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

понедельник, 25 ноября 2019 г.

Зачем использовать 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 кодом не раз)


Ответы

Ответ 1



Для начала - немного теории. Эту ИМХО глупость, в свое время, начал 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'е, возможно, где-то, это удобно и практикуется большинством, тогда конечно - юзайте на здоровье (спасибо кэп).

Ответ 2



Обсуждение на StackOverflow и еще. Это поведение IE, которое было потом скопировано другими браузерами, и упомянут в стандарте HTML5. см. 5.2.4 Named access on the Window object. Суть заключается в том, что в данном случае обращение идет к свойству объекта window Другими словами, браузеры делают возможным доступ к элементам с указанным id через объек window, который является глобальным контекстом, поэтому window['id'] можно и не писать, достаточно id, ну за исключением невалидных id с точки зрения имени переменной (да, минусы и проч.)... Такая практика никому особо не нравится и идет речь, чтобы если не убрать данно поведение из стандарта, то сделать доступным хотя бы только для quirks mode, а standard mode не трогать. Consider making the global scope pollution by names/ids quirks-only

Ответ 3



Ответ просто в правильности подхода. Никто не гарантирует, что такой метод "проживет" или будет поддерживаться и дальше. А getElementById будет. Это примерно тоже самое, что и дорогу на красный свет переходить. Ведь можно, н никто не гарантирует, что после этого с вами ничего не произойдет. (Хотя в России может произойти и на зеленый). Но суть не в этом, а в том, что подходы разные и вероятность несчастного случая тоже. Тем более, если вдруг не будет поддержки этой штуки, то вам приедтся весь код просматриват и все менять. А если не будет поддержки getElementById, то я просто ее переобъявлю и она у меня появится :) И собственно ответ на вопрос - скорее отстанете от жизни, если будете его использовать :)

Ответ 4



А вы попробуйте дать элементу
TEXT
Как думаете, что будет пытаться сделать браузер при выполнении div-1? Правильно! Он будет пытаться от переменной div вычесть 1! Как в таком случае обойтись без выражения var mydiv = document.getElementById("div-1"); ??? UPD1 Еще можно добавить! Бывают элементы, создаваемые во время выполнения. Ну им, стал быть, ID даются динамически. Было бы глупо для таких случаев не динамически ставить переменные вот так: my_dynamic_id.onclick = function() { //Бла-бла-бла } Лучше, же, наверное, так: // начало какого-нибудь цикла обработки //.... //получаем ID из какой-нить функции, предоставляющей id элементов var my_id_i = document.getElementById(getNextDynamicId()); my_id_i.onclick = function() { //Бла-бла-бла } Тут как получается такая ситуация когда можно обращаться непосредственно к элемент my_div напрямую? Просто при создании этого DIV-элемента, появляется и глобальная переменная my_div. Но она перезапишется, объяви вы глобально переменную с таким же именем, как ID элемента: Тут, в первом случае, выведется "АГА!!!!", во втором что-то вроде "HTMLDivElement". Вот и получается, что ваше приложение может по ошибке или недосмотру сломаться из-за нечаянного объявления переменной с таким же именем, как ID, как у вашего элемента. Так что же вышло? Браузер сначала объявил глобальную переменную my_div, которую мы успешно переписали! Ну вот как-то так. Даже мой, приведенный тут случай, можно считать "подводным камнем".

Ответ 5



Отвечу в ответ на свой вопрос в споре ответов и комментариев отозвавшихся... Суть: Я всегда использую нативный js в рамках своих проетов, которыми занимаюсь только я. @Alex Silaev пожалуй ваш ответ пока лучший но учитывая часть вашего ответа: если не будет поддержки getElementById, то я просто ее переобъявлю и она у меня появится я напишу некий умный php скрипт котрый преобразует все нужные вхождения в нужны местах и отформатирует js скрипт под все мега новшества дабы не ковыряться в километровом js коде! На данный момент я не вижу причин не использовать тот метод который я привел в примере! Снова ословлюсь в рамках своего проекта! @Антон Мухин открою вам интересную функцию: function $(id) { return document.getElementById(id); } и далее можите использовать строку из моего примера в вопросе как $("div_1").onclick = function() //... Теперь скажу что в рамках своего проекта я чотко знаю что нужно использовать нижнее подчеркивание а не дефис, это вопервых. Во вторых я такую мишуру редко использую и в основном в css клсасах! Что относитс к программному коду и названиях ID происходит следующим образом var nodeName или id="idName" давно стараюсь исключать мишуру и лишние знаки!

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

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