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

use*_*057 7 html javascript ajax jquery

问题背景:

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

在此输入图像描述

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

在此输入图像描述

问题:

如果用户从购物车中删除商品,我会通过ajax POST请求将指定的商品ID发送到购物车控制器上的方法,该方法又将其从购物车商品列表中删除.完成此操作后,项目列表将返回到Successajax调用的函数,该调用将构建列表项的html行,然后将它们附加到购物车表.

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

在此输入图像描述

代码:

  @{
    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>
Run Code Online (Sandbox Code Playgroud)

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>
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

TouchSpin输入选择器设置值.

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

bug*_*s94 1

Touchspin每次动态将API 添加到具有名称的输入元素时,都必须demo1将其添加到DOM.

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

方法一

您可以在附加到之前Touchspin在函数中调用 demo1AddRows$html$('#Table1 > tbody:last')

就像你的函数结束AddRows应该是这样的

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

方法2

您可以在函数之后调用成功Touchspin函数。所以你的函数就变成了demo1$.eachsuccess

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,
    });
}
Run Code Online (Sandbox Code Playgroud)

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

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