3

我的 MVC 视图中有一个用于一堆链接和一个下拉选择器的 jquery 点击事件,我在执行事件之前对它们进行了 preventDefault,因为它们中的大多数重定向到一个视图(重定向停止我的 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 帖子是否真的在执行,因为控制台在新页面上刷新。

4

2 回答 2

2

jquery 中的“post”函数是异步操作(默认情况下异步标志为 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/

于 2011-08-17T23:51:57.790 回答
0

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

于 2011-08-17T22:50:04.397 回答