如何在Oracle APEX客户端实现页面间项的传递?
实现Oracle APEX页面间无服务器提交的项传递方案
下面是几种无需提交服务器就能在APEX页面间传递项值的可行方案:
1. 利用浏览器本地存储(LocalStorage/SessionStorage)
这是最常用的前端存储方案,完全在客户端完成数据传递,无需和服务器交互。
源页面操作(存值)
在源页面添加动态动作(比如按钮点击时触发),执行以下JavaScript代码:
// 存储到SessionStorage(会话级,关闭标签页即清除) sessionStorage.setItem('transfer_item_value', $v('P1_SOURCE_ITEM')); // 或者存储到LocalStorage(持久化,关闭浏览器仍保留) // localStorage.setItem('transfer_item_value', $v('P1_SOURCE_ITEM'));
目标页面操作(取值)
在目标页面的"页面加载"动态动作中执行以下JavaScript代码:
var transferredValue = sessionStorage.getItem('transfer_item_value'); // 或者用localStorage.getItem('transfer_item_value'); if (transferredValue) { // 将值赋值给目标页面项 $s('P2_TARGET_ITEM', transferredValue); // 可选:取出后删除存储的值,避免重复读取 sessionStorage.removeItem('transfer_item_value'); }
2. 前端拼接URL参数传递
通过JavaScript手动拼接跳转URL,将页面项值作为参数附加到地址栏,目标页面解析参数后赋值给对应项。
源页面操作(跳转并传参)
给跳转按钮添加动态动作,执行以下JavaScript代码:
var itemValue = encodeURIComponent($v('P1_SOURCE_ITEM')); // 拼接目标页面URL,替换APP_ID和目标页面编号 window.location.href = 'f?p=&APP_ID.:2:&SESSION.::NO:::' + 'P2_TARGET_ITEM:' + itemValue;
注意:
encodeURIComponent用于处理特殊字符,避免URL解析错误。
目标页面操作(解析参数)
在目标页面的"页面加载"动态动作中执行以下JavaScript代码:
var urlParams = new URLSearchParams(window.location.search); var itemValue = urlParams.get('p2_target_item'); // 参数名需小写 if (itemValue) { $s('P2_TARGET_ITEM', decodeURIComponent(itemValue)); }
3. 使用Oracle APEX内置客户端存储API
APEX提供了封装好的客户端存储方法,适配APEX环境,能避免和其他本地存储键冲突。
源页面操作(存值)
执行以下JavaScript代码:
// 存储到会话级客户端存储 apex.storage.session.set('transfer_key', $v('P1_SOURCE_ITEM')); // 或者存储到持久化客户端存储 // apex.storage.local.set('transfer_key', $v('P1_SOURCE_ITEM'));
目标页面操作(取值)
执行以下JavaScript代码:
var transferredValue = apex.storage.session.get('transfer_key'); if (transferredValue) { $s('P2_TARGET_ITEM', transferredValue); // 可选:清除存储的键 apex.storage.session.remove('transfer_key'); }
方案选择建议
- 敏感数据优先用SessionStorage或APEX会话存储,避免URL暴露或持久化泄露
- 非敏感、需要跨会话保留的数据用LocalStorage
- 简单场景且不介意参数暴露的用URL参数方案
内容的提问来源于stack exchange,提问作者Merta
相关产品推荐
相关产品推荐

