链接和下拉选择器的阻止默认行为的相反操作是什么?

3
我在MVC视图中有一些链接和一个下拉选择器的jQuery点击事件,并在执行事件之前阻止它们的默认行为,因为大多数情况下它们会重定向到另一个视图(重定向会停止我的jQuery代码,对吧?)。在所有回调结束后,我想让这些链接和下拉选择器执行它们的默认事件,以便页面不只是呆在原地没有任何反应。
有没有一种简单的方法可以让所有链接/下拉选择器返回到默认状态,然后使用jQuery进行编程式的点击?我已经尝试了$(this).click()、$(this).submit()、e.click()和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提交是否实际执行,因为控制台在新页面上刷新。

好问题。我也想知道 :) - cmplieger
可能是重复的问题:如何重新启用event.preventDefault? - John Flatness
对于第二个问题:如果执行后不够快,它的请求可能会被取消(请求中止)。因此,它可能会或可能不会被执行。如果您将ajax请求变成同步的,您就不会遇到这个问题。 - longchiwen
2个回答

2
jQuery中的“post”函数是异步操作(默认情况下async标志为true)。在单击事件中的代码将在页面重新加载之前完全执行,因此无需使用preventDefault。您需要将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 调用完成。
请参阅 http://api.jquery.com/jQuery.ajax/ 了解 async 参数的解释。

我知道$.post是异步的,但是通过设置async: false,这是否实际上使链接在我的点击事件完成之前等待它的操作?我认为关闭async只是让jquery代码等待该调用。 - Evan Layman
这正是发生的事情。通常你希望操作是异步的。但是如果你想确保ajax请求已完成,你不能离开页面。离开页面会导致文档卸载,这将导致底层XMLHttpRequest对象被销毁并取消任何挂起的请求。你可以通过使操作同步或在ajax对象的“成功”处理程序中执行元素默认操作来实现这一点。在两种情况下,你都必须等待ajax调用完成,但第一种选项需要更少的编码并且更易读。 - longchiwen
非常感谢,我会尝试这个方法。如果我有5个嵌套的$.post调用,我需要将所有5个转换为同步的ajax post调用,对吗? - Evan Layman
是的。或者您可以创建一个服务函数来执行所有5个任务(只是某种包装函数)。这样会更快,因为您只需要进行一次服务器往返。 - longchiwen
添加了"type: 'POST'"参数后,它可以工作了!谢谢!我会考虑创建一个包装函数。 - Evan Layman

0

我认为在你的情况下,你不需要调用preventDefault,因为你的事件处理程序将首先被执行。(也许在if语句中,当你想要导航到其他地方时,你可以调用它。)


我并不想完全阻止preventDefault,只是因为页面在所有控制台输出之前重定向,所以我的帖子没有被完成。我这样想错了吗? - Evan Layman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接