PreventDefault与链接和下拉选择器相反?

时间:2011-08-17 22:05:17

标签: jquery asp.net-mvc-3 callback click preventdefault

我在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事件就会执行(初始部分因为我的控制台记录了“clicked”),但我无法确认jquery帖子是否实际执行因为控制台会在新页面上刷新。

2 个答案:

答案 0 :(得分:2)

jquery中的“post”函数是异步操作(默认情况下async标志为true)。在重新加载页面之前,您在click事件中的代码将完全执行,因此不需要使用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/

答案 1 :(得分:0)

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