jQuery: как получить текст из выпадающего списка (select) — полный разбор

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Вы когда-нибудь ловили себя на мысли: «Почему я получаю value, а мне нужен текст?»

Добро пожаловать на PythonLib! Сегодня мы разберем одну из самых популярных проблем, с которой сталкиваются как новички, так и опытные фронтенд-разработчики. Вы создаете красивую форму, добавляете выпадающий список (select box), пишете обработчик на jQuery… и вдруг понимаете, что вам нужен не value (числовой код страны, ID товара или что-то подобное), а человекочитаемый текст, который пользователь видит в меню.

Этот вопрос на Stack Overflow собрал тысячи просмотров и десятки ответов. Мы не просто скопируем один из них — мы разложим задачу по полочкам, покажем несколько способов решения и дадим готовый код, который вы сможете вставить в свой проект прямо сейчас. Поехали!

Проблема: value vs. text

Представьте типичный HTML-код:

<select id="citySelect">
    <option value="1">Москва</option>
    <option value="2">Санкт-Петербург</option>
    <option value="3">Новосибирск</option>
</select>

Когда пользователь выбирает «Санкт-Петербург», стандартный jQuery-код $('#citySelect').val() вернет «2». А что, если вам нужно отобразить на странице именно «Санкт-Петербург»? Или отправить в аналитику читаемое название? Тут-то и начинается магия DOM-навигации.

Решение №1: классический подход с .text()

Самый простой и интуитивно понятный способ — получить выбранный элемент <option>, а затем извлечь его текстовое содержимое.

$('#citySelect').on('change', function() {
    var selectedText = $(this).find('option:selected').text();
    console.log('Вы выбрали:', selectedText);
});

Как это работает?
$(this) — ссылка на наш select (внутри обработчика события).
.find('option:selected') — ищем среди дочерних option тот, у которого есть атрибут selected.
.text() — извлекаем чистый текст (без HTML-тегов).

Бонус: если у вас несколько select'ов на странице, используйте класс или ID вместо this.

Решение №2: используем .children() и .filter()

Иногда удобнее работать через фильтрацию дочерних элементов. Особенно если у вас сложная вложенность или кастомные теги.

$('#citySelect').on('change', function() {
    var selectedText = $(this).children('option:selected').text();
    // Альтернатива с filter:
    // var selectedText = $(this).children('option').filter(':selected').text();
    alert('Выбранный город: ' + selectedText);
});

Разница между find() и children() в том, что children() смотрит только на прямых потомков, а find() — на всех потомков любого уровня. Для стандартного select это не имеет значения, но полезно знать.

Решение №3: получаем текст при загрузке страницы

Часто нужно показать выбранный текст сразу, без ожидания события change. Например, при инициализации формы.

$(document).ready(function() {
    var initialText = $('#citySelect option:selected').text();
    $('#selectedCityDisplay').text('Текущий город: ' + initialText);
});

Этот код выполнится один раз при загрузке DOM и запишет текст выбранного по умолчанию option в элемент с ID selectedCityDisplay.

Решение №4: универсальная функция-помощник

Если вы пишете серьезное приложение, имеет смысл вынести логику в отдельную функцию. Так код станет чище и переиспользуемым.

function getSelectedText(selectId) {
    return $('#' + selectId + ' option:selected').text();
}

// Использование:
$('#citySelect').on('change', function() {
    var text = getSelectedText('citySelect');
    console.log('Текст выбранного пункта:', text);
});

Можно даже расширить jQuery, добавив свой собственный метод:

$.fn.selectedText = function() {
    return this.find('option:selected').text();
};

// Теперь можно писать так:
$('#citySelect').selectedText(); // вернет "Москва" или другой выбранный текст

Типичные ошибки и как их избежать

Даже опытные разработчики иногда спотыкаются на ровном месте. Вот три самых частых граблей:

  • Забыли обернуть код в обработчик ready. Если ваш скрипт выполняется до того, как DOM загружен, jQuery не найдет элементы. Всегда используйте $(document).ready(function() { ... }); или сокращенную форму $(function() { ... });.
  • Путаница с .val() и .text(). Запомните: .val() для select возвращает value выбранного option, а .text() — его содержимое. Не путайте!
  • Игнорирование мультиселектов. Если у select есть атрибут multiple, пользователь может выбрать несколько пунктов. В этом случае option:selected вернет первый элемент. Чтобы получить все выбранные тексты, используйте цикл:
$('#multiSelect').on('change', function() {
    var selectedTexts = [];
    $(this).find('option:selected').each(function() {
        selectedTexts.push($(this).text());
    });
    console.log('Выбрано:', selectedTexts.join(', '));
});

Живой пример с пояснениями

Давайте соберем все в единый рабочий пример. Предположим, у нас есть форма выбора пиццы:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Выбор пиццы</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <h3>Закажите пиццу:</h3>
    <select id="pizzaSelect">
        <option value="" disabled selected>Выберите пиццу</option>
        <option value="marg">Маргарита</option>
        <option value="pep">Пепперони</option>
        <option value="haw">Гавайская</option>
    </select>
    <p id="orderSummary">Вы ничего не выбрали.</p>

    <script>
        $(function() {
            $('#pizzaSelect').on('change', function() {
                var selectedText = $(this).find('option:selected').text();
                if (selectedText === 'Выберите пиццу') {
                    $('#orderSummary').text('Пожалуйста, сделайте выбор.');
                } else {
                    $('#orderSummary').text('Вы выбра                

Блоги

Рекомендаций по книгам