gpt4 book ai didi

javascript - 在 ajax 调用后更新 HTML 表数据后输入选择器丢失

转载 作者:太空狗 更新时间:2023-10-29 14:20:41 26 4
gpt4 key购买 nike

问题背景:

我有一个带有购物车的 MVC4 项目,如图所示:

enter image description here

这使用 Touchspin.js 为用户提供一种方法来更新购物车中每件商品的购物车数量。输入包含增加或减少数量的选择器:

enter image description here

问题:

如果用户从购物车中删除了一个项目,我通过 ajax POST 请求将指定的项目 ID 发送到购物车 Controller 上的一个方法,该方法反过来将其从购物车项目列表中删除。完成后,项目列表将返回到 ajax 调用的 Success 函数,该函数构建列表项目的 html 行,然后将它们附加到购物车表。

问题是,当从成功调用重建购物车项目表时,我似乎丢失了 Touchspin 输入选择器 HTML。它在页面最初加载时使用相同的方法。此处显示格式不正确的 HTML 输入的图像,红色箭头表示缺少的选择器:

enter image description here

代码:

  @{
Layout = "~/Views/Shared/MasterLayout.cshtml";
}


<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="~/Scripts/jquery.js"></script>
<script src="~/Scripts/bootstrap.js"></script>
<script src="~/Scripts/jquery.blImageCenter.js"></script>
<script src="~/Scripts/bootstrap.touchspin.js"></script>
<script src="~/Scripts/mimity.js"></script>


<h2>Cart</h2>
<br />
<table id="Table1" class="table table TableSection">
<thead>
<tr>
<td style="display:none;">id</td>
<td></td>
<td class="TableCell"><b>Item</b></td>
<td class="TableCell"><b>Brand</b></td>
<td class="TableCell"><b>Unit Price</b></td>
<td class="TableCell"><b>Quantity</b></td>
<td></td>
</tr>
</thead>
<tbody></tbody>
</table>
<input class="btn btn-success btn-block updateCart" type="button" value="Update Cart" />

@Html.Partial("_ViewCartContents")

<div class="PaymentButtons">
<div class="row">

<div class="col-sm-4">

<input class="btn btn-success btn-block updateCart" type="button" value="PayPal" onclick="location.href='@Url.Action("Index", "PayPalExpress")'" />

</div>
<div class="col-sm-4 pull-left">
<input class="btn btn-success btn-block updateCart" type="button" value="Card Payment" onclick="location.href='@Url.Action("ShippingDetails", "PayPalDirectPayment")'" />
</div>
</div>
</div>
</script>

AddRows 用于构建购物车项目列表中每个项目的行。这是附加到购物车表体。

<script type="text/javascript">

var AddRows = function (productId, productImage, productName, productBrand, productPrice, productQty) {

var button = '<input class="btn btn-primary btn-block deleteItem" type="button" value="Remove"/>';
var image = '<img src="/Images/' + productImage + '" class="productCartImage"/>';
var selectors = '<input id="demo1" type="text" value="' + productQty + '" name="demo1">';


var $html = $('<tr class="item">' +
'<td class="prodId" style="display:none;">' + productId + '</td>' +
'<td class="prodImage hidden-xs">' + image + '</td>' +
'<td class="prodName">' + productName + '</td>' +
'<td class="prodBrand">' + productBrand + '</td>' +
'<td class="prodPrice"> £' + productPrice + '</td>' +
'<td class="prodQty TableCell">' + selectors + '</td>' +
'<td>' + button + '</td>' +
'</tr>');

$('#Table1 > tbody:last').append($html);

};
</script>


@foreach (var cartItem in (List<LoginTest.Models.CartItem>)ViewBag.Data)
{
<script>
var cartItemId = '@cartItem.CartItemId';
var cartImage = '@cartItem.CartItemImage';
var cartItemName = '@cartItem.CartItemName';
var cartBrand = '@cartItem.CartItemBrand';
var cartItemPrice = '@cartItem.CartItemPrice';
var cartItemCartItemQty = '@cartItem.CartItemQty';

AddRows(cartItemId, cartImage, cartItemName, cartBrand, cartItemPrice, cartItemCartItemQty);

</script>
}

Delete 函数用于删除指定的购物车商品,然后在 Success 方法中使用 AddRows 方法重建购物车商品。

    $(".deleteItem").click(function () {
var $row = $(this).closest("tr");
var $text = $row.find(".prodId").text();

$.ajax({
url: '@Url.Action("RemoveCartItem")',
type: 'POST',
data: {
"id": $text
},
success: function (cartItems) {

$('#Table1 > tbody:last').empty();

$.each(cartItems.cartList, function (i, item) {

AddRows(item.CartItemId, item.CartItemImage, item.CartItemName, item.CartItemBrand, item.CartItemPrice, item.CartItemQty);

});
}
});
});
</script>

TouchSpin 输入选择器设置值。

<script>
$("input[name='demo1']").TouchSpin({
min: 1,
max: 100,
step: 1,
});
</script>

最佳答案

每次将它动态添加到 DOM 时,都必须将 Touchspin API 添加到名称为 demo1 的输入元素。

有多种方法可以将 API 绑定(bind)到动态加载的内容上

Method 1

您可以在将 $html 附加到 $('#Table1 > tbody:最后')

AddRows 函数的结尾应该是这样的

    /*....Addrows funcion....*/
$html.find("input[name='demo1']").TouchSpin({
min: 1,
max: 100,
step: 1,
});
$('#Table1 > tbody:last').append($html);
};

Method 2

您可以在 $.each 函数之后的成功函数中调用 demo1 上的 Touchspin。所以你的 success 函数变成了

success: function (cartItems) {
$('#Table1 > tbody:last').empty();
$.each(cartItems.cartList, function (i, item) {
AddRows(item.CartItemId, item.CartItemImage, item.CartItemName, item.CartItemBrand, item.CartItemPrice, item.CartItemQty);
});
$("input[name='demo1']").TouchSpin({
min: 1,
max: 100,
step: 1,
});
}

但是,您的代码需要重构,正如 Ste-fu 在评论中提到的那样,因此您可以返回 1 或 0(或一些文本来区分某些错误或 OK 响应)如果 response 表示该项目已被删除,那么您从 DOM 中删除 $row ,在这种情况下,您的成功功能将变成这样

success: function (status) {
if(status==1)//means that item is removed from database then
$row.remove(); //remove the closest row to the clicked element
}

关于javascript - 在 ajax 调用后更新 HTML 表数据后输入选择器丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29661507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com