1

我尝试使链接触发一个javascript函数,该函数触发一个ajax调用来删除一个项目。

像这样:

<a class="delete" href="@item.Product.Id">(x)</a>

点击叉号会显示要删除的产品的id。href 属性存在的唯一原因是携带该值。

$(document).ready(function () {  
$('.delete').click(function (e) {
    e.preventDefault();
    var id = $(this).attr("href");
    deleteItem(id);
    return false;
});
});

Ajax 调用:根据要求:

function deleteItem(id) {
$.ajax({
    url: "/Shoppingcart/RemoveItem",
    type: "POST",
    data: "id=" + id,
    cache: false,
    error: function (xhr, status, error) {
        console.log(xhr, status, error);
    },
    success: function () {
        $.ajax({
            url: "/Shoppingcart/Index",
            type: "GET",
            cache: false,
            error: function (xhr, status, error) {
                console.log(xhr, status, error);
            },
            success: function (result) {
                success(result);
            }
        });
    }
});

}

成功功能用于获取购物车的更新版本。这实际上工作得很好。但是,我在循环的中途得到了一个奇怪的页面刷新。

我点击链接。

页面刷新并且该项目未被删除。

我再次点击链接。

页面未刷新。

该项目被删除。

为什么我必须单击两次,我该怎么做才能解决这个问题?

4

4 回答 4

2

通常,当页面很大并且document.ready单击链接时事件尚未触发时,您会得到这样的行为。第二次加载速度可能更快(脚本/css 已经下载并来自缓存)。

于 2012-10-23T16:29:59.950 回答
2

最正确的答案是:你不知道错误是什么,因为在你看到错误之前页面正在刷新。

Return false 可防止页面在单击事件后刷新,但如果代码在此之前遇到错误...

因此,您可以尝试删除href标签并将其设为 rel(或其他)标签。阅读它并将其用于您的 AJAX 调用。给href一个像#or的值#removeItem。这会给你带来你渴望的错误。

希望这可以帮助!

于 2012-10-24T09:50:27.457 回答
0

正确答案是:当您在页面加载(例如使用 AJAX)向 html添加一个元素并且您希望以任何方式触发一个事件。您必须将单击事件重新绑定到新元素。

当页面被加载并且你的 javascript 和 jQuery 被加载时。该元素还不是他们的,因此他们无法找到它或与之交互。

所以在我的情况下:

function addItem(id, amount) {
    $.ajax({
        url: "/Shoppingcart/AddItem",
        type: "POST",
        data: "id=" + id + "&amount=" + amount,
        cache: false,
        error: function (xhr, status, error) {
            console.log(xhr, status, error);
        },
        success: function () {
            // Calls for the new update version of the shopping cart.
            $.ajax({
                url: "/Shoppingcart/Index",
                type: "GET",
                cache: false,
                error: function (xhr, status, error) {
                    console.log(xhr, status, error);
                },
                success: function (result) {
//Call the function that changes the html
                        success(result);
                    }
                });
            }
        });
    }

function success(result) {
    $("#shoppingcart").html(result);
//The tricky part: rebinding the new event.
    $('.delete').click(function (e) {
        e.preventDefault();
        var id = $(this).attr("data-id");
        deleteItem(id);
        return false;
    });
}

刷新后删除按钮确实起作用了,因为这样 javascript 被重新加载并且元素被正确绑定。

于 2012-10-25T14:11:35.350 回答
0

据我所知,有一个隐藏字段或隐藏跨度来保存“ProductId”并完全删除 href 属性,如下所示。

<span id="productIdSpan">@item.Product.Id</span>
<a class="delete"></a>

jQuery:

$(document).ready(function () {   
     $('.delete').click(function (e) {     
     var id = $("#productIdSpan").html();     
     deleteItem(id);     
     return false; 
  }); 
}); 

编辑:方法2:

您可以将 ProductId 存储在锚标记的“标题”属性中,如下所示

jQuery:

$(document).ready(function () {   
     $(".delete").on("click", function (e) {     
     deleteItem($(this).attr("title"));     
     return false; 
  }); 
}); 

这应该可以解决您的问题。希望这可以帮助!!

于 2012-10-23T16:31:10.590 回答