Хакер писал(а):Это против «принципа лени». Если у вас сейчас есть ссылка на элемент, с которым вы хотите что-то делать, то ссылку надо сохранять в переменную, а не использовать поиск каждый раз, когда вам надо вновь получить ссылку на этот элемент.
Не так. Если была сформирована строка с html-разметкой, то никаких dom-объектов ещё нет. Потом, когда эта строка будет помещена в innerHTML чего-либо, браузер сам её распарсит, но никаких ссылок опять же не вернёт. Добавленные таким способом элементы всё равно придётся искать. Так зачем же их искать сразу, может быть пользователь даже не нажмёт ту кнопку, для обработчика которой это потребуется?
Ещё, если код передаётся с сервера, от опять же, никаких ссылок нет, всё что хочется использовать надо найти.
Дальше, если вызвать копирование некоторого куска, или даже просто переприсвоить содержимое, то все ссылки слетят.
К тому же, в старых браузерах (естественно, IE в первую очередь), обращение к переменным, находящимся в замыкании замедляет работу в разы. Так что получается, что если мы сохранили ссылку, а потом к ней обращаемся, то это выйдет медленнее, чем если мы найдём элементы, поместим ссылку в локальную переменную и будем работать с ней.
А ещё, если насохранять где-то ссылок на dom-объекты, то эти dom-объекты не могут быть уничтожены, т. е. получаем ещё и утечки памяти в добавок ко всему остальному.
В общем, получается проще, понятнее и безопаснее находить элементы по мере необходимости, чем запастись огромным запасом ссылок на все случаи жизни и мучаться, что половина поломалась, когда по мере работы кто-то что-то перезаписал. К тому же, вполне возможно, что со ссылками потребление памяти будет больше, чем без них.
Вот искать одно и то же в одной функции несколько раз - это плохой стиль, а искать какие-то элементы один раз на обработчик события - вполне нормально.
Хакер писал(а):Ох. А что мешало до этого снабдить любой DOM-элемент любым нужным тебе свойством?
Имеешь в виду
myDiv.asdfgh = { a: 10, b: "abc" };? Опять же, если потом сделать
container.innerHTML += "<p>Smth new</p>", то все эти свойства полетят нафиг, вместе со всеми сохранёнными ссылками на dom-объекты. А data-атрибуты и классы никуда не денутся. Ну и присвоить свойство можно только из скрипта. С сервера переслать dom-объект с заданным свойством тоже не выйдет, а с data-атрибутом (как и с любым другим) - без проблем.
Хакер писал(а):Вплоть до названия.
Ну не знаю. Мне jQuery'вские названия вполне нравятся - они короткие и относительно понятные. К тому же, в jQuery принято возвращать объект, с которым производятся действия, что (лично мне) очень удобно.
Хакер писал(а):Читаю код, и у меня фейспалм и мысль: «ну какого чёрта они сделали эту штуку так примитивно, негибко и недавльновидно и неэффективно».
Во-первых, а зачем там гибкость? Во-вторых, ты думаешь, что если каждый разработчик начнёт писать нечто подобное в каждом месте, где ему понадобилось использовать ajax, то код станет красивым и понятным?
Или какую негибкость ты имеешь в виду? Вроде метод ajax как раз весьма гибкий в плане использования...
PS: Вот интересный кусок кода (валидная html5-страница):
- Код: Выделить всё
<!doctype html>
<title>Magic</title>
<style>p+table{color:blue;}p>table{color:red;}</style>
<p><table><tr><td>1<td>2<tr><td>3<td>4</table>
<p data-inner-table="<tr><td>1<td>2<tr><td>3<td>4">
<p>
<script>Array.prototype.forEach.call(document.querySelectorAll("p[data-inner-table]"),function(p,t){p.appendChild(t=document.createElement("table"));t.innerHTML=p.attributes["data-inner-table"].value})</script>
<button onclick="document.body.innerHTML=document.body.innerHTML">Rehtml</button>
Что будет если нажать кнопочку?