Прежде всего, я согласен с вами, что в целом лучше использовать классовый подход.
Но я не думаю, что зашёл бы так далеко, чтобы сказать, что это меньше связывает код с пользовательским интерфейсом. Если вы подумаете об этом, если код принимает идентификатор «foo» и имя класса «foo», вы все равно должны знать это при работе с пользовательским интерфейсом. Между ними все еще есть «контракт» - неважно, встречаете ли вы его по ID или по классу.
Одним из недостатков использования подхода класса, который я себе представляю, является скорость - должно быть быстрее найти конкретный элемент по идентификатору, чем найти потенциально несколько элементов по классу. Разница, вероятно, совершенно незначительна.
Но в случае, когда ваш код предназначен для добавления нескольких вариантов поведения, как в примере с двумя выпадающими списками, использование класса, безусловно, имеет больше смысла. Это меньше связывает, так как ваш код немного более обобщен, и ваш пользовательский интерфейс с большей вероятностью может быть изменен без изменения кода.
Одна вещь, которую я бы изменил в обоих ваших примерах ... почему в селекторе есть UL? Если код знает, что он может работать только в том случае, если целью является UL, это одно, но в этом случае было бы лучше избегать UL в селекторе и позволить коду выдать значимую ошибку, если Обнаружено, что target не является UL, чтобы страница просто ничего не делала без указания причины (например, потому что UI поместил ID / класс в OL).
Другими словами, просто "#foo" или ".foo", а не "ul.foo" и т. Д.
Я должен отметить, что в случае, если кто-то считает, что UL каким-то образом делает селектор более эффективным, это не так, поскольку селекторы оцениваются справа налево.