Xpages on单击执行顺序



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

我的当前按钮:

<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> 

当前,此按钮首先执行所有服务器端事件,然后执行客户端脚本。有没有办法安排执行的顺序,让我可以执行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>

点击execute1 =>执行2 =>执行3

操作顺序为:

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

在按钮的标签中添加JavaScript并不能达到你想要的效果,因为它不能。

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

除了视图。postScript,正如Paul建议的那样,您可以为事件添加客户端JavaScript到onComplete。这将在事件完成后运行。我不确定在幕后是否有很大的不同。postScript vs onComplete.

您可以创建一个隐藏按钮(style="display: none;")来运行第二个服务器端代码。并在第一个服务器事件完成后触发click事件。

最新更新