【问题标题】:ASP.NET prevent double clickingASP.NET 防止双击
【发布时间】:2011-09-11 04:59:59
【问题描述】:

我之前看过这个,并在我测试它时发现适用于我的 javascript 与 Google Chrome、Firefox 和 IE,但它似乎随机(或特定于浏览器)它不起作用。我需要一个可行的解决方案。

这是我目前使用的 jQuery:

$(document).ready(function () {
    $("a.Once").one("click", function () {
        $(this).click(function () { return false; });
    });
});

我将“Once”类添加到我想确保不会被多次点击的按钮中。同样,它对我来说总是正常工作,但对于某些用户来说,它根本没有做任何事情。是否有更好的替代解决方案始终有效?

更新:这些是 ASP.NET 链接按钮。

6/18 更新: 我从两个一直遇到此问题的用户那里获得了更多信息。

有人说他点击了一次按钮,屏幕闪烁,所以他离开页面并返回页面并再次点击按钮,导致它自动发布两次。

另一个声称他点击了一个不同的按钮,导致该按钮自动回发两次。我查看了代码,那个按钮没有问题。

我唯一能想到的是缓存问题,或者可能在页面完成加载之前点击了按钮。我无法重现该问题,其中一个问题与我使用的浏览器完全相同。

【问题讨论】:

  • 当您说“双击”时,您是指多次单击某个元素,或者说 UI 手势“双击”?
  • 多次点击按钮。有些人是双击者。这是一个 ASP.NET 链接按钮。我可能应该提到这一点。

标签: jquery asp.net double-click


【解决方案1】:

我用 JQuery 尝试了很多选项,但这就​​是我在用 c# 编写简单代码后解决的方法:

.aspx 页面:

现在您将其添加到 Page_Load 后面的代码中:

       protected void Page_Load(object sender, EventArgs e)
       {

         ClientScriptManager cs = Page.ClientScript;

         ButtonID.Attributes.Add("onClick", "this.disabled=true;" +    cs.GetPostBackEventReference(ButtonID, "").ToString());

       }

最后一件事:

      protected void ButtonID_Click(object sender, EventArgs e)  
      {
            System.Threading.Thread.Sleep(5000);
            //rest of your code

      }

希望这会有所帮助!

帖子更新:

使用 JavaScript,您可以在第二次发生按钮单击的客户端事件时停止表单提交

    <script type="text/javascript">

      var isSubmitted = false;

      function preventMultipleSubmissions() {

      if (!isSubmitted) {

         $('#<%=btnSubmit.ClientID %>').val('Submitting.. Plz Wait..');

        isSubmitted = true;

        return true;

      }

      else {

        return false;

      }

    }

    </script>
    <asp:LinkButton ID="btnSubmit" runat="server" Text="Submit" OnClientClick="return preventMultipleSubmissions();"  OnClick="btnSubmit_Click"  />

或者您可以在 Postback 的后端进行:

btnSubmit.Attributes.Add("onclick", " this.disabled = true; " + ClientScript.GetPostBackEventReference(btnSubmit, null) + ";");

【讨论】:

    【解决方案2】:

    您可以隐藏现有链接并在之后放置一些文本,以提醒用户该页面正在加载。

    <asp:LinkButton CssClass="Once" runat="server">Button</asp:LinkButton>
    
    <script type="text/javascript">
    
        $(document).ready(function ()
        {
            $("a.Once").one("click", function (event)
            {
                $(this).hide().after("Please wait while we load your page...");
            });
        });
    
    </script>
    

    另外,考虑添加代码服务器端。你永远不能指望 JavaScript 被启用。

    编辑:回答 2.0

    【讨论】:

    • 它实际上是一个 ASP.NET LinkBut​​ton 所以它有一个 href=。昨天我将 href 值更改为 # 但我不喜欢这样的结果。现在我想起来了,我应该把它改成:javascript:void(0);
    • 我认为 jQuery 是问题所在。我没有禁用,而是将 href 更改为 javascript:void(0);并注意到有一次我按下按钮它没有做任何事情,就像它已经是无效的,即使它不应该是。该表单从未提交。你有 .NET 的服务器端代码来防止它吗?
    • 如果您使用的是 LinkBut​​ton,那么您就是在 WebForms 中。当用户单击按钮时,您可以在 ViewState 中存储一个值。 ViewState["buttonId_clicked"] = true。然后您可以在 LinkBut​​ton 单击事件中检查它。如果该 ViewState 值为 true,则不执行该逻辑。这并不理想,而是一种处理方式。考虑到您的问题,jQuery 附加了一个附加事件,它不会替换现有事件。我会更新代码以反映。
    • 这些想法都不起作用。随机点击事件在完全相同的时间触发两次。代码执行两次。还有其他想法吗?
    • 我可能误解了你原来的问题。请看看我的更新答案是否对您有帮助!
    【解决方案3】:

    如果这是用于表单发布,那么您可以禁用提交时的所有提交按钮:

    $('#someForm').submit(function(){ $('input[type=submit]', this).attr('disabled', 'disabled'); });

    或者他们是否允许点击多次,但仅在经过一段时间后才能点击?

    在某些情况下 one() 失败 - 请参阅 cmets on http://api.jquery.com/one/ 知道您的用户是否存在浏览器兼容性问题或 jQuery 未加载?

    编辑: 刚刚发现这是一个链接按钮。在这种情况下尝试

    $('#yourClientIdForYourLinkButton').click(function(e) { e.preventDefault(); });

    或直接使用 clientid 之类的

    $('#<%=linkButton.ClientId%>').click(function(e) { e.preventDefault(); });

    【讨论】:

    • 它是一个LinkBut​​ton,它是一个超链接。我应该提到这一点。这并不能阻止它。
    • 在这种情况下,您需要附加 onclick 事件 - 请参阅我的编辑
    【解决方案4】:

    这真的取决于你在这里的愿望。一种选择是在单击后禁用锚标记。这应该适用于所有浏览器。

    我看到使用的另一个选项是隐藏有问题的项目,ala http://www.ilovecolors.com.ar/avoid-double-click-jquery/,但这对于您正在尝试的内容可能有点过头了。

    【讨论】:

    • 昨天我将 href 更改为 # 并且不喜欢因此而发生的事情。我可能应该一起删除 href 标签?首选第二次点击时没有任何反应。
    猜你喜欢
    • 2014-10-01
    • 2017-05-31
    • 2014-03-26
    • 2019-02-05
    • 2011-07-08
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多