Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение select через ajax 
:(
    Опции темы
Mastodont
Дата 19.6.2013, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 18.3.2007

Репутация: нет
Всего: 1



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

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

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

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

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

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

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

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

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

Привожу код:

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

<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>

Код

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();
    
}


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

Код

///меняем высоту в зависимости от ширины
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'];

}


Это сообщение отредактировал(а) Mastodont - 19.6.2013, 17:50

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  matrasi_forum.png 5,93 Kb
PM MAIL   Вверх
Arantir
Дата 19.6.2013, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 14
Всего: 55



Проблема некоторых вопрошающих в том, что они выкладывают кучу ненужной информации и недостаточно нужной.
Если у Вас проблемы с JS, то PHP тут вообще ни при чем. Только место занимает. Ваши коды у себя все равно никто запустить не сможет и то, что они выводят, придется "экстрасенсить".
Картинка вообще непонятно зачем =)

Можете привести код select-ов из исходного кода страницы? Можете показать, что выходит после ajax-запроса (как меняется select) - так же из исходного кода страницы. В общем только то, с чем работает Ваш JS-код, без лишнего.
А так же то, каким образом Вы получаете ширину после ajax-запроса.
Ajax-запрос происходит по какому событию? Изменение значения select?

Скорее всего проблема в том, что Вы не учли тот факт, что запрос асинхронный.

Это сообщение отредактировал(а) Arantir - 19.6.2013, 18:10


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
valiko
Дата 19.6.2013, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 22.12.2011

Репутация: нет
Всего: нет



Привет. Я думаю что проблема в том, что вы генерируете список для select, а его самого не обновляете.
Вариант 1. Генерируйте все вместе (select и options), таким образом предыдущее значение стереться с DOM.
Вариант 2. Создайте div на JavaScript-е, добавьте в него новый select и удалите старый. Что то вроде этого скрипта. Надеюсь помог решить проблему
Код

<!DOCTYPE html>
<html>
<head>
<script>
var count = 0;
function displayDate()
{
var s = document.getElementById("i5");

var replacement = document.createElement("button");
replacement.setAttribute('id','i5');
replacement.setAttribute('type','button');
replacement.setAttribute('count',count);
replacement.setAttribute('onclick','displayDate()');
replacement.innerHTML = 'Display Date ' + count++;
document.getElementById("demo").removeChild(s);
document.getElementById("demo").appendChild(replacement);

}
</script>
</head>
<body>

<h1>My First JavaScript</h1>
<p id="demo">This is a paragraph.

<button id="i5" type="button" onclick="displayDate()">Display Date</button>
</p>
</body>
</html> 



Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW   Вверх
Mastodont
Дата 1.7.2013, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 18.3.2007

Репутация: нет
Всего: 1



Вариант 1 и вар. 2 что то не прокатил, хотя может не совсем правильно их использовал, так как js знаю чуть больше, чем основы.

Но я добавил в select пункт "выбрать высоту", что создало необходимость так или иначе выбирать какой либо его пункт. Теперь все ок smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0672 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.