Xpages onClick 执行顺序

luc*_*cas 0 lotus-notes xpages hcl

我想创建一个按特定顺序执行不同操作/脚本的按钮。首先,我想保存当前文档(服务器端操作)。保存文档后,将执行部分刷新。然后应该执行客户端脚本。完成此脚本后,将打开一个新页面。

我当前的按钮:

<xp:button id="saveButton" value="Save">
    <xp:this.rendered><![CDATA[#{javascript:if(document1.isEditable()){
           return true;
          }
          else{ 
           return false
          }
    }]]></xp:this.rendered>
                    <xp:eventHandler event="onclick" submit="true"
                        refreshMode="partial" immediate="false" save="true" refreshId="saveButton">

                        <xp:this.action>

                            <xp:actionGroup>
                                <xp:saveDocument var="document1"></xp:saveDocument>

                                <xp:openPage name="/viewer.xsp"
                                    target="openDocument">
                                </xp:openPage>
                            </xp:actionGroup>
                        </xp:this.action>



                        <xp:this.script>
                            <xp:executeClientScript>
                                <xp:this.script><![CDATA[
                                    someScript();
                                ]]></xp:this.script>
                            </xp:executeClientScript>
                        </xp:this.script>
                    </xp:eventHandler>
                </xp:button> 
Run Code Online (Sandbox Code Playgroud)

当前,此按钮首先执行所有服务器端事件,然后执行客户端脚本。有没有办法安排执行顺序,让我可以执行server->client->server?

编辑:

我想要的功能分为三个按钮:

<xp:button value="Label" id="execute1">
    <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="execute2">
        <xp:this.action>
            <xp:saveDocument var="document1"></xp:saveDocument>
</xp:this.action></xp:eventHandler></xp:button>


<xp:button value="Label" id="execute2"><xp:eventHandler event="onclick" submit="false">
    <xp:this.script>
        <xp:executeClientScript>
            <xp:this.script><![CDATA[
            someScript();
        }});]]></xp:this.script>
        </xp:executeClientScript>
</xp:this.script></xp:eventHandler></xp:button>


<xp:button value="Label" id="execute3"><xp:eventHandler event="onclick" submit="true" refreshMode="complete">
    <xp:this.action>
        <xp:openPage name="/viewer.xsp" target="openDocument"></xp:openPage>
</xp:this.action></xp:eventHandler></xp:button>
Run Code Online (Sandbox Code Playgroud)

所以我会点击execute1 => execute 2 => execute 3

Pau*_*ers 6

操作顺序为:

  • 在浏览器上运行操作中定义的客户端 (JavaScript) 代码
  • 将页面提交到服务器
  • JSF 生命周期开始,在处理浏览器内容后,服务器端代码运行
  • XPage 重新计算
  • HTML 被传递回浏览器进行渲染

将 JavaScript 添加到按钮的标记中不会实现您的需要,因为它不能。

您正在寻找的是在其他所有事情发生后将 JavaScript 传递回要运行的页面。这就是view.postScript(String)为您做的事情 - 它实际上是发布脚本以在(发布)HTML 返回到浏览器之后运行。因为它从view对象运行,所以这是服务器端代码,并传递一个字符串,该字符串将被浏览器解析为 JavaScript。