Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/47: Рейтинг темы: голосов - 47, средняя оценка - 4.57
 Аватар для dunmaksim
1 / 1 / 5
Регистрация: 24.04.2013
Сообщений: 45

Заполнение select через AJAX и JavaScript

28.08.2013, 16:18. Показов 9447. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Заполняю данные в select через AJAX вот так:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function loadProjectsList() {
    /**
     * Выполняет отрисовку данных, полученных при загрузке через AJAX. Делает
     * выбранным первый элемент списка.
     *
     * @param {array} data Массив данных в формате JSON
     *
     * @returns {undefined}
     */
    function showProjects(data) {
        var options = '';
        for (var i = 0; i < data.length; i++) {
            options += "<option value='" + data[i]['id'] + "'>"
                    + data[i]['shortname'] + "</option>\r\n";
        }
        $("#projectsSelect").html(options);
    }
 
    $.post(
            "index.php?do=Projects/GetData&format=options",
            {},
            showProjects,
            'json'
            );
    $("#projectsSelect").attr("selectedIndex", 0);
  //$("#projectsSelect").children("option :first).prop("selected", "selected"); не дает эффекта
}
Затем, когда я хочу построить дерево, куда в качестве параметра для загрузчика данных передается значение выбранного элемента этого списка, начинаются проблемы.
Главная проблема в том, что
JavaScript
1
$("#projectsSelect :selected").text(); //Возвращает Undefined
Если выбрать в списке значение вручную, то функция возвращает то, что и положено. Что можно сделать с этим? Где я ошибаюсь? Функцию loadProjectsList вызываю в событии страницы onload ($(document).ready(...); не решает проблему, проверял).

Добавлено через 1 час 4 минуты
Поиск в интернете говорит, что дело тут в том, что браузеры не выполняют перерисовку DOM до завершения выполнения скрипта, поэтому получается, что вызываемая в скрипте функция пытается возвратить значение элемента, который в DOM ещё не вставлен. В качестве обходного решения можно использовать такую конструкцию:
JavaScript
1
$("#projectsSelect").one("click", loadProjectsList).on("change", changeProject);
Несколько десятков строк спустя:
HTML5
1
2
3
4
5
<div id="projectsList">
    <select id="projectsSelect">
        <option>Проекты</option>
    </select>
</div>
Т.е. изначально список содержит только одно значение - собственное название. При клике этот обработчик выполняет загрузку значений и самоуничтожается. В списке остаются только загруженные значения, которые будут работать корректно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.08.2013, 16:18
Ответы с готовыми решениями:

Заполнение select всеми результатами запроса php (jQuery и ajax)
Доброго времени суток. Проблема такая: Я посылаю php идентификатор человека (посылаю аяксом). Принимаю его на стороне сервера. И...

Как передать через AJAX multiple select через serialize и обратиться к этому в php
Добрый день, подскажите пожалуйста. Раньше не было множественного выбора в select, передавал данные следующим образом: ...

Определение select через ajax
На странице товара интернет-магазина выводится нормальная цена товара, цена со скидкой, а также списки &lt;select&gt; для выбора ширины и...

6
0 / 0 / 0
Регистрация: 22.08.2013
Сообщений: 11
29.08.2013, 02:45
Сталкивался с этим, повесь обработку новых данных на setTimeout с задержкой в секунду
0
 Аватар для dunmaksim
1 / 1 / 5
Регистрация: 24.04.2013
Сообщений: 45
29.08.2013, 08:28  [ТС]
Пробовал, не помогает. После долгих опытов вчера решил пойти альтернативным путем.
Решение:
1. Создаем изначально список <select> с одной единственной опцией, например, так:
HTML5
1
2
3
<select id="projectsSelect">
    <option>Проекты</option>
</select>
2. При загрузке страницы один из инициализирующих скриптов выглядит так:
JavaScript
1
2
3
$("#projectsSelect")
    .one("click", loadProjectsList)  //Функция loadProjectsList отработает лишь один раз, загружая содержимое списка
    .on("change", changeProject); //Теперь на событие изменения содержимого списка вешаем обработчик, как положено
Это приводит к тому, что,
а) изначально в списке есть лишь его название
б) при нажатии на список он заполняется данными и пользователю приходится выбрать хоть что-нибудь, потому что изначальный вариант ("Проекты" в данном случае) отсутствует.
Надеюсь, мое решение кому-нибудь пригодится.
0
странник
 Аватар для Donald28
810 / 481 / 108
Регистрация: 28.05.2012
Сообщений: 1,518
Записей в блоге: 2
29.08.2013, 13:22
а нельзя вставлять эти options с помощью php при загрузке страницы?
0
 Аватар для dunmaksim
1 / 1 / 5
Регистрация: 24.04.2013
Сообщений: 45
29.08.2013, 15:09  [ТС]
Это плохое решение. Во-первых, увеличение трафика. Во-вторых, требует создания отдельного метода для представления существующих данных. Куда как удобнее в логике кода прописать метод printAsJSON, данные из которого парсятся у клиента через JS, чем под каждый случай писать свой метод (printAsSelect, printAsUl, printAsTable и т.д.)
0
странник
 Аватар для Donald28
810 / 481 / 108
Регистрация: 28.05.2012
Сообщений: 1,518
Записей в блоге: 2
29.08.2013, 15:21
причем тут увеличение трафика?
я так понял, что вам нужно получить список
HTML5
1
2
3
<select id="projectsSelect">
    <option>Проекты</option>
</select>
до загрузки страницы, чтобы зависимости от выбранного пункта получить доп данные уже через ajax?
причем указанный список, я так понял берется из БД.
так что вам мешает сделать так:
PHP
1
2
3
4
5
<select id="projectsSelect">
    <?php
        // тут пишите код для нахождения нужных значений
    ?>
</select>
Добавлено через 7 минут
Цитата Сообщение от dunmaksim Посмотреть сообщение
JavaScript
1
2
//$("#projectsSelect").children("option :first).prop("selected", "selected"); не дает эффекта
}
Не должно быть пробела и закрывающие кавычки потерял
JavaScript
1
children("option:first")
0
 Аватар для dunmaksim
1 / 1 / 5
Регистрация: 24.04.2013
Сообщений: 45
29.08.2013, 15:40  [ТС]
С кавычками полностью согласен. А вот загрузка данных всё равно должна производиться через AJAX. У меня всё приложение работает через Front Controller, поэтому данные должны загружаться без перезагрузки страницы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.08.2013, 15:40
Помогаю со студенческими работами здесь

Получить значение SELECT через AJAX
Люди добрые,подскажите как мне передать значение выбранного SELECT-а в php переменную без перезагрузки страницы. Использую такой код:...

Заполнение формы через ajax
Здравствуйте. Хочу сделать что-то вроде интерфейса для работы с карточками сотрудников. БД на MSSQL. Есть форма с выбором сотрудника из...

Как добавить в mysql из выбранного SELECT через ajax?
Есть таблица. Два столбца - Дисциплина и Ответственный. В первый из базы mysql подгружается список дисциплин: &lt;?php $query...

Обноление select после добавления данных через ajax
С сервера пришли данные в формате: &lt;option selected&gt;--&lt;/option&gt; &lt;option selected&gt;info&lt;/option&gt; ... Я их в добавляю в выпадающий...

работа с вк api через ajax+javascript
Всем привет! Подскажите, можно ли делать запросы к api вк через ajax. Если можно, дайте пример пожалуйста) А то у меня что то не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru