如何在从 jquery ajax 调用成功返回时显示 JQuery 对话框

Posted

技术标签:

【中文标题】如何在从 jquery ajax 调用成功返回时显示 JQuery 对话框【英文标题】:How to show a JQuery dialog on successful return from a jquery ajax invocation 【发布时间】:2020-08-13 16:44:58 【问题描述】:

在返回 ajax 调用时显示 jquery 对话框时遇到问题。下面是对话框和支持的html

function ShowDeleteReturnStatusDialog(deletedId) 
    $("#idDeleteReturnStatusDialog").dialog(
        title: 'Purchase Order ID ' + deletedId + ' was deleted.',
        resizable: true,
        height: 250,
        width: 350,
        modal: true,
        autoOpen: true,
        buttons: 
            'Ok': function () 

                $(this).dialog('close');
            
        
    );


<div id="idDeleteReturnStatusDialog" title=@Model.StatusTitle style="display:none;">
    <div class="container" style="border:groove;">
        <div class="row">
            <div class="col-6">
                @Model.StatusDescription
            </div>
        </div>
    </div>
</div>

我可以使用以下按钮和 jquery 来测试对话框以从按钮打开对话框:

<div id="idcontainerTopBtns" style="border:outset; background-color:#e6f7fe;">
    <input type="button" id="idTestBtn" value="Test" class="btn btn-primary" />

        $("#idcontainerTopBtns").on('click', '#idTestBtn', function () 
            ShowDeleteReturnStatusDialog(500);
        );
</div>

虽然对话框通过单击按钮打开,但当我进行 ajax 调用并尝试在 ajax 完成时显示它时它不会打开。下面是定义为在从 ajax 调用返回时打开对话框的 ajax 调用。问题是对话框没有显示在屏幕上:

function deletePurchaseOrder() 
    var purchaseOrderId = getPurchaseOrderId();
    event.preventDefault();
    var sToken = document.getElementsByName("__RequestVerificationToken")[0].value;
    $.ajax(
        url: '/PurchaseOrder/PurchaseOrderDelete',
        type: "POST",
        contentType: "application/x-www-form-urlencoded",
        data: 
            '__RequestVerificationToken': sToken,
            'id': parseInt($(this).attr("title")),
            'purchaseOrderId': purchaseOrderId
        
    )
        .done(function (deletedId) 
            window.location.replace("/PurchaseOrder/Create");
            ShowDeleteReturnStatusDialog(deletedId);
        )
        .fail(function (jqXHR, textStatus, errorThrown) 
            //Process Failure here
        );
;

如何解决这个问题,以便在完成 ajax 调用时显示对话框?提前致谢。

【问题讨论】:

window.location.replace("/PurchaseOrder/Create"); 是否在显示对话框之前重定向到其他页面? 是的。应用程序显示要删除的记录。当用户单击删除时,屏幕内容将停留在来自不同页面的空白屏幕上。因此,删除来自删除视图,而创建屏幕的空白位于创建视图上。所以删除后,从删除页面的视图切换到删除后新表单的视图。 好吧,这就是你的问题。您是否没有意识到,如果您离开页面(甚至是相同的 url),那么旧页面将不再存在? (因此该页面上运行的 js 不再运行)。 好的,我明白你在说什么。我认为这是因为对话框的 html 在创建页面视图上,而 jquery 在外部文件中,而不是在加载创建视图页面时它需要的编辑视图页面中。我希望对话框显示在创建视图页面上,这就是我在调用对话框之前加载创建视图的原因。我将更改并测试对话框是否可以在显示编辑视图页面时显示,然后单击确定按钮以加载创建视图页面。我会发布结果 【参考方案1】:

根据 Hadi 的评论,我对已解决问题的代码进行了更改。以下是更改:

通过从 .done 代码块中删除 window.location.replace 函数调用来修改以下 ajax。

function deletePurchaseOrder() 
    var purchaseOrderId = getPurchaseOrderId();
    event.preventDefault();
    var sToken = document.getElementsByName("__RequestVerificationToken")[0].value;
    $.ajax(
        url: '/PurchaseOrder/PurchaseOrderDelete',
        type: "POST",
        contentType: "application/x-www-form-urlencoded",
        data: 
            '__RequestVerificationToken': sToken,
            'id': parseInt($(this).attr("title")),
            'purchaseOrderId': purchaseOrderId
        
    )
        .done(function (deletedId) 
            ShowDeleteReturnStatusDialog(deletedId);
        )
        .fail(function (jqXHR, textStatus, errorThrown) 
            //Process Failure here
        );
;

通过将 window.location.replace 调用添加到 OK 按钮区域来修改 ShowDeleteReturnStatusDialog 函数。原来是在ajax .done 区域:

function ShowDeleteReturnStatusDialog(deletedId) 
    $("#idDeleteReturnStatusDialog").dialog(
        title: 'Purchase Order ID ' + deletedId + ' was deleted.',
        resizable: true,
        height: 250,
        width: 350,
        modal: true,
        autoOpen: true,
        buttons: 
            'Ok': function () 
                window.location.replace("/PurchaseOrder/Create");
                $(this).dialog('close');
            
        
    );

idDeleteReturnStatusDialog 的支持 html(如下所示)已从创建视图页面移动到编辑视图页面,这是为删除过程启动整个 JQuery 调用的地方:

<div id="idDeleteReturnStatusDialog" title="Purchase Order Deleted Notice" style="display:none;">
    <div class="container" style="border:groove;">
        <div class="row">
            <div class="col">
                The purchase order has been deleted.
            </div>
        </div>
    </div>
</div>

【讨论】:

【参考方案2】:

考虑下面的代码。

$(function() 
  function redirect(u) 
    if (u == undefined) 
      return false;
    
    window.location.replace(u);
  

  function createConfirm(t, c, cb) 
    return $("<div>").html(c).dialog(
      resizable: true,
      height: 250,
      width: 350,
      modal: true,
      autoOpen: true,
      title: t,
      buttons: 
        "Ok": cb
      ,
      close: function() 
        $(this).remove();
      
    );
  

  $("#idcontainerTopBtns").on('click', '#idTestBtn', function() 
    createConfirm("Delete Purchase Order", "Purchase Order 500 has been deleted.", function() 
      console.log("Ok Clicked");
      $(this).dialog("close");
    );
  );
);
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<div id="idcontainerTopBtns" style="border:outset; background-color:#e6f7fe;">
  <input type="button" id="idTestBtn" value="Test" class="btn btn-primary" />
</div>

这有点动态。这也允许您通过在函数内部使用回调函数来级联事件。

一个例子:

  $("#idcontainerTopBtns").on('click', '#idTestBtn', function() 
    createConfirm("Delete Purchase Order", "Purchase Order 500 has been deleted.", function() 
      redirect("/PurchaseOrder/Create");
    );
  );

【讨论】:

以上是关于如何在从 jquery ajax 调用成功返回时显示 JQuery 对话框的主要内容,如果未能解决你的问题,请参考以下文章

jQuery中ajax的4种常用请求方式

jQuery中ajax的4种常用请求方式

jQuery中ajax的4种常用请求方式

jQuery中ajax的4种常用请求方式

jquery ajax请求成功,但是进入了success,但是返回的数据data为空

JQuery ajax调用的返回值