Работа с DOM
Уже 2 часа ночи, а завтра 1 сентября, надо в инст идти=)
Помогите правильно организовать работу функции, у меня чувство что здесь всё на костылях. Функция должна при нажатии на стрелочку, увеличивать и цену, которая указана у товара. Вот html: <div class="oneItem" id="product_1"> <div class="imageItem"></div> <div class="infoItem"> <p>Цена: <span class="priceItem">44.34</span>руб.</p> <span> Кол-во: <span class="rateItem" id="rateDown" onclick="rateDown();">◄</span> <input type="text" id="rateInput" value="1" /> <span class="rateItem" id="rateUp" onclick="rateUp();">►</span> </span> <input type="submit" id="submiItem" value="Добавить в корзину" /> </div> </div> Вот, как то так. Вот так я разруливаю вопрос с DOM:
function rateUp(){
var input = document.getElementById('rateInput');
var price = document.getElementById('product_1');
var price = price.lastElementChild.firstElementChild.firstElementChild;
input.value++;
price.innerHTML = priceStart.innerHTML * input.value;
}
Два вопроса, как убрать костыль с путешествием через всё дерево, пока в голову лезет мысль, добавить не ИД, а класс, ко всем элементам, для простоты поиска И второй вопрос, как мне отловить стартовую цену? Сейчас функция работает некоректно, и увеличивается в геометричесской прогрессии. Мне нужно как то сохранить цену в переменную, и оставить её там, в голову лезет только проверка, 1 товар в корзине или нет, если 1, то записать его значение в переменную, если не один, то оставить как было. Очень важно Ваше мнение! |
как вариант:
<form name="form">
<input type="button" value="up" />
<b id="b"> 0 </b>
<input type="button" value="dn" />
<form>
<script>
window.onload = function() {
var form = document.form.elements, i = form.length, j = 0;
while(i--) {
form[i].onclick = function(i) {
return function() {
document.getElementById('b').innerHTML = i ? ++j : --j;
};
}(i);
}
};
</script>
допилите сами |
<div class="oneItem" id="product_1">
<div class="imageItem"></div>
<div class="infoItem">
<p>Цена: <span class="priceItem">44.34</span>руб.</p>
<span>
Кол-во:
<span class="rateItem" onclick="rateChange( 1, 1 );">◄</span>
<input class="rateInput" type="text" value="1" />
<input class="priceForOne" type="hidden" value="44.34" />
<span class="rateItem" onclick="rateChange( 1, 0 );">►</span>
</span>
<input type="submit" value="Добавить в корзину" />
</div>
</div>
<div class="oneItem" id="product_2">
<div class="imageItem"></div>
<div class="infoItem">
<p>Цена: <span class="priceItem">68.30</span>руб.</p>
<span>
Кол-во:
<span class="rateItem" onclick="rateChange( 2, 1 );">◄</span>
<input class="rateInput" type="text" value="2" />
<input class="priceForOne" type="hidden" value="34.15" />
<span class="rateItem" onclick="rateChange( 2, 0 );">►</span>
</span>
<input type="submit" value="Добавить в корзину" />
</div>
</div>
<script type="text/javascript">
function getElemsByClass( className, context ) {
var nodeList = [];
context = context || document;
if ( context.getElementsByClassName ) {
nodeList = Array.prototype.slice.call(
context.getElementsByClassName( className )
);
} else {
var elems = context.getElementsByTagName("*"),
classMatch = new RegExp('(?:^| +)' + className + '(?: +|$)');
for( var elem, i = 0 ; elem = elems[ i ]; i++ ) {
if ( classMatch.test( elem.className ) ) {
nodeList.push( elem );
}
}
}
return nodeList;
}
function rateChange( product_id, type ) {
var product = document.getElementById( 'product_' + product_id );
rateInput = getElemsByClass( 'rateInput', product ),
priceForOne = getElemsByClass( 'priceForOne', product ),
priceItem = getElemsByClass( 'priceItem', product ),
count = parseInt( rateInput[ 0 ].value ),
price = parseFloat( priceForOne[ 0 ].value );
count = type == 0 ? ++count : --count;
rateInput[ 0 ].value = count;
priceItem[ 0 ].innerHTML = ( price * count ).toFixed( 2 );
}
</script>
|
Чем id не устраивает? В любом случае, в этом коде уже используется id #rateInput, так что введение ещё одного id картину не испортит. Если же заменять id на класс, то заменять и в этом месте. Идея с тем, чтобы искать по id или классу, разумеется, верная, и если таких предметов будет несколько, то, да, подходит класс.
По поводу начального значения, тут есть два пути: 1. По загрузке dom загонять начальное значение в переменную, оно там будет спокойно дожидаться своего часа славы. 2. Если предметов несколько, не выводить вообще суммарную цену экземпляров одного типа товара, а выводить её в поле "итого" для всех типов товаров. Также имеет смысл вынести код заполнения поля суммарной стоимости в отдельную функцию и привязать её в качестве обработчика события change поля #rateInput. Также напоминаю, что при клике по стрелочкам в обработчик в качестве this передаётся элемент этой самой стрелочки (в общем, то, по чему кликнули), поэтому можно плясать от неё и её родителей (второй её родитель - это уже .infoItem, ну а третий - .oneItem), а не обращаться жестко по id. |
А вот мелькнула такая мысль, ДОМ дерево у меня будет строится и пришедшего JSON объекта, что если из того же объекта и брать данные?
|
| Часовой пояс GMT +3, время: 09:25. |