【问题标题】:Coldfusion - How to prevent multiple clicks?Coldfusion - 如何防止多次点击?
【发布时间】:2015-06-23 09:08:03
【问题描述】:

我有一个按钮(锚标记),如果你按下它就会发送确认消息。 问题是,例如,如果您快速按 5 次,它将发送 5 条确认消息,如果您按 2 次,它将发送 2 条消息。

当用户连接速度较慢并且在刷新页面时再次按下按钮时,可能会发生这种情况。

我该如何处理这种情况?我想禁用该按钮,但由于其他原因,这是不可能的。

<a class="msg" href="/manage/conversations.cfm?destination=#destination#">
        #ucase(request.l('Send'))#
</a>

感谢您的宝贵时间

【问题讨论】:

  • 您谈论一个按钮并显示一个锚标记。请解决不一致问题。
  • @DanBracuk 在这里 :)
  • 为什么这被标记为 ColdFusion?这是客户端问题。
  • @DanBracuk 你确实意识到使用 CSS 锚标签看起来就像一个按钮,对吧?
  • 看第二个答案,可能有帮助:stackoverflow.com/questions/4699352/…

标签: coldfusion timeout coldfusion-9 coldfusion-10 cfml


【解决方案1】:

最终,您需要在服务器上放置代码,以防止多次处理来自同一用户的链接。

但是,要解决 UI 问题,是否直接链接调用函数而不是 cf 文件。

<a class="msg" href="javascript: processLink(#destination#);">
        #ucase(request.l('Send'))#
</a>

<script>
runCount = 0;

function processLink(destination){
runCount++;

if (runCount == 1){
 window.location.href = "/manage/conversations.cfm?destination=" + destination;
}

}
</script>

【讨论】:

  • 是的,但不要将runCount 设为函数局部变量,否则该值将始终为“1”。
  • @Leigh 很好。我更新了代码以反映您的评论。
【解决方案2】:

正如前面的回答中提到的,有一些客户端 javascript 来阻止触发快乐用户的重复提交是很好的,但是你也应该在服务器端进行检查。

一种方法是创建一个带有 GUID 的隐藏表单域,当 Coldfusion 呈现您的表单时,coldfusion 会生成该 GUID。

比如:

<cfset GUID = createUUID()>

<cfoutput>
<form id="frm" action="/target.cfm" method="post">
<input type="hidden" name="guid" value="#GUID#">
<!-- all your formfields go here -->
<input type="submit">
</form>
</cfoutput>

然后,在服务器端,目标页面会检查它之前是否已经收到了 GUID。有很多方法可以做,这里有两种方法。

a) 使用会话范围。

如果您不是在集群环境中运行并且只需要一些快速的小型应用程序,这可能是最快的方法。

<cfif isDefined("session.MYPAGE_GUID") AND session.MYPAGE_GUID EQ form.guid>
<cfoutput>Duplicate Form Submission</cfoutput>
<cfabort>
<cfelse>
<cfset session.MYPAGE_GUID = form.guid>
<!-- Do Business Logic Here -->
</cfif>

b) 使用数据库表。 创建一个包含名为 GUID 的列的数据库表。确保 GUID 是主键或具有唯一约束。

在运行业务逻辑之前,将 form.GUID 插入到数据库表中。如果您可以执行您的业务逻辑的插入过程,否则数据库查询将抛出记录存在的错误。然后,您可以捕获此错误并针对重复提交采取适当的措施。

我更喜欢数据库选项,因为它可以跨集群环境工作,并且数据库服务器可以可靠地防止竞争条件,以确保 GUID 只设置一次。

请注意,这只是演示基本概念,并不是简单的解决方案。要将这些概念融入电子商务解决方案还有很多工作要做。

【讨论】:

    【解决方案3】:

    最好的方法是在链接被选中后禁用它。如果您不想这样做,另一种方法是像这样构建 conversations.cfm。

    <div id="pageContent">
    small amount of text
    </div>
    <cfflush>
    </body>
    </html>
    
    <cfsavecontent variable = "actualPageContent">
    code
    </cfsavecontent>
    
    <cfoutput>
    <script>
    var #toScript(actualPageContent, "newPageContent")#; 
    document.getElementById("pageContent").innerHTML = "newPageContent";
    </script>
    </cfoutput>
    

    【讨论】:

    • 这是解决简单 UI 问题的最复杂的方法。
    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 2014-11-29
    • 2014-11-13
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多