首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用jquery-确认框停止回发,似乎无法获得返回值(webform项目)

使用jquery-确认框停止回发,似乎无法获得返回值(webform项目)
EN

Stack Overflow用户
提问于 2022-05-11 11:30:10
回答 1查看 195关注 0票数 2

因此,我试图将我的应用程序中的确认框更改为更时尚的东西。

JQueryecomm.js添加的内容非常吸引人,但我真的很难让它以我想要的方式工作。

我在页面上有一个简单的链接按钮。

代码语言:javascript
复制
<asp:LinkButton ID="lnkDelete" CssClass="btn btn-danger" runat="server" OnClientClick="return ShowConfirm();" CommandArgument='<%#Eval("StatusId")%>' OnClick="DeleteStatus">

在他们的站点上,这是推荐的实现,但它不返回值或停止回发。

代码语言:javascript
复制
$.confirm({
title: 'Encountered an error!',
content: 'Something went downhill, this may be serious',
type: 'red',
typeAnimated: true,
buttons: {
    tryAgain: {
        text: 'Try again',
        btnClass: 'btn-red',
        action: function(){
        }
    },
    close: function () {
    }
  }
});

我知道我可以将我的onclick函数移到这里,但是这样它就不能被重用了。当用户点击cancel时,我只想停止回发。那样的话,我可以在任何地方调用它,它就能正常工作。

我试了几件没有用的东西,这里有几个例子。所有这些都不能阻止回发,但我认为我应该包括我尝试过的内容。

代码语言:javascript
复制
function ShowConfirm() {            
        var Confirmed = $.confirm({
            title: 'Please Confirm!',
            content: 'Are you sue that you want to delete this record?',
            type: 'red',
            typeAnimated: true,
            buttons: {
                tryAgain: {
                    text: 'Delete',
                    btnClass: 'btn-red',
                    action: function () {
                        this.preventDefault();
                    }
                },
                close: function () {

                }
            }
        });
        return Confirmed;
    }

另一个

代码语言:javascript
复制
function confirmation() {
        var defer = $.Deferred();
        $.confirm({
            title: 'Please Confirm!',
            content: 'Are you sue that you want to delete this record?',
            type: 'red',
            typeAnimated: true,
            buttons: {
                tryAgain: {
                    text: 'Delete',
                    btnClass: 'btn-red',
                    action: function () {
                        //Do something
                        defer.resolve(true);
                    }
                },
                close: function () {
                    //Do Something
                    defer.resolve(false);
                }
            }
        });
        return defer.promise();
    };

    function ShowConfirm() {
        confirmation().then(function (answer) {
            console.log(answer);
            ansbool = (String(answer) == "true");
            if (ansbool) {
                alert("this is obviously " + ansbool);//TRUE
            } else {
                alert("and then there is " + ansbool);//FALSE
            }
        });
    }

我还尝试了最后一个发送返回值的方法,但这也不起作用。我的onclick服务器端代码总是执行。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-11 15:13:59

好吧,这是怎么回事?

在接近“每一个”的情况下,使用一些jQuery.UI对话框,甜警报和99%的情况下?

这些jQuery和JavaScript外接程序全部,在所有情况下都有一个巨大的“相似”方面:

也就是说,代码不等待,也不阻塞调用代码。

这种类型代码的技术术语是我们所称的异步代码。

在螺母壳中,当您调用这样的代码时,提示对话框或任何内容都会显示,但是代码不会停止。您调用的例程将100%通过其代码运行,显示对话框或其他什么,然后100%完成、退出并返回值。

这样的代码的原因是不冻结浏览器,不损坏重新绘制,并显示信息。

因此,在JavaScript中只有两个真正停止代码的命令是

“警报()”,并确认()。

以上两个命令将停止代码。因此,你的问题:

您有一个平面简按钮,并说一些代码删除或执行一个破坏性的选项,然后我们都连线代码如下:

代码语言:javascript
复制
        <asp:Button ID="cmdDelete" runat="server" Text="Server delete prompt" 
            OnClientClick="return confirm('Really delete this file?');"  />

而且,正如我们所知道的,如果用户点击cancel,那么按钮代码就不会运行。

但是,那些js外接程序和高级对话框呢?他们不会等的。

我没有您特定的js插件,但是由于我们都使用jQuery,所以我给出了一个如何使用jQuery.UI来实现这个功能的例子。

所以,我们拿着上面的按钮,现在这样做:

代码语言:javascript
复制
        <asp:Button ID="cmdTest" runat="server" Text="Server Delete Prompt" 
            ClientIDMode="Static" 
            OnClientClick="return mydeleteprompt(this)"/>

现在,在上面,我们调用一个例程,它将“显示”我们的对话框提示符。但是请记住上面的规则:代码流并不会停止调用js代码。

因此,我们需要做的仍然是第一次返回假。(现在显示了我们的酷提示对话框。

让这件事成功的方法?在上面我们通过了“这个”。在这种情况下," this“是当前按钮。所以,我们的代码现在看起来如下:

代码语言:javascript
复制
        <div id="MyDialog" style="display:none">
            <h4><i>my cool dialog text</i></h4>
            <h4><i>This delete can't be undone</i></h4>
        </div>
    </div>
    <script>
        var mydeleteok = false
        function mydeleteprompt(cmdBtn) {
            if (mydeleteok) {
                return true
            }

            myDialog = $("#MyDialog")
            myDialog.dialog({
                title: "Delete the whole server system",
                modal: true,
                appendTo: "form",
                buttons: {
                    ok: function () {
                        myDialog.dialog('close')
                        mydeleteok= true
                        $(cmdBtn).click()
                    },
                    cancel: function () {
                        myDialog.dialog('close')
                    }
                }
            })
            return false
        }

请注意,非常-但超级杜柏关闭在上面。例程将返回false。这意味着您单击按钮,调用js例程,显示对话框,然后返回FALSE。

现在,显示对话框。如果单击“确定”按钮,我们设置变量= true,然后再次单击该按钮!

这一次,相同的例程将运行,但我们设置“标志”= true,代码运行,并返回true,服务器端按钮代码将运行。

它看起来是这样的:

所以,用户点击按钮,运行代码,显示对话框,返回"false“。

现在,如果用户点击"ok",那么我们运行以下代码:

代码语言:javascript
复制
                buttons: {
                    ok: function () {
                        myDialog.dialog('close')
                        mydeleteok= true
                        $(cmdBtn).click()
                    },

所以,我们设置了标志= true,然后再次单击按钮!这一次,按钮调用我们的例程,但这次例程将返回true,现在该按钮的服务器端代码将运行。

那么,你的大问题和问题?近100%,如果不是所有的JavaScript代码,这些天异步运行。它不需要等待。

因此,有一些先进的概念,如“等待”和诸如JavaScript“承诺”之类的东西,但它仍然没有解决这个问题。

因此,asp.net按钮单击事件,使用onclientclick是一个很好的特性,但是当您想要使用某种类型的对话框“外接程序”时,它往往会出现一些问题,因为正如我所说的,它们都没有等待。因此,您必须采用上述概念,设置一个标志(该标志代码仅在页面加载时运行--第一次)。

实际上,在使用.click()运行该按钮之后,可能会再次设置标志= false。但是,由于服务器端按钮导致回发,那么在大多数情况下,我们的标志将被重新设置为false。

编辑:使用jquery的示例-确认。

如前所述,我从未使用过确认库(其中大约有1+百万可供查找--您可能应该提供一个链接)。

无论如何,该对话框的工作方式如下:

代码语言:javascript
复制
        <asp:Button ID="Button1" runat="server" Text="Button" CssClass="btn"
            OnClick="Button1_Click"
            OnClientClick="return myconfirm(this)"              
            />

        <script>

            var myconfirmok = false
            function myconfirm(btn) {

                if (myconfirmok) {
                    return true
                }

                $.confirm({
                    title: 'Confirm!',
                    content: 'Simple confirm!',
                    buttons: {
                        confirm: function () {
                            myconfirmok = true
                            $(btn).click()
                        },
                        cancel: function () {
                            console.log("user hit cancel")
                            
                        }
                    }
                });
                return false  // routine MUST return false!!!!
            }

注意,在上面非常小心-我们在最后一行返回false!

因此,单击按钮,客户端代码运行,显示对话框,返回false。

现在,用户可以单击“取消”按钮,也可以单击“确认”。如果他们点击确认,我们设置标志= true,然后单击再次传递的按钮。现在,我们的例程再次运行,这次返回true,因此您的服务器端代码现在运行。

Edit3:-问题是LinkButton的使用

这里的问题是如何使用jQuery (甚至JavaScript)来单击链接按钮?

你必须用这个:

代码语言:javascript
复制
        <asp:Repeater ID="Repeater1" runat="server">

            <ItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("HotelName") %>' >
                </asp:TextBox>

                <asp:LinkButton ID="cmdDel" runat="server" ClientIDMode="Static"
                    CommandArgument='<%# Eval("ID") %>'
                    onclick="cmdDel_Click"
                    OnClientClick="return myconfirm(this)"                        
                    >delete</asp:LinkButton>

                <br />
            </ItemTemplate>
        </asp:Repeater>


        <script>

            var myconfirmok = false
            function myconfirm(btn) {

                if (myconfirmok) {
                    return true
                }

                $.confirm({
                    title: 'Confirm!',
                    content: 'Simple confirm!',
                    buttons: {
                        confirm: function () {
                            myconfirmok = true
                            $(btn)[0].click()
                        },
                        cancel: function () {
                            console.log("user hit cancel")
                        }
                    }
                });
                return false  // routine MUST return false!!!!
            }
        </script>

所以,你必须解决的点击,甚至与。

当然,我从不使用链接按钮--我通常只是插入一个标准按钮,并且没有太多的理由使用链接按钮。但是,问题是是否使用了jQuery.Click --它需要使用单击事件才能工作。

我的链接按钮单击事件背后的代码如下:

代码语言:javascript
复制
Protected Sub cmdDel_Click(sender As Object, e As EventArgs)

    Dim cmdDel As LinkButton = sender

    Dim intPKID As Integer = cmdDel.CommandArgument

    Debug.Print("code here to delete row with PK id = " & intPKID)

    ' get current repeater row
    Dim OnerepRow As RepeaterItem = cmdDel.NamingContainer

    Debug.Print("Repeter index row click = " & OnerepRow.ItemIndex)

    ' get hotel name texgt box
    Dim txtHotel As TextBox = OnerepRow.FindControl("TextBox1")
    Debug.Print(txtHotel.Text)


End Sub

当我运行它的时候

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72200278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档