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




