14.07.2016, 13:27
|
Интересующийся
|
|
Регистрация: 14.07.2016
Сообщений: 12
|
|
Значение из select option
Есть такая часть кода:
e.forEach(function (e) {
t.forEach(function (t) {
var months = 1;
var value = 1;
e == t.id ?
$('<div class="unit" data-id="' + t.id + '"><div class="billboard-address">' + t.address +
'<a href="" class="close"></a></div><label style="margin: 0 14px 0 0; display: inline-block;' +
' float: right;"><input type="checkbox" name="need_design" value="1" checked="checked" ' +
'style="width: 14px;"><div class="label">Разработать макет рекламного щита</div></label>' +
'<div class="test">Стоимость аренды щита за 1 месяц: ' + t.price + '</div>' +
'<div class="test">Срок размещения в месяцах: <script>function displayVals' + t.id +
'(){value = $( "#select' + t.id + '" ).val();};' +
'$( "select' + t.id + '" ).change( displayVals' + t.id + ' );displayVals' + t.id +
'();</script><select id="select' + t.id +
'" onChange="displayVals' + t.id + '(); alert(value);">' +
'<option value="1">1</option><option value="2">2</option><option value="3">3</option>' +
'<option value="4">4</option><option value="5">5</option><option value="6">6 (скидка -6%)</option>' +
'<option value="7">7 (скидка -7%)</option><option value="8">8 (скидка -8%)</option>' +
'<option value="9">9 (скидка -9%)</option><option value="10">10 (скидка -10%)</option>' +
'<option value="11">11 (скидка -11%)</option><option value="12">12 (скидка -12%)</option>' +
'</select>' +
'<div class="new-price">Итоговая цена по данному щиту: <span>' + months*t.price*value + '</span>' +
'</div></div></div>').prependTo("#request-form .selected-billboards .list")
: r.push(e)
})
}),
Прошу прощение за неудобоваримость кода, пишу как умею..
При изменении select option у меня вылетает окошка alert'ом, и в нем отображается правильное текущее value. А как эту value динамически менять вот в этом месте:
...
'<div class="new-price">Итоговая цена по данному щиту: <span>' + months*t.price*value + '</span>' +
...
Чтобы при изменении select option value - сразу показывалось итоговое значение?
|
|
14.07.2016, 17:46
|
Аспирант
|
|
Регистрация: 14.07.2016
Сообщений: 86
|
|
Я правильно понял, ты для каждого селекта создаешь отдельную обрабатывающую функцию displayVals + t.id?
Достаточно одной, в которую ты будешь передавать указатель на селект, а в ней уже получать его значение и заносить в соотв. место.
<select ... onChange="displayVals(this); >
|
|
15.07.2016, 07:50
|
Интересующийся
|
|
Регистрация: 14.07.2016
Сообщений: 12
|
|
Сообщение от Spass
|
Я правильно понял, ты для каждого селекта создаешь отдельную обрабатывающую функцию displayVals + t.id?
Достаточно одной, в которую ты будешь передавать указатель на селект, а в ней уже получать его значение и заносить в соотв. место.
<select ... onChange="displayVals(this); >
|
Спасибо, поправил. Да, так получается лучше... Упрощенней, я бы сказал. Однако, все равно пока не соображу, как получить в итоге value, сейчас оно у меня минует все манипуляции и остается таким же, каким я его объявил в начале..
---
upd.
Нет, при Вашем способе по смене select не проходит alert. Т.е. в данном случае, наверное, все же нужно указывать как я писал в начале топика...
Последний раз редактировалось vnmslf, 15.07.2016 в 08:36.
|
|
15.07.2016, 10:01
|
Аспирант
|
|
Регистрация: 14.07.2016
Сообщений: 86
|
|
Без кода я не подскажу почему не работает
Оптимальный вариант - после формирования структуры(скрипты вписывать не нужно) вешаешь на все селекты обработчик
$('div.unit select').on('change', function() {
alert($(this).val());
//делаем что нужно
});
|
|
15.07.2016, 10:22
|
Интересующийся
|
|
Регистрация: 14.07.2016
Сообщений: 12
|
|
Сообщение от Spass
|
Без кода я не подскажу почему не работает
Оптимальный вариант - после формирования структуры(скрипты вписывать не нужно) вешаешь на все селекты обработчик
$('div.unit select').on('change', function() {
alert($(this).val());
//делаем что нужно
});
|
Ну сам alert-то мне и не нужен, я его в качестве проверки использую. А какой код предоставить?? Код, что я предоставил выше - из файла main.js, могу его целиком дать:
Часть 1:
function arrayObjectIndexOf(e, t, r) {
for (var a = 0, o = e.length; o > a; a++)
if (e[a][r] === t) return a;
return -1
}
function triads(e) {
return e = e.toString(), e.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, "$1 ")
}
function jsTils(e, t) {
var r;
return count = e % 100, count >= 5 && count <= 20 ? r = t[2] : (count %= 10, r = 1 == count ? t[0] : count >= 2 && count <= 4 ? t[1] : t[2]), r
}
function localstorageGet(e) {
return Modernizr.localstorage ? lscache.get(e) ? lscache.get(e) : (localStorage.clear(), !1) : void 0
}
function localstorageSet(e, t, r) {
Modernizr.localstorage && lscache.set(e, JSON.stringify(t), 1440), (r = r || function() {})()
}
$(function() {
function e(e) {
a.slideUp(300), a.eq(e).slideDown(300, function() {
_billboards_map_ && _billboards_map_.container.fitToViewport()
})
}
function t() {
$activeBtn = r.filter(".active"), index = r.index($activeBtn), e(index)
}
var r = $(".tabs-btn>a.tab-btn"),
a = $(".tabs>.tab");
t(), r.click(function(e) {
e.preventDefault(), $(this).is(".active") || (r.removeClass("active"), $(this).addClass("active"), _mapMarkers_.forEach(function(e) {
e.marker.balloon.close()
}),
t())
})
});
var _mapMarkers_ = [],
_billboards_map_;
$(function() {
function e() {
var e = localstorageGet("billboards_ids");
$(".billboards #list-view tr").removeClass("ordered"),
_mapMarkers_.forEach(function(e) {
var t = e.marker.properties.get("type");
e.marker.properties.set("btn_type", "Заказать"),
e.marker.properties.set("ordered", ""),
e.marker.options.set("iconImageHref", o[t])
}),
e && e.forEach(function(e) {
$(".billboards #list-view tr[data-id=" + e + "]").addClass("ordered"),
_mapMarkers_.forEach(function(t) {
if (e == t.id) {
var r = t.marker.properties.get("type");
t.marker.properties.set("btn_type", "Отменить"),
t.marker.properties.set("ordered", "ordered"),
t.marker.options.set("iconImageHref", i[r])
}
})
});
r();
}
function t() {
var e = localstorageGet("billboards_ids"),
t = 0,
r = 0;
if (e) {
e.forEach(function(e) {
billboards_json.items.forEach(function(a) {
e == a.id && (t += 1, r += a.price)
})
});
var a = jsTils(t, ["Выбран ", "Выбрано ", "Выбрано "]) + t + jsTils(t, [" щит", " щита", " щитов"]);
r = triads(r), s.find(".count").text(a), s.find(".numbers").text(r + " рублей."), 0 == t ? s.hide() : s.show()
} else s.hide()
}
function r() {
"undefined" != typeof billboards_json && localstorageSet("billboards_json", billboards_json.items)
}
function a() {
if ($("#request-form .selected-billboards").size()) {
var e = localstorageGet("billboards_ids"),
t = localstorageGet("billboards_json");
if (e && t && e.length > 0) {
var r = [];
e.forEach(function (e) {
var months = 1;
var value = 1;
t.forEach(function (t) {
e == t.id ?
$('<div class="unit" data-id="' + t.id + '"><div class="billboard-address">' + t.address +
'<a href="" class="close"></a></div><label style="margin: 0 14px 0 0; display: inline-block;' +
' float: right;"><input type="checkbox" name="need_design" value="1" checked="checked" ' +
'style="width: 14px;"><div class="label">Разработать макет рекламного щита</div></label>' +
'<div class="test">Стоимость аренды щита за 1 месяц: ' + t.price + '</div>' +
'<div class="test">Срок размещения в месяцах: <script>function displayVals' + t.id +
'(){var value = $( "#select' + t.id + '" ).val();};' +
'$( "select' + t.id + '" ).change(displayVals' + t.id + ');displayVals' + t.id +
'();</script><select id="select' + t.id +
'" onChange="displayVals' + t.id + '(); alert(value*' + t.price + ');">' +
'<option value="1">1</option><option value="2">2</option><option value="3">3</option>' +
'<option value="4">4</option><option value="5">5</option><option value="6">6 (скидка -6%)</option>' +
'<option value="7">7 (скидка -7%)</option><option value="8">8 (скидка -8%)</option>' +
'<option value="9">9 (скидка -9%)</option><option value="10">10 (скидка -10%)</option>' +
'<option value="11">11 (скидка -11%)</option><option value="12">12 (скидка -12%)</option>' +
'</select>' +
'<div class="new-price">Итоговая цена по данному щиту: <span>' + months*t.price*value + '</span>' +
'</div></div></div>').prependTo("#request-form .selected-billboards .list")
: r.push(e)
})
}),
|
|
15.07.2016, 10:24
|
Интересующийся
|
|
Регистрация: 14.07.2016
Сообщений: 12
|
|
Часть 2:
} else var n = "Доступен";
var l = new ymaps.Placemark(i.position, {
type: i.type,
address: i.address,
reserved: n,
strong: s,
price: triads(i.price),
photo: i.photo,
id: i.id,
btn_type: "Заказать",
ordered: ""
}, {
balloonContentLayout: r,
balloonPanelMaxMapArea: 0,
balloonMaxWidth: 500,
iconLayout: "default#image",
iconImageHref: o[i.type],
iconImageSize: [53, 65],
iconImageOffset: [-26, -65]
});
l.events.add("balloonopen", function() {}), _mapMarkers_.push({
id: i.id,
position: i.position,
marker: l
}), t.geoObjects.add(l), e()
})
});
var s = $(".tabs-btn .selected");
if ("undefined" != typeof billboards_json) {
var n = ".billboards #list-view .order a, .billboard-mark .order";
$(document).on("click", n, function(r) {
var a = $(this).closest("tr").attr("data-id") || $(this).attr("data-id");
if (localstorageGet("billboards_ids"))
var o = localstorageGet("billboards_ids");
else
var o = [];
if ($(this).is(".ordered") || $(this).closest("tr").is(".ordered")) {
var o = localstorageGet("billboards_ids");
o.splice(o.indexOf(a), 1)
} else -1 == o.indexOf(a) && o.push(a);
localstorageSet("billboards_ids", o), r.preventDefault(), t(), e()
}), t(), e()
}
$(".billboards #list-view .price .numbers").each(function() {
var e = $(this).text();
$(this).text(triads(e))
}), r(), $(document).on("click", "#request-form .selected-billboards .unit .close", function(e) {
var t = $(this).closest(".unit").attr("data-id"),
r = localstorageGet("billboards_ids");
r.splice(r.indexOf(t), 1);
var o = $(this);
localstorageSet("billboards_ids", r, function() {
o.closest(".unit").fadeOut(300, function() {
0 == r.length && a()
})
}), e.preventDefault()
}), a(), $("#request-form").validate({
rules: {
org: "required",
phone: "required"
},
messages: {
org: "Обязательное поле",
phone: "Обязательное поле"
},
submitHandler: function(e) {
var t = localstorageGet("billboards_ids");
return t.length > 0 ? ($.ajax({
type: $(e).attr("method"),
url: $(e).attr("action"),
dataType: "json",
data: $(e).serialize() + "&" + $.param({
billboards: t
})
}).done(function(e) {
jsonResponse = e, 1 == jsonResponse.status ? ($("#request-form .wrapper").slideUp(), $("#request-form .final").slideDown(), t = [], localstorageSet("billboards_ids", t)) : alert("Произошёл сбой. Пожалуйста попробуйте ещё раз.")
}).fail(function() {
alert("Произошёл сбой. Пожалуйста попробуйте ещё раз.")
}), $("#request-form button").prop("disabled", !0)) : $("#request-form .selected-billboards .title").css({
color: "red"
}), 0 == $(".selected-billboards").size() && ($.ajax({
type: $(e).attr("method"),
url: $(e).attr("action"),
dataType: "json",
data: $(e).serialize()
}).done(function(e) {
jsonResponse = e, 1 == jsonResponse.status ? ($("#request-form .wrapper").slideUp(), $("#request-form .final").slideDown()) : alert("Произошёл сбой. Пожалуйста попробуйте ещё раз.")
}).fail(function() {
alert("Произошёл сбой. Пожалуйста попробуйте ещё раз.")
}), $("#request-form button").prop("disabled", !0)), !1
},
invalidHandler: function() {
var e = localstorageGet("billboards_ids");
e.length <= 0 && $("#request-form .selected-billboards .title").css({
color: "red"
})
}
}), $("body.billboards #list-view td.photo a.address").click(function(e) {
e.preventDefault();
var t = $(this).closest("tr").attr("data-id");
$(".tabs-btn .map-view").click(), setTimeout(function() {
_mapMarkers_.forEach(function(e) {
e.id == t && (_billboards_map_.setZoom(18), _billboards_map_.setCenter(e.position), e.marker.balloon.open())
})
}, 500)
})
}), $(function() {
function e(e, t) {
t = t || function() {};
var r = e.magnificPopup({
type: "image",
removalDelay: 500,
callbacks: {
beforeOpen: function() {
this.st.image.markup = this.st.image.markup.replace("mfp-figure", "mfp-figure mfp-with-anim"), this.st.mainClass = "mfp-move-from-top"
},
close: function() {
t()
}
},
closeOnContentClick: !0,
showCloseBtn: !1,
tLoading: "Загрузка..."
});
return r
}
e($("#list-view td.photo a.photo")), $(document).on("click", ".billboard-mark .photo", function(t) {
t.preventDefault(), e($(this)).magnificPopup("open")
}), $(".content-wrapper .photos").magnificPopup({
delegate: "a",
type: "image",
gallery: {
enabled: !0,
tPrev: "Предыдущая (Стрелка влево)",
tNext: "Следующая (Стрелка вправо)",
tCounter: '<span class="mfp-counter">%curr% из %total%</span>'
},
callbacks: {
beforeOpen: function() {
this.st.image.markup = this.st.image.markup.replace("mfp-figure", "mfp-figure mfp-with-anim"), this.st.mainClass = "mfp-move-from-top"
}
},
image: {
titleSrc: "title"
}
})
}), $(function() {
ymaps.ready(function() {
var e = new ymaps.Map($("body.index .small-map, body.contacts .map")[0], {
center: [47.24470432, 39.72322986],
zoom: 18
}),
t = new ymaps.Placemark([47.24470432, 39.72322986], {}, {
iconLayout: "default#image",
iconImageHref: tribuna_theme_path_ + "/images/ico-marker-mark.png",
iconImageSize: [50, 73],
iconImageOffset: [-25, -73]
});
e.geoObjects.add(t), e.controls.remove("mapTools"), e.controls.remove("scaleLine"), e.controls.remove("searchControl"), e.controls.remove("trafficControl")
})
}),
$(function() {
$(".contacts-form").validate({
rules: {
name: "required",
phone: "required",
content: "required"
},
messages: {
name: "Обязательное поле",
phone: "Обязательное поле",
content: "Обязательное поле"
},
submitHandler: function(e) {
return $.ajax({
type: $(e).attr("method"),
url: $(e).attr("action"),
data: $(e).serialize()
}).done(function() {
$(".contacts-form .wrapper").slideUp(),
$(".contacts-form .final").slideDown()
}), !1
}
})
});
Разбил на две части, т.к. форум не дает возможности выложить более 10000 символов в одном сообщении, а тега SPOILER я не нашел(((
|
|
15.07.2016, 10:47
|
Аспирант
|
|
Регистрация: 14.07.2016
Сообщений: 86
|
|
'<div class="new-price">Итоговая цена по данному щиту: <span>' + months*t.price*value + '</span>'
здесь все из span убираем,
monts и t.price - записывать значения в тег new-price (data-month и data-price)
получится чтото вроде
'<div class="new-price" data-month="'+months+'" data-price="'+t.price+'" >Итоговая цена по данному щиту: <span></span>'
и доделываем наш обработчик селектов:
$('div.unit select').on('change', function() {
var month = $(this).next('div.new-price').data('month');
var price = $(this).next('div.new-price').data('price');
var x= month*price*$(this).val(); //вычисляем значение
$(this).next('div.new-price').find('span').html(x); //заносим новое значение
});
Последний раз редактировалось Spass, 15.07.2016 в 11:01.
|
|
15.07.2016, 13:58
|
Интересующийся
|
|
Регистрация: 14.07.2016
Сообщений: 12
|
|
Spass,
Оффигительно простое и крутое решение))) Спасибо!! Все работает, уже прикрутил сверх того свои условия)))) Спасибо! :-)
|
|
15.07.2016, 14:55
|
Аспирант
|
|
Регистрация: 14.07.2016
Сообщений: 86
|
|
Пожалуйста.
На будущее отделяй мух от котлет (js от html), и все будет намного проще.
|
|
18.07.2016, 11:17
|
Интересующийся
|
|
Регистрация: 14.07.2016
Сообщений: 12
|
|
Сообщение от Spass
|
Пожалуйста.
На будущее отделяй мух от котлет (js от html), и все будет намного проще.
|
Тема в том, что так было изначально.. но совет приму))
Есть еще подобный вопрос, как теперь можно отловить все итоговые значения каждого товара и просуммировать их..
Т.е. это должна быть функция внутри функции $('div.unit select').on('change', function(), правильно?
---
С этим сам разобрался
var sumCost = 0, sumDiscount = 0;
$('.shield-price').each(function(){
sumCost += parseInt($(this).html(), 10);
});
$('.final-cost').html('Итого: <span>'+sumCost+'</span> руб.');
$('.shield-discount').each(function(){
sumDiscount += parseInt($(this).html(), 10);
});
$('.final-discount').html('Итоговая скидка: <span>'+sumDiscount+'</span> руб.');
Однако, если все значения seect выставить в 1, т.е. в то положение, когда самой скидки нет - то остается последнее значение скидки.. вместо нуля((((
Так понимаю, нужна проверка на значение всех и каждого select option val, верно?
Последний раз редактировалось vnmslf, 18.07.2016 в 13:30.
|
|
|
|