Alexandroppolus, в этом году не смотрел, но в прошлом году вот replace child имел своеобразные глюки в сафари. А про range не знал. Возможно полезно, но я даже не смотря на казалось бы более правильный подход пользоваться этим не буду никогда. Какая-то лишняя ненужна абстракция. От того еще один querySelector появится никто не умрет.
Я щас проще к Safari загляну и предложу исправить данный недочет с обновлением узлов в closest. После этого все автоматически справится в Chrome, Yandex браузере, куче поделок из хромиума и возможно даже повлияет на FF потому что Safari разработчики первоисходных стандартов. Они это быстрее решают. Я год ждал ответа от MS по поводу бага в Edge. Они только недавно отписались и приняли статус issue.
Это конечно хорошо, но не правильно(если есть недоработки их не надо игнорировать путем выворачивания вселенной на изнанку). Наелись с IE - хватит. Щас еще андроида придется за это же убивать, но это уже другая история.
Даже если рассматривать Ваш пример, то тут очень много противоречий.
1. id уникален, он должен быть только один на странице. Следовательно, запись document.querySelectorAll('#shell') не имеет смысла, так как мы хотим получить один единственный элемент, а не коллекцию. Получается, что лучше тогда использовать document.querySelector (без "All"), но опять же, куда быстрее и правильней будет заюзать document.getElementById.
2. Нет смысла в два шага искать элементы с определённым классом внутри элемента с определённым id. Можно сразу:
document.querySelectorAll('#shell .somethin-in-shell')
Но это если конечно Вам не нужны оба элемента.
ruslan_mart, All у меня везде используется потому что я себе библиотеку написал которая сразу коллекциями работает, а не по одному элементу. Мне на эти копейки пофиг экномии.
By id. by class, tag name - это устаревшее барахло по моему. Опять же экономить на спичках, когда можно прикуривать шикарной Zippo.