Присвоить значения атрибуту из переменной
Добрый вечер! Делаю корзину на основе готового решения и столкнулся с такой проблемой: занес в переменную количество товара
var plat = document.getElementById("kolvo").value; теперь необходимо значение этой переменной вставить в html <button class="border" onclick="cart.addToCart(this, '002', 'Зонт1', '1500', 'здесь значение переменной plat')">Купить</button> Подскажите пожалуйста как это сделать. И еще вопрос, так как позиций товаров много, каким образом получать значение переменной plat (количество товара) именно текущего товара? |
<html> <head> </head> <body> <input id="kolvo"> <button class="border" onclick="card.addToCard(this, '002', 'Зонт1', '1500', kolvo.value)">Купить</button> <script> card={ addToCard: function(env, foo, bar, baz, plat){alert(plat)} } </script> </body> </html> |
Спасибо за ответ. Решил немного другим способом.
Теперь мучаюсь со значением текущего input. Когда добавляю в корзину, всегда берется значение первого input. this.addToCart = function(curObj, id, name, price, num) { num = $(".mam").val(); num = parseInt(num) alert(num) так получаю значение value. Но значение всегда первого input. В чем проблема? Подскажите пожалуйста |
Цитата:
|
apisklov,
ничем не могу помочь. Вы "решили" по-своему, брать значения всегда из первого инпута, и спрашиваете, как не делать этого. Это пародоксальный вопрос. |
<div class="item border"> <img src="img/shop/zont1.png" width="200"> <p><b>Зонт1</b> | Цена: 1200 руб</p> <div class="sum_but"> <span class="plus">+</span> <input value="1" maxlength="2" name="" id="" type="text" class="mam"> <span class="minus">-</span> </div> <button class="border" onclick="cart.addToCart(this, '001', 'Зонт1', '1200', '')">Купить</button> </div> <div class="item border"> <img src="img/shop/zont2.png" width="200"> <p><b>Зонт2</b> | Цена: 1500 руб</p> <div class="sum_but"> <span class="plus">+</span> <input value="1" maxlength="2" name="" id="" type="text" class="mam"> <span class="minus">-</span> </div> <button class="border" onclick="cart.addToCart(this, '002', 'Зонт2', '1500', '')">Купить</button> </div> |
Дело в том, что вашим способом тоже значение берется из первого input. Либо я не совсем правильно что-то делаю.
|
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta name="Keywords" content=""> <meta name="description" content=""> <title>ГГ</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> </head> <body> <div class="item border"> <img src="img/shop/zont1.png" width="200"> <p><b>Зонт1</b> | Цена: 1200 руб</p> <div class="sum_but"> <span class="plus">+</span> <input value="3" maxlength="2" name="" id="" type="text" class="mam"> <span class="minus">-</span> </div> <button class="border" onclick="cart.addToCart(this, '001', 'Зонт1', '1200', '')">Купить</button> </div> <div class="item border"> <img src="img/shop/zont2.png" width="200"> <p><b>Зонт2</b> | Цена: 1500 руб</p> <div class="sum_but"> <span class="plus">+</span> <input value="5" maxlength="2" name="" id="" type="text" class="mam"> <span class="minus">-</span> </div> <button class="border" onclick="cart.addToCart(this, '002', 'Зонт2', '1500', '')">Купить</button> </div> <script> var inputs = document.getElementsByClassName('mam'); alert(inputs[0].value); alert(inputs[1].value); </script> <script> var inputs = $('.mam'); alert(inputs[0].value); alert(inputs[1].value); </script> </body> </html> |
не совсем понял. а если 50 позиций товаров?
|
Цитата:
var inputs = document.getElementsByClassName('mam'); for (var i = 0; i < inputs.length; i++) alert(inputs[i].value); |
в общем совсем запутался. циклом прошелся, как вы и сказали, но вот не понимаю одно, алерт выводит все значения value по порядку, но как занести в переменную например 14 элемент.
inputs = inputs[i].value- выводит опять же значение первого инпута. |
Цитата:
<button class="border" onclick="card.addToCard(this, '002', 'Зонт1', '1500', kolvo.value)">Купить</button> заменить на это: <button class="border" data-val="'002','Зонт1',1500">Купить</button> Назначит кнопкам обработчик, в котором получать значения атрибута data-val, добавляя к ним this (текущая кнопка) и значение input в родительском элементе "item", и передавая их как значения аргументов для функции cart.addToCart(). |
Цитата:
inputs[13].value - это значения 14-го элемента. |
Цитата:
хотел спросить, как код будет понимать, что сейчас я работаю, например, с 14 элементом и нужно получить его value? |
Цитата:
if ( i == 13) //код работающий с 14-ым элементом |
Цитата:
|
Спасибо за ответы. На основе всего, что вы мне написали, сделал так
$('button').on('click', numJq); function numJq(){ num = $(this).parent().find('input').val(); } проверяю алертом, получаю правильные значения value. Теперь еще одна проблема, результат выполнения этой функции (numJq) перенести в функцию this.addToCart = function(curObj, id, name, price, num) { id = ( $.isNumeric(id) ) ? "ID" + id.toString() : id; var goodieLine = {"id" : id, "name" : name, "price": price, "num" : num, "url" : document.location.href}; if ($.isEmptyObject(this.DATA)) { this.DATA[id] = goodieLine; this.IDS.push(id); } else for(var idkey in this.DATA) { if($.inArray(id, this.IDS) === -1) { this.DATA[id] = goodieLine; this.IDS.push(id) } else if (idkey == id) { this.DATA[idkey].num += num; } } которая и добавляет товар в корзину. Пытался создавать глобальную переменную - не работает. Полный код, который отвечает за добавление в корзину $('button').on('click', numJq); function numJq(){ num = $(this).parent().find('input').val(); alert(num); } this.addToCart = function(curObj, id, name, price, num) { id = ( $.isNumeric(id) ) ? "ID" + id.toString() : id; var goodieLine = {"id" : id, "name" : name, "price": price, "num" : num, "url" : document.location.href}; if ($.isEmptyObject(this.DATA)) { this.DATA[id] = goodieLine; this.IDS.push(id); } else for(var idkey in this.DATA) { if($.inArray(id, this.IDS) === -1) { this.DATA[id] = goodieLine; this.IDS.push(id) } else if (idkey == id) { this.DATA[idkey].num += num; } } localStorage.setItem(this.cardID, JSON.stringify(this.DATA)); localStorage.setItem(this.cardID + "_ids", JSON.stringify(this.IDS)); this.reCalc(); this.renderBasketTable(); var bird = $("#" + this.cardID + "_bird"); var pos = $(curObj).position(); bird.offset({ top: pos.top, left: pos.left}); bird.html(price); bird.show(); bird.animate( { 'left': this.widjetPos.left, 'top': this.widjetPos.top } , { 'duration': 500, complete: function() { bird.offset({ top: -300, left: -300}); } }); if (this.CONFIG.showAfterAdd) { cart.showWinow('bcontainer', 1); } } Какие еще варианты есть, не подскажите? |
Не нужна функция посредник:
$('button').click(function() { $(this).parent().find('input').val() - передаем далее в функцию }) //или методом .on, но уж тогда делегировать обработку ближайшему общему родителю их родителя $('selector').on('click', 'button', function() { //передаем далее }) А куда же делись '002','Зонт1',1500 и откуда этот код: this.addToCart = function(curObj, id, name, price, num), из чего-то выдрано? Чей это this? |
в оригинале все выглядит так
HTML: <div class="item border"> <img src="img/shop/zont1.png" width="200"> <p><b>Зонт1</b> | Цена: 1200 руб</p> <div class="sum_but"> <span class="plus">+</span> <input value="1" maxlength="2" name="" id='' type="text" class="mam"> <span class="minus">-</span> </div> <button class="border" onclick="cart.addToCart(this, '001', 'Зонт1', '1200', '')">Купить</button> </div> JS - обработчик: function WICard(obj) { this.widjetX = 0; this.widjetY = 0; this.widjetObj; this.widjetPos; this.cardID = ""; this.DATA = {}; this.IDS = []; this.objNAME = obj; this.CONFIG = {}; this.IMG = "..."; this.init = function(widjetID, config) { this.CONFIG = config || {}; try { this.DATA = JSON.parse(localStorage.getItem(widjetID)); // code to try //console.log("TRY - OK"); if ($.isEmptyObject(this.DATA)) { this.DATA = {}; } } catch (e) { this.DATA = {}; //onsole.log("TRY - BED"); } try { this.IDS = JSON.parse(localStorage.getItem(widjetID + "_ids")); if ($.isEmptyObject(this.IDS)) { this.IDS = []; } } catch (e) { this.IDS = []; } //console.log(this.DATA); this.cardID = widjetID; $("body").append("<div class='bird' id='"+widjetID +"_bird'></div>"); this.widjetObj = $("#" + widjetID); this.widjetPos = this.widjetObj.position(); if ($.isEmptyObject(this.DATA)) { this.widjetObj.html("Корзина пуста"); } else { this.reCalc(); this.renderBasketTable(); } } /*********************************************************************************************** * example: onclick="cart.addToCart(this, '2', 'Name of comic 2', '25500') **********************************************************************************************/ $('button').click(function() { num = $(this).parent().find('input').val(); alert(num); }) this.addToCart = function(curObj, id, name, price, num) { id = ( $.isNumeric(id) ) ? "ID" + id.toString() : id; var goodieLine = {"id" : id, "name" : name, "price": price, "num" : num, "url" : document.location.href}; if ($.isEmptyObject(this.DATA)) { this.DATA[id] = goodieLine; this.IDS.push(id); } else for(var idkey in this.DATA) { if($.inArray(id, this.IDS) === -1) { this.DATA[id] = goodieLine; this.IDS.push(id) } else if (idkey == id) { this.DATA[idkey].num += num; } } localStorage.setItem(this.cardID, JSON.stringify(this.DATA)); localStorage.setItem(this.cardID + "_ids", JSON.stringify(this.IDS)); this.reCalc(); this.renderBasketTable(); var bird = $("#" + this.cardID + "_bird"); var pos = $(curObj).position(); bird.offset({ top: pos.top, left: pos.left}); bird.html(price); bird.show(); bird.animate( { 'left': this.widjetPos.left, 'top': this.widjetPos.top } , { 'duration': 500, complete: function() { bird.offset({ top: -300, left: -300}); } }); if (this.CONFIG.showAfterAdd) { cart.showWinow('bcontainer', 1); } } |
Ну во-первых, этот обработчик должен "навешиваться" на что-то, если понимаете что и как, то на что указывает obj при вызове этого плагина?
Тут можно вообще отказаться от данных в кнопке, перенеся из в поле ввода, и немного подправив код плагина, тогда самое поле ввода будет источником всех данных, а функция будет определена в обработчике щелчка кнопки. |
laimas,
можете пожалуйста пояснить, что вот это значит this.init = function(widjetID, config) что такое this? init - переменная с результатом функции? Вроде разобрался с получением данных по клику на ссылку, как вы и писали. Но вот теперь не добавляется все это в корзину, подозреваю, что дело все в этих this Вы писали про obj: <script> $(document).ready(function(){ // $('.item_img').loupe({ width: 200, height: 150, loupe: 'loupe'}); // Форма для валидации $.validationEngine.defaults.scroll = false; var contactForm = $('#formToSend'); // Подключаем корзину cart = new WICard("cart"); var config = {'clearAfterSend':true, 'showAfterAdd':true, 'valudate':contactForm}; cart.init("basketwidjet", config); }); document.addEventListener('visibilitychange', function(e) { cart.init("basketwidjet", {}); }, false); </script> cart = new WICard("cart") |
this - дословно переводится как "это". В JS определяет контекст.
Не знаю, что вы там по клику сделали, но если плагин добавляет в корзину только по щелчку кнопки (что видно по нативному обработчику), но аргументы функции можно и расширить addToCart(), но еще проще $('body').on('click', 'button', function() { cart.addToCart($(this.parentNode).find('input')) //ну или саму кнопку передавать в плагин, а в нем уже искать поле ввода ну а далее уже все в нем брать }); //в плагине this.addToCart = function(curObj) { //curObj, это поле ввода, а все остальные данные типа '002','Зонт1',1500 //будет содержать это же поле ввода, а не кнопка, в атрибуте data-val, //куда сервер и поместит данные при выводе, //только не надо обрамлять 1500 в кавычки, это не строка, а число, //и зря отдавать клиенту два байта на значение, да еще никчемные пробелы между ними.... //эти значения получаются как var d = curObj.data('val').split(','); //ну и останется сопоставить их "id", "name", "price" } Разберетесь? |
laimas,
огромное спасибо. Благодаря вашим подсказкам и советам, сделал то, что хотел. |
Часовой пояс GMT +3, время: 09:23. |