Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 与链接和下拉选择器的默认值相反?_Jquery_Asp.net Mvc 3_Callback_Click_Preventdefault - Fatal编程技术网

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(),运气不

我在MVC视图中有一个jquery click事件用于一组链接和一个下拉选择器,在执行该事件之前,我对它们进行了默认设置,因为它们大多数重定向到一个视图(重定向停止了我的jquery代码,不是吗?)。在我点击事件中的所有回调之后,我希望链接和下拉选择器执行它们的默认事件,这样它就不会像什么都没发生一样坐在页面上

有没有一种简单的方法可以让所有链接/下拉列表返回默认值,然后在jquery中通过编程单击它们?我试过
$(这个)。点击()
$(这个)。提交()
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”参数后,它就可以工作了!谢谢我也会考虑创建一个包装器函数。