【问题标题】:User is able to click a button multiple times when it should close the form after the first click用户可以在第一次单击后关闭表单时多次单击按钮
【发布时间】:2015-12-08 06:31:30
【问题描述】:

在主页面上,有一个按钮会弹出一个对话框,提示用户输入用户名和密码。当他们单击“保存”时,凭据将被验证(JS 和 SQL)并且窗口关闭,或者告诉他们他们的凭据无效。

我遇到了一些奇怪的行为,我可以无限地捣碎按钮,然后多次执行“保存”操作。

Page_Load 上,我们将一个Javascript“事件”附加到按钮上,如下所示:

btnSave.Attributes.Add("onClick", "return ValidateUserPasswordSignPopup('" & txtUsername.ClientID & "', '" & txtPassword.ClientID & "');")

Javascript 验证:

function ValidateUserPasswordSignPopup(userTxtBox, PassTxtBox)
{
    var userTextBoxctrl = document.getElementById(userTxtBox)
    var PassTxtBoxctrl = document.getElementById(PassTxtBox)

    if (userTextBoxctrl.value.trim() == '') {
        alert("Please enter User Name.")
        document.getElementById(userTxtBox).focus();
        return false;
    }

    if (PassTxtBoxctrl.value.trim() == '')
    {
        alert("Please enter Password.")
        document.getElementById(PassTxtBox).focus();
        return false;
    }

    return true;
}

按钮点击:

Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSave.Click

    If SaveData() Then
        Response.Write("<script language = JavaScript>window.returnValue='yes';self.close();</script>")
    End If

End Sub

SaveData() 只是创建一些对象,运行一个存储过程,再创建一些对象,然后创建一个DataTable,它被传递给另一个方法并保存到数据库中。没有什么太激烈的。

我尝试在 JS 方法中添加代码以禁用按钮,然后在代码端单击事件结束时重新启用它,但窗口似乎以这种方式无限挂起。

我还尝试在 JS 之间切换其状态(在每个 return / 结束之前重新启用它),然后在单击事件开始时重新禁用它并在点击事件结束,但我仍然可以通过这条路线多次点击按钮。

有人知道是什么原因造成的吗?

编辑 我最初的想法是运行 Javascript 所需的时间,尽管它是一个简短的脚本,但它允许用户在回发处理之前重新单击按钮点击事件。我完全删除了在上面的第一个代码块中添加到Page_Load 中的脚本,但行为仍然发生。

【问题讨论】:

    标签: javascript asp.net vb.net


    【解决方案1】:

    由于表单提交到服务器和来自服务器的响应内容之间存在延迟,用户可以多次单击该按钮。

    ValidateUserPasswordSignPopup 中禁用或隐藏return true; 之前的按钮。

    另一种方式:

    var submittedFlag = false;
    function ValidateUserPasswordSignPopup(userTxtBox, PassTxtBox)
    {
      if (submittedFlag)
        return false;
    
      ...
    
      submittedFlag = true;
      return true;
    }
    

    【讨论】:

    • 如上一段所述,在编辑之前,我尝试在 Javascript 和代码中切换启用状态。我还尝试完全删除 Javascript。两者都没有解决问题。也就是说,您对submittedFlag 的第二个想法确实 奏效了。
    【解决方案2】:

    尝试使用 ClientScriptManager.RegisterClientScriptBlock 方法注册 JavaScript,而不是使用 Response.Write。

    Protected Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
    
        If SaveData() Then
    
            Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "YourKey", _
                                                        "<script language = JavaScript>window.returnValue='yes';self.close();</script>")
    
        End If
    
    End Sub
    

    【讨论】:

    • 不幸的是,这似乎没有什么不同。
    • 很遗憾听到这个消息。当我测试它时,这对我有用。尝试使用浏览器的开发者工具,看看是否有问题。也许我们缺少一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多