e.keyCode 13 (клавиша ввода) и событие нажатия клавиши для обновления корзины, иногда не работающей

Я использую нажатие клавиш с помощью этой функции ООП, приведенной ниже, чтобы обновить корзину покупок и количество товаров на моем сайте. Иногда это работает, но большую часть времени, когда я нажимаю клавишу ввода, это не а) не обновляет корзину и не б) обновляет количество. Я думаю, что это обновляет страницу, что может быть проблемой.

Я посмотрел на значение заголовка запроса, проверив элемент qty, и он не обновляется при нажатии клавиши ввода, если это помогает.

function initBinds() {
if ($('.remove_basket').length > 0) {
$('.remove_basket').bind('click', removeFromBasket);
}
if ($('.update_basket').length > 0) {
$('.update_basket').bind('click', updateBasket);
}
if ($('.fld_qty').length > 0) {
$('.fld_qty').bind('keypress', function(e) {
var code = e.keyCode ? e.keyCode : e.which;
if (code == 13) {
updateBasket();
}
});
}
}

А вот и функция updateBasket

function updateBasket() {
$('#frm_basket :input').each(function() {
var sid = $(this).attr('id').split('-');
var val = $(this).val();
$.ajax({
type: 'POST',
url: '/mod/basket_qty.php',
data: ({ id: sid[1], qty: val }),
success: function() {
refreshSmallBasket();
refreshBigBasket();
},
error: function() {
alert('An error has occurred');
}
});
});
}

И это страница …

Обратите внимание, вы можете увидеть в строке 41 класс fld_qty используется для функции нажатия клавиши initiBinds if.

<?php

$session = Session::getSession('basket');
$objBasket = new Basket();

$out = array();

if (!empty($session)) {
$objCatalogue = new Catalogue();
foreach ($session as $key => $value) {
$out[$key] = $objCatalogue->getProduct($key);
}
}

require_once('_header.php'); ?>

<div id="cat_prod"><h1>- BASKET -</h1></div>

<?php

if (!empty($out)) { ?>

<div id="big_basket">
<form action="" method="post" id="frm_basket">
<table cellpadding="0" cellspacing="0" border="0" class="tbl_repeat">
<tbody id="basket_table">
<tr style="background-color: #f2f3ee;">

<th class="ta_left">Item</th>
<th class="ta_r">Qty</th>
<th class="ta_r col_15">Price</th>
<th class="ta_r col_15"></th>

</tr>

<?php foreach ($out as $item) { ?>

<tr>
<td class="ta_left_name"><?php echo Helper::encodeHTML($item['name']); ?></td>
<td class="ta_left_qty"><input type="text" name="qty-<?php echo $item['id']; ?>"id="qty-<?php echo $item['id']; ?>" class="fld_qty"value="<?php echo $session[$item['id']]['qty']; ?>" /></td>
<td class="ta_r">&pound;<?php echo number_format($objBasket->itemTotal($item['price'], $session[$item['id']]['qty']), 2); ?></td>
<td class="ta_r">&#160;<?php echo Basket::removeButton($item['id']); ?></td>

</tr>

<?php } ?>

<?php if ($objBasket->_vat_rate != 0) { ?>

<tr style="border-bottom: dashed 1px #aaa">

<td class="ta_left" colspan="2">Sub-total :</td>
<td class="ta_r bt_td">&pound;<?php echo number_format($objBasket->_sub_total, 2); ?></td>
<td class="ta_r bt_td">&#160;</td>

</tr>

<tr style="border-bottom: dashed 1px #aaa">

<td class="ta_left" colspan="2">VAT (<?php $objBasket->_vat_rate; ?>%) :</td>
<td class="ta_r bt_td">&pound;<?php echo number_format($objBasket->_vat, 2); ?></td>
<td class="ta_r bt_td">&#160;</td>

</tr>

<?php } ?>

<tr>

<td class="ta_right" colspan="2"><strong>Total :</strong></td>
<td class="ta_r bt_td">&pound;<?php echo number_format($objBasket->_total, 2); ?></td>
<td class="ta_r bt_td">&#160;</td>

</tr>

</tbody>
</table>

<div class="dev br_td">&#160;</div>
<div class="dev br_td">&#160;</div>

<div class="sbm sbm_blue fl_r">

<a href="/?page=checkout" class="btn">Checkout</a>

</div>

<div class="sbm sbm_blue fl_l update_basket">

<span class="btn">Update</span>

</div>

</form>
</div>

<?php } else { ?>

<br />
<br />
<p><em>Your basket is currently empty.</em></p>


<?php } ?>

<?php require_once('_footer.php'); ?>

Я просмотрел некоторые страницы statckflow по этому поводу и попробовал keydown и просто использовал e.which а также e.keyCode || e.which вместо этого, но все они выдают одну и ту же проблему: не работает 100% времени, когда вы нажимаете клавишу ввода.

Я понимаю, что некоторые браузеры могут не поддерживать это, так что есть ли лучший подход для этой операции? Я протестировал Firefox, Chrome и Safari (все последние).

Спасибо за помощь, ценится! 🙂

Редактировать;

Вот также mod / basket_qty.php …

<?php
require_once('../inc/autoload.php');

if (isset($_POST['qty']) && isset($_POST['id'])) {

$out = array();
$id = $_POST['id'];
$val = $_POST['qty'];

$objCatalogue = new Catalogue();
$product = $objCatalogue->getProduct($id);

if (!empty($product)) {

switch($val) {
case 0:
Session::removeItem($id);
break;
default:
Session::setItem($id, $val);
}
}
}

0

Решение

Похоже, мне нужно было добавить e.preventDefault(); в функции initBinds для if (code == 13) { как указано cmorrissey. Кажется, с этим все в порядке. Спасибо!!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]