0

我有一个带有 onclick 和 onclientclick 事件的 asp 按钮。onclientclick,它调用一个js函数来保存。如果保存有任何错误,我想停止 onclick 事件。我尝试了 e.preventdefault()、e.stopPropogation(),返回 false。似乎没有任何效果。这是我的代码:按钮:

<asp:Button ID="btnAddNewAddr" runat="server" onclick="btnAddNewAddr_Click" OnClientClick="SaveLocAddress();" class="btn btn-primary" 
            Text="Save Address" UseSubmitBehavior="false" />

js保存方法:

function SaveLocAddress(e) {
    if (validaddr) {
            $.ajax({
                type: "post",
                async: false,
                contentType: "application/json; charset=utf-8",
                dataType: "JSON",
                url: "/Pages/Location/Search.aspx/SaveLocationAddress",
                data: "{ addrDTO: " + JSON.stringify(`addrToSave`) + "}",
                success: function (xhr, ts, error) {
                    AlertAddrSuccess(id);
                },
                error: function () {
                    console.log('error');
                    AlertAddrError();
                    e.stopPropogation();

                },
                complete: function () {
                    if ($('#alertAddressError').text() != "")
                        return false;
                }
            });
        }
}
4

1 回答 1

0

AJAX异步运行。所以这里发生了两件事:

  1. 该事件在您的回调处理程序甚至被调用之前传播(在 AJAX 调用响应之前)。
  2. 回调处理程序没有附加到SaveLocAddress它们被调用时的上下文,因此这些return语句不会去任何地方。

这可能需要一些重新设计。也许两个按钮?一种是asp:Button但被设计为隐形。另一个是普通的button,具有您希望按钮具有的文本/样式。事件的顺序是:

  1. 用户单击 HTML 按钮
  2. JavaScript 按钮处理程序调用 AJAX 调用
  3. 根据 AJAX 响应,它会触发click隐藏按钮上的事件。

这是一种迂回的做事方式,但这就是适合您的 WebForms。它可能是这样的:

<asp:Button ID="btnAddNewAddr" runat="server" onclick="btnAddNewAddr_Click" class="btn btn-primary invisible" UseSubmitBehavior="false" />
<input type="button" class="btn btn-primary" value="Save Address" onclick="SaveLocAddress();" />

然后在您想要调用回发功能的 JavaScript 代码中,您可以执行以下操作:

$('#<%= btnAddNewAddr.ClientID %>').trigger('click');

这将触发click事件,就asp:button好像用户点击了它一样。

于 2013-10-04T18:06:49.720 回答