You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Oracle APEX中按钮点击禁用与异常场景下重新启用的实现问题

Oracle APEX中按钮点击禁用与异常场景下重新启用的实现问题

我太懂你这个困扰了——为了防止低网络环境下用户重复点击按钮造成重复提交,你给按钮加了点击后禁用的逻辑,但碰到PLSQL抛出raise_application_error时,按钮就一直处于禁用状态没法恢复,这确实挺闹心的。我来给你调整下实现方案,确保不管成功还是异常,按钮都能回到可用状态:

第一步:完善按钮点击的动态动作(DA)

先把你现有的点击逻辑补全,确保成功执行后按钮能恢复:

  • 事件:Click
  • 选择类型:按钮
  • 按钮:ADD
  • 第一个True Action:执行JavaScript代码,禁用按钮(把你的两行代码合并成一行更简洁):
    $(this.triggeringElement).prop('disabled', true).addClass('is-disabled');
    
  • 第二个True Action:执行服务器端代码(就是你包含raise_application_error的PLSQL逻辑)
  • 第三个True Action:执行JavaScript代码,服务器端执行成功后恢复按钮
    $(this.triggeringElement).prop('disabled', false).removeClass('is-disabled');
    

第二步:捕获服务器端异常,恢复按钮

之前你用的apexerror自定义事件可能不是APEX内置的标准事件,所以没法可靠触发。换用APEX官方提供的apex:ajax:error事件,它会在所有AJAX请求失败(包括服务器端抛出的应用错误)时触发:

  • 创建一个新的动态动作:
    • 事件:Custom
    • 自定义事件apex:ajax:error
    • 选择类型:JavaScript表达式
    • JavaScript表达式document(全局监听所有AJAX错误)
    • True Action:执行JavaScript代码,恢复目标按钮(如果页面只有这一个禁用按钮,用精确选择器更稳妥):
      $('button#ADD').prop('disabled', false).removeClass('is-disabled');
      // 如果你想恢复所有带is-disabled类的按钮,也可以用你原来的代码:
      // $('button.is-disabled').prop('disabled', false).removeClass('is-disabled');
      

为什么这样能解决问题?

  • 服务器端代码执行成功时,第三步的动作会自动把按钮恢复成可用状态;
  • 当PLSQL抛出raise_application_error时,AJAX请求会失败,apex:ajax:error事件会被触发,对应的动作就会把禁用的按钮恢复回来。

这样不管是成功还是异常场景,按钮都不会一直卡在禁用状态啦!

内容来源于stack exchange

火山引擎 最新活动