Jquery 与链接和下拉选择器的默认值相反?
我在MVC视图中有一个jquery click事件用于一组链接和一个下拉选择器,在执行该事件之前,我对它们进行了默认设置,因为它们大多数重定向到一个视图(重定向停止了我的jquery代码,不是吗?)。在我点击事件中的所有回调之后,我希望链接和下拉选择器执行它们的默认事件,这样它就不会像什么都没发生一样坐在页面上 有没有一种简单的方法可以让所有链接/下拉列表返回默认值,然后在jquery中通过编程单击它们?我试过Jquery 与链接和下拉选择器的默认值相反?,jquery,asp.net-mvc-3,callback,click,preventdefault,Jquery,Asp.net Mvc 3,Callback,Click,Preventdefault,我在MVC视图中有一个jquery click事件用于一组链接和一个下拉选择器,在执行该事件之前,我对它们进行了默认设置,因为它们大多数重定向到一个视图(重定向停止了我的jquery代码,不是吗?)。在我点击事件中的所有回调之后,我希望链接和下拉选择器执行它们的默认事件,这样它就不会像什么都没发生一样坐在页面上 有没有一种简单的方法可以让所有链接/下拉列表返回默认值,然后在jquery中通过编程单击它们?我试过$(这个)。点击()和$(这个)。提交()和e。点击()和e.submit(),运气不
$(这个)。点击()
和$(这个)。提交()
和e。点击()
和e.submit()
,运气不好
这是我的密码
$("input,a,select").not("#SubmitButton").click(function (e) {
e.preventDefault();
console.log("prevented default");
deletePreview($(this));
});
function deletePreview(button) {
console.log("clicked");
//Delete Offer from DB
$.post('@Url.Content("~/")Offer/DeleteJoAnnOffer/?offerId=' + offerID, function (data) {
console.log("finished deleting");
if (button.attr('id') == "CancelButton") {
window.location.href = '@Url.Content("~/")Offer/CreateJoAnn/';
} else {
//DO DEFAULT ACTION HERE
}
});
};
[编辑]:还有一个问题:如果我不使用preventDefault(),我的jquery事件会执行(因为我的控制台记录“单击”),但我无法确认jquery帖子是否实际执行,因为控制台会在新页面上刷新。我想在您的情况下,您不需要调用preventDefault,因为您的事件处理程序将首先执行。(如果您想在其他地方导航,可以在中调用它。)jquery中的“post”函数是异步操作(默认情况下异步标志为true)。在重新加载页面之前,您的click事件内的代码将完全执行,所以不需要使用默认值。您必须将deletePreview中的post函数更改为同步:
$("input,a,select").not("#SubmitButton").click(function (e) {
console.log("you do not need to call prevented default :)");
deletePreview($(this));
});
function deletePreview(button) {
console.log("clicked");
//Delete Offer from DB
$.ajax('@Url.Content("~/")Offer/DeleteJoAnnOffer/?offerId=' + offerID,
{
async: false,
success: function (data) {
console.log("finished deleting");
if (button.attr('id') == "CancelButton") {
window.location.href = '@Url.Content("~/")Offer/CreateJoAnn/';
} else {
//DO DEFAULT ACTION HERE
}
}
});
};
这意味着click事件中的代码将等待deletePreview中的ajax调用完成
有关异步参数的说明,请参见好问题。我也想知道:)第二个问题的可能重复:如果后期执行不够快,它的请求可能会被取消(请求中止)。所以它可能会也可能不会被执行。如果您将ajax请求转换为同步,就不会有这个问题。我不想完全避免默认,我只是认为,由于页面在所有控制台输出之前重定向,因此我的帖子没有完成。我这样想是不是错了?我理解
$。post
是异步的,但是通过设置async:false
,这是否真的会使链接在执行其操作之前等待我的单击事件完成?我认为关闭async
只会让jquery代码等待调用。这正是发生的情况。通常,您希望操作是异步的。但若您想确保ajax请求已经完成,就不能离开页面。导航到别处将导致文档卸载,这将导致底层XMLHttpRequest对象被销毁,并取消进程中任何挂起的请求。您可以通过使操作同步或在ajax对象的“成功”处理程序中执行元素默认操作来实现这一点。在这两种情况下,您都必须等待ajax调用完成,但第一个选项需要更少的编码,更具可读性。非常感谢,我将尝试一下。如果我有5个嵌套的$.post调用,我需要将所有5个转换为同步ajax post调用,对吗?是的。或者您可以创建一个服务函数来执行所有5个任务(只是某种包装函数)。这将更快,因为您将只进行一次到服务器的往返。添加类型:“POST”参数后,它就可以工作了!谢谢我也会考虑创建一个包装器函数。