Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.02.2017, 23:07
Интересующийся
Отправить личное сообщение для DeathDji Посмотреть профиль Найти все сообщения от DeathDji
 
Регистрация: 20.02.2017
Сообщений: 18

Ajax-Javascript обратная связь
Не могу получить информацию обратно. Нужно с помощью ajax мне моментально выводилась стоимость. Сразу же после того как ввиду длину и высоту и походу от моих действий изменялась.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Calculator</title>
    <link href="style.css" type="text/css" rel="stylesheet">
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
	 <script src="analytics.js"></script>
    <script type="text/javascript" src="script.js"></script>
	<!--<script type="text/javascript" src="calc.js"></script>
	<script>
		function funcGiff() {
			$("#information").text ("Please wait...");
        }

        function funcSuccess(data) {
            $("#information").text (data);
        }

		$(document).ready (function () {
            $("#load").bind("click", function () {
                //var itogo = "Стоимость:";
                var res = itog;
                $.ajax({
                    url: "www.php",
                    type: "POST",
                    data: ({name : res}),
					dataType: "js",
					beforeSend: funcGiff,
					success: funcSuccess
                });
            });
        });
	</script>-->
</head>
<body>
    <div class="content_calck">
		<div class="fix">
			<div class="top"><canvas id='example'></canvas></div>
		</div>
	</div>	
	
	
	
	<div class="content_calck_block_2">	
		<div class="fix">
		<h2>Рассчитать <span style="color: #ffb400;">стоимость</span></h2>
			<div class="calc">
				<center>
				<form id="load" name="form1">
					<table border=1 cellpadding=5 cellspacing=0>
						<table>
							
							<tr>
								<td>Вид лесов</td>
								<td id="les">
									<input  type=radio name="vidlesov" value="lrsp30" checked><label>ЛРСП-30</label>


									<input  type=radio name="vidlesov" value="lrsp40"><label>ЛРСП-40</label>


									<input  type=radio name="vidlesov" value="lrsp60"><label>ЛРСП-60</label>


									<input  type=radio name="vidlesov" value="lrsp100"><label>ЛРСП-100</label>
								</td>
							</tr>
							<tr>
								<td>Длина и высота объекта</td>
								<td><input class="block" type="namber" name="d" placeholder="Длина, м" size=15 maxlength=10 required>
								<input type="namber" name="h" placeholder="Высота, м" size=15 maxlength=10 required></td>
							</tr>
							<tr>
									<p class="cratno">кратно 3</p>
								<td>Число рабочих ярусов</td>
								<td><input  type="namber" name="yarus" size=15 maxlength=10 required></td>
							</tr>
							<tr>
								<td>Комплектация связями</td>
								<td>
									<input type=radio name="connect" value="chess" checked>шахматный порядок
									<input type=radio name="connect" value="solid">сплошная
								</td>
							</tr>
							<tr>
								<td>Количество подъемов</td>
								<td><input name="ascent" type="namber" placeholder="2" required></td>
							</tr>
							<tr>
								<td>Комплектация опорами</td>
								<td>
									<input type=radio name="support" value="yes" checked>да
									<input type=radio name="support" value="no">нет
								</td>
							</tr>
							<tr>
								<td>Комплектация кронштейнами</td>
								<td>
									<input type=radio name="bracket" value="yes" checked>да
									<input type=radio name="bracket" value="no">нет
								</td>
							</tr>
							<tr>
								<td>
									<!--<input type="button" name="button" value="Вычислить" onClick="areaRectangle();"><br><br>
									<input type="text" name="res" size="10">-->
								</td>
							</tr>
						</table>
					</td></tr></table>
					<div id="information" name="res1"></div>
				</form>
				<p id="demo"></p>

				</center>
			</div>	
		</div>
	</div>
</body>
</html>


<?php
    echo "Стоимость:".$_POST['name'];
?>


/**
 * Created by W1LD on 21.02.2017.
 */
/**

        Шаг-3,5

*/
function funcGiff() {
    $("#information").text ("Please wait...");
}

function funcSuccess(data) {
    $("#information").text (data);
}

$(document).ready (function () {
    $("#load").bind("click", function () {
        //var itogo = "Стоимость:";
        var res = itog;
        $.ajax({
            url: "www.php",
            type: "POST",
            data: ({name : res}),
            dataType: "js",
            beforeSend: funcGiff,
            success: funcSuccess
        });
    });
});

function areaRectangle() {
    var el = document.querySelector('[name="vidlesov"]:checked')||{value : "x"} ;
    var cena = {"lrsp30" : 100, "lrsp40" : 200, "lrsp60" : 300, "lrsp100" : 400}[el.value];
        var i = document.form1.d.value,
         h = document.form1.h.value;
        if (i%3 > 0) {
            i = --i;
        }
        if (i%3 > 0) {
            i = --i;
        }
        if (h%2 > 0) {
            h = --h;
        }


        var s, section, yarus, itog;
        s = i*h;
            yarus = document.form1.yarus.value;
        section = (h/2)*(i/3);
            var yarus1 = i/3;
        var sectionYarus = yarus*yarus1;//цена ригели = 30р за шт, настил = 50р за шт
        var sectionYarus1 = (sectionYarus*60)+(sectionYarus*150);

        var solid1 = section*65;//65p цена одной сплошной
        var chess1 = section/2;//80р цена одной шахматы
        if (chess1%2 == 0) {
            chess = section/2*65+section/2*80;
        } else if (chess1%2 > 0){
            chess = (section/2-0.5)*65+(section/2+0.5)*80
        }
        var el1 = document.querySelector('[name="connect"]:checked')||{value : "x"};
        var connection = {"chess" : chess, "solid" : solid1} [el1.value];

        var ascent = document.form1.ascent.value;// price ascent 70p шт
        ascent = ascent*70;

        var el2 = document.querySelector('[name="support"]:checked')||{value : "x"};
        var support1 = (yarus1+1)*2*120;//120Р цена за 1 опору
        var supports = {"yes" : support1, "no" : 0}[el2.value];

        var el3 = document.querySelector('[name="bracket"]:checked')||{value : "x"};
        var bracket1 = ((i/3)+1)*(h/2)/2;
        if (bracket1%2 == 0) {
            bracket2 = bracket1*30;//30 цена за 1 шт
        } else if (bracket1%2 > 0) {
            bracket2 = (bracket1-0.5)*30;
        }
        var bracket = {"yes" : bracket2, "no" : 0}[el3.value];

        itog = cena+sectionYarus1+ascent+connection+supports+bracket;

        //document.form1.res.value = itog;
    }


Подскажите пожалуйста как это воплотить.
Ответить с цитированием
  #2 (permalink)  
Старый 25.02.2017, 03:57
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от DeathDji
с помощью ajax мне моментально выводилась стоимость.
Если так, то зачем же тогда это function areaRectangle()?
Ответить с цитированием
  #3 (permalink)  
Старый 25.02.2017, 11:19
Интересующийся
Отправить личное сообщение для DeathDji Посмотреть профиль Найти все сообщения от DeathDji
 
Регистрация: 20.02.2017
Сообщений: 18

Он даже начало не считает сразу ошибку выдает
Uncaught TypeError: Cannot read property 'd' of undefined
at script.js:31
Ответить с цитированием
  #4 (permalink)  
Старый 25.02.2017, 13:41
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от DeathDji
Он даже начало не считает сразу ошибку выдает
Ну с такой формой и ее обработкой, это не удивительно. )

Я не об ошибках, пока интересует вопрос - за какой ценой клиент обращается к серверу и зачем?
Ответить с цитированием
  #5 (permalink)  
Старый 25.02.2017, 15:15
Интересующийся
Отправить личное сообщение для DeathDji Посмотреть профиль Найти все сообщения от DeathDji
 
Регистрация: 20.02.2017
Сообщений: 18

Я маленько может не понял вопроса. Он обращается за ценой всего строительно леса, который ему необходим. Указывает длину и высоту чтобы получить площадь своего леса, кол-во секций т.д., и стоимость этого всего. То есть когда он набирает длину и высоту ему сразу рассчитывается стоимость, следом он набирает кол-во ярусов стоимость увеличивается. Весь расчет производится сразу после ввода данных. У меня не получается это сделать. Сначала у меня был button при клике выдавалась стоимость из расчета введенных данных. Но мне нужно чтобы расчет производился сразу же после ввода. Типа как http://www.xxlesa.ru/o-produkcii/calc/ ТУТ
Ответить с цитированием
  #6 (permalink)  
Старый 25.02.2017, 17:20
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Понятно. Ну зачем тогда опрашивать сервер?

Например, если магазин ведет учет товаров и не оперирует "извините, подождите", то он имеет полный контроль над корзиной. То есть корзина хранится на сервере, добавление товара в нее только через сервер, он же рассчитывает стоимость корзины возвращая ее клиенту, который просто размещает информацию на странице.

В вашем же случае, это просто калькулятор, сервис для клиента. Цены всего нужно отдавать клиенту сразу при формировании страницы (формы). Но только не помещать эти данные в функцию как объект, так как если что-то изменилось, придется руками править скрипт, что есть не гут. Цены можно прописать в атрибутах полей формы, откуда их и брать.

Такое - document.querySelector('[name="vidlesov"]:checked')||{value : "x"}, конечно не серьезно, хотя бы уже потому, что есть значение по умолчанию.

value="lrsp30", value="chess", value="yes", ... - это совсем плохо. Как говорят математики - "Мы можем описать цифрами все что угодно". У цифр в отличии от строк есть есть одна особенность - с ними работать легче. Держать данные на сервере в виде "lrsp30", "chess" никуда не годится, если данные описывают набор свойств. Данные хранят в базе, и для подобных наборов (если они фиксированы) в ней существует удобный тип - ENUM. В описаниях набора, это строки, а во внутреннем представлении, это числа. Форма принятая от клиента подлежит обязательной проверке, а зная, что тип ожидаемых данных это integer, даже простейшими операциями легко проверить форму. С набором же "lrsp30", "lrsp40", "lrsp60", ... придется попотеть.

Посчитал клиент на калькуляторе без всяких запросов сервера, отправил форму, которая отражает выбор пользователя, теперь уже сервер зная все цены, на основе выбора клиента считает и проверяет. Если Ок, работает далее, если нет, возвращает клиенту ошибки, пусть трудится.
Ответить с цитированием
  #7 (permalink)  
Старый 25.02.2017, 18:45
Интересующийся
Отправить личное сообщение для DeathDji Посмотреть профиль Найти все сообщения от DeathDji
 
Регистрация: 20.02.2017
Сообщений: 18

Огромное спасибо я кажется догнал. Да с цифрами проще работать. Так значит лучше вообще обойтись без php? Смотрел везде че как делать, все не то, все через php, все только по клику кнопки. Может знаете где можно посмотреть хорошие уроки(подсказки), что то близкое к этому. А то Google меня не понимает)))

Последний раз редактировалось DeathDji, 25.02.2017 в 19:28.
Ответить с цитированием
  #8 (permalink)  
Старый 25.02.2017, 19:21
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от DeathDji
Так значит лучше вообще обойтись без php?
Это как, форма для кого тогда как не для сервера?

Сообщение от DeathDji
Может знаете где можно посмотреть хорошие уроки(подсказки), что то близкое к этому
Конкретно к вашему примеру вряд-ли, а вот о всяких калькуляторах тем в сети море. Калькулятор он и в Африке калькулятор, может только условия и логика иная может быть, а так все едино.

Сперва надо не калькуляторы читать, а с html разобраться, так как <table border=1 cellpadding=5 cellspacing=0><table>, это ошибка. Поле формы type="namber" может и появится в HTML505, но в настоящее время только type="number", у которого нет maxlength=10, зато есть min и мах.

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script> 
$(function() {
    $('#load').on('change input', function() {
        var e = $(this.elements), //коллекция полей формы
         v, f, s = 0, o = $('#info');
        e.filter('[required]').each(function() { //обход полей ввода
            f = this.name; //текущее поле, по его имени можно определять те или иные операции
            this.value = v = +$.trim(this.value) || this.min; //значение не меньше минимального
            //расчет и вывод, далее просто пример
            s += e.filter('[name="vidlesov"]:checked').data('price') * v; 
        })
        o.text(s)
    })
});
</script>

<form id="load">
                        <table>
                            <tr>
                                <td>Вид лесов</td>
                                <td id="les">
                                    <label><input type="radio" name="vidlesov" data-price="100" value="1" checked=""> ЛРСП-30</label>
                                    <label><input type="radio" name="vidlesov" data-price="200" value="2"> ЛРСП-40</label>
                                    <label><input type="radio" name="vidlesov" data-price="300" value="3"> ЛРСП-60</label>
                                    <label><input type="radio" name="vidlesov" data-price="400" value="4"> ЛРСП-100</label>
                                </td>
                            </tr>
                            <tr>
                                <td>Длина и высота объекта</td>
                                <td><input class="block" min="1" max="5" type="number" value="1" name="d" required>
                                <input type="number" min="1" max="5" name="h" value="1" required></td>
                            </tr>
                            <tr>
                                    <p class="cratno">кратно 3</p>
                                <td>Число рабочих ярусов</td>
                                <td><input  type="number" min="1" max="5" name="yarus" value="1" required></td>
                            </tr>
                            <tr>
                                <td>Комплектация связями</td>
                                <td>
                                    <label><input type="radio" name="connect" value="0" checked> шахматный порядок</label>
                                    <label><input type="radio" name="connect" value="1"> сплошная</label>
                                </td>
                            </tr>
                            <tr>
                                <td>Количество подъемов</td>
                                <td><input name="ascent" type="number" min="1" max="5" value="1" required></td>
                            </tr>
                            <tr>
                                <td>Комплектация опорами</td>
                                <td>
                                    <label><input type="radio" name="support" value="1" checked> да</label>
                                    <label><input type="radio" name="support" value="0"> нет</label>
                                </td>
                            </tr>
                            <tr>
                                <td>Комплектация кронштейнами</td>
                                <td>
                                    <label><input type="radio" name="bracket" value="1" checked> да</label>
                                    <label><input type="radio" name="bracket" value="0"> нет</label>
                                </td>
                            </tr>
                        </table>
                    <div id="info"></div>
                </form>


Здесь для примера - обрабатываются события изменения и ввода полей формы. Из коллекции полей формы берутся обязательные поля и обходятся в цикле .each(). Цены для первой группы кнопок содержатся в атрибутах ее полей - data-price. Аналогично можно хранить цены или корректирующие значения в других группах кнопок. То есть при каждом изменении формы производится расчет.

name="connect" value="0" - значение по умолчанию, удобно будет 0.
name="support" value="1" - значение 1 будет удобно для "да", и 0 для "нет".


Разберетесь с этим, значит сделаете, нет, значит нет. А что там у вас за расчеты, темный лес, и чтобы понять что к чему, нужно знать условия, именно поэтому найти в сети калькулятор именно для вас, это нонсенс. )

Последний раз редактировалось laimas, 25.02.2017 в 19:33.
Ответить с цитированием
  #9 (permalink)  
Старый 26.02.2017, 12:58
Интересующийся
Отправить личное сообщение для DeathDji Посмотреть профиль Найти все сообщения от DeathDji
 
Регистрация: 20.02.2017
Сообщений: 18

Огромное спасибо вам за информацию, за код, за ваши знания переданные мне, и потраченное время. Впредь буду делать все красиво)))
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бесплатный курс JavaScript (18 уроков)  Bokal Учебные материалы 2 16.11.2014 20:20
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
ajax javascript gunsoy Общие вопросы Javascript 3 24.06.2012 19:49
Не работает javascript в документе, вызванным AJAX. Hauster Общие вопросы Javascript 21 28.05.2012 23:14
JavaScript client и server side игры Москва 110 000 Yanazavr Работа 0 25.03.2012 14:16