Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2013, 18:49   #1
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию Определение select через ajax

На странице товара интернет-магазина выводится нормальная цена товара, цена со скидкой, а также списки <select> для выбора ширины и высота матраса.

Также есть mysql таблица, в которой содержатся отношения [id товара] - [ширина] - [высота] - [цена] - [цена со скидкой]

При первоначальной загрузке страницы в select ширины попадает минимальное значение ширины из таблицы для данного товара. Чтобы сформировать список select высот товара, из таблицы выбираются все высоты для данного id товара и выбранной (в данном случае минимальной) ширины товара.

Соответственно, в поля цены и цены со скидкой выводятся цифры, соответствующие выбранным в данный момент в списках select ширины и высоты

Затем интереснее:

при изменении ширины меняется select высот - он заполняется новыми "ширинами" для выбранной высоты. Это работает

Далее на основании вновь измененной ширины и высоты должны выводится новые цены. Так вот тут не работает. Происходит такая вещь:

при выборке цены используется не новая ширина, а ровно предыдущая. То есть js-код width_matras = document.getElementById('matras_wid th_select').value обновляет переменную ровно при следующем перевыборе списка ширины.

Кто знает, почему ровно предыдущая? почему js не может сразу определить значения select-списка, только что замененного через ajax?

Привожу код:

select'ы ширины и высоты на странице товара

PHP код:
<select id="matras_width_select" name="matras_width_select" onchange="ch_gabarity(); ch_cena_of_gabarity();">
                <?php
        $tovar_gabarity_query 
"SELECT tovar_shir FROM tovar_size WHERE tovar_id = '{$data['data_id']}' GROUP BY tovar_shir";
        
$tovar_gabarity_result mysql_query($tovar_gabarity_query);
        
        if (!
mysql_num_rows($tovar_gabarity_result) or $tovar_gabarity_result == false) {
        } else {
        
            while (
$tovar_gabarity_data mysql_fetch_assoc($tovar_gabarity_result)) {
            
                echo 
'<option value="'.$tovar_gabarity_data['tovar_shir'].'">'.$tovar_gabarity_data['tovar_shir'].'</option>';
            
            }
        
        }
        
?>
</select>
<select id="matras_height_select" name="matras_height_select" onchange="ch_cena_of_gabarity();">
                <?php
        $tovar_gabarity_query 
"SELECT tovar_visota FROM tovar_size WHERE tovar_id = '{$data['data_id']}' GROUP BY tovar_visota";
        
$tovar_gabarity_result mysql_query($tovar_gabarity_query);
        
        if (!
mysql_num_rows($tovar_gabarity_result) or $tovar_gabarity_result == false) {
        } else {
        
            while (
$tovar_gabarity_data mysql_fetch_assoc($tovar_gabarity_result)) {
            
                echo 
'<option>'.$tovar_gabarity_data['tovar_visota'].'</option>';
            
            }
        
        }
        
?>
        </select>
Сам ajax находится в конце <head>

Код HTML:
function ch_gabarity() {
    //получаем id товара
    var item_id = document.getElementById('item_id').value;
    
    //получаем выбранную ширину
    var width_matras = document.getElementById('matras_width_select').value;
    
    //ограничиваем список "высота" в зависимости от списка "ширина"
    abc_query = new XMLHttpRequest();
    abc_query.onreadystatechange = function() {
        if (abc_query.readyState == 4 && abc_query.status == 200) {
            document.getElementById('matras_height_select').innerHTML = abc_query.responseText;
            
            }
    }
    abc_query.open("GET", "http://<?php echo $parameters['project_url']; ?>/system/ajax_action.php?tovar_id=" +item_id+ "&shirina=" +width_matras+ "&ch_select=1", true);
    abc_query.send();
}
function ch_cena_of_gabarity() {
    //получаем id товара
    var item_id = document.getElementById('item_id').value;
    
    //получаем выбранную ширину
    var width_matras = document.getElementById('matras_width_select').value;
    
    //получаем выбранную высоту
    
    var height_matras = document.getElementById('matras_height_select').value;
    
    //меняем цену и цену со скидкой товара в зависимости от выбранной ширины или высоты
    xhttp=new XMLHttpRequest();    
    xhttp.onreadystatechange=function() {    
        if (xhttp.readyState==4 && xhttp.status==200)
            document.getElementById('cena').innerHTML=xhttp.responseText;    
    }    
    xhttp.open("GET", "http://<?php echo $parameters['project_url']; ?>/system/ajax_action.php?tovar_id=" +item_id+ "&shirina=" +width_matras+ "&visota=" +height_matras+ "&ch_cena=1", true);    
    xhttp.send();
    
}
fs444 вне форума Ответить с цитированием
Старый 19.06.2013, 18:49   #2
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию

И php-код, исполняющий ajax-запрос

PHP код:
///меняем высоту в зависимости от ширины
if ($_GET['ch_select'] == 1) {
    
$select_aviable_visota_query "SELECT * FROM tovar_size WHERE tovar_id = {$_GET['tovar_id']} AND tovar_shir = '{$_GET['shirina']}';";
    
$select_aviable_visota_result mysql_query($select_aviable_visota_query);
    
    while (
$select_aviable_visota_data mysql_fetch_assoc($select_aviable_visota_result)) {
    
        
$select_option .= '<option>'.$select_aviable_visota_data['tovar_visota'].'</option>';
    
    }
    
    echo 
$select_option;
}
//меняем цену и цену со скидкой в зависимости от ширины и высоты
if ($_GET['ch_cena'] == 1) {
    
    
$tovar_size_query "SELECT * FROM tovar_size WHERE tovar_id = '{$_GET['tovar_id']}' AND tovar_shir = '{$_GET['shirina']}' AND tovar_visota = '{$_GET['visota']}';";
    
$tovar_size_result mysql_query($tovar_size_query);
    
    if(!
mysql_num_rows($tovar_size_result) or $tovar_size_result == FALSE) {
    } else 
$tovar_size_data mysql_fetch_assoc($tovar_size_result);
            
        
$abc '<div style="float:left; margin:-3px 15px 0 0;"><h3>Цена</h3></div>
            <div style="text-align:center; margin:10px 10px 0 0;color:#abb8c2; font-size:12px; text-decoration:line-through; float:left; ">от '
.ru_number($tovar_size_data['tovar_old_cena']).' руб</div>
            <span id="cena_matrasa">'
.ru_number($tovar_size_data['tovar_cena']).' руб.</span>
            <div class="null"></div>'
;
            
    echo 
$_GET['visota'];

Изображения
Тип файла: jpg matrasi_forum.jpg (5.7 Кб, 125 просмотров)
Тип файла: jpg matrasi_tablice.jpg (20.8 Кб, 37 просмотров)
fs444 вне форума Ответить с цитированием
Старый 01.07.2013, 16:54   #3
fs444
Форумчанин
 
Регистрация: 18.08.2009
Сообщений: 289
По умолчанию

добавил в select пункт "выбрать высоту", что создало необходимость так или иначе выбирать какой либо его пункт. Теперь все ок
fs444 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка изображения через jquery ajax lansh JavaScript, Ajax 8 03.01.2013 22:42
Отправка всего <select> через POST Dexes PHP 5 30.01.2012 13:32
Сохранение данных в сессию через AJAX Dexes PHP 11 17.01.2012 20:46
Получить список доступных баз данных через select. hk47 БД в Delphi 5 13.04.2010 13:31
Ajax проблема с прокруткой колёсика обьекта Select slips JavaScript, Ajax 4 31.12.2009 04:04