在Oracle APEX中提交后执行JavaScript函数

问题描述 投票:0回答:1

有人对我执行函数的顺序有建议吗?

在 Oracle APEX 中,我向标有“导出”的按钮添加了代码,以捕获交互式网格中每个选定行的 ROWID,然后将这些值传递到页面项。目标是执行需要提交的流程。此外,我还创建了一个名为

downloadFile()
的 JavaScript 函数,用于生成文件下载。现在的挑战是确保
downloadFile()
函数仅在提交后执行。但是,我希望只保留一个按钮,单击该按钮时,会将值传递给页面项,提交页面,然后执行
downloadFile()
函数。

我尝试在页面的 JavaScript 部分(函数和全局变量声明)中将该函数声明为全局函数,并在按钮中提交后调用该函数。但是,这会产生一个空白文件,因为它全部一起运行,并且值是在文件生成后在页面项中设置的。我还尝试将提交添加到

APEX$ROW_SELECTOR
列的单击事件中,但它一次仅适用于一行,因为每次提交后都会清除选择。

我已经设法让它通过两个按钮工作。单击第一个按钮捕获网格中所选行的 ROWID,应用提交,然后单击第二个按钮执行

downloadFile()
函数,生成文件。但是,我不想为此有两个按钮。

如何确保

downloadFile()
函数仅在提交后执行,同时保持此操作仅一个按钮?

javascript oracle plsql oracle-apex
1个回答
1
投票

由于以下原因,您想到的想法无法实现。在 APEX 中,页面的生命周期分为 3 个阶段。

  • 第一阶段:显示页面。在此阶段,渲染是根据数据库中存储的元数据完成的。所有(渲染之前)页面进程/计算/分支都会被执行,并且 DOM 也会被渲染。完成此过程后,页面就可以在浏览器中使用了。
  • 阶段2:页面渲染时。 DOM 已呈现并可供使用。可以进行用户交互并且可以在页面上执行javascript。 这是唯一可以执行客户端 JavaScript 的阶段。
  • 第 3 阶段:接受页面。这是页面提交后发生的情况。然后执行任何提交后流程(验证/计算/页面处理/分支)。

这 3 个阶段始终按该顺序发生并且不能重叠。

Javascript 只能在第 2 阶段执行。一旦第 3 阶段开始,服务器就开始执行其业务,并且 DOM 不再可访问。您正在考虑的解决方案需要 javascript(仅可能在第 2 阶段)在第 3 阶段发生某些事情之后发生。

一种可能的解决方法是在提交时设置页面项或请求值,然后在满足某些条件时在页面加载时执行 JavaScript 函数。这可以通过具有服务器端条件的页面初始化动态操作来完成。

© www.soinside.com 2019 - 2024. All rights reserved.