Xpages onClick 执行顺序
Xpages onClick execution sequence
我想创建一个按特定顺序执行不同 actions/scripts 的按钮。
首先,我想保存当前文档(服务器端操作)。保存文档后,执行部分刷新。然后应该执行客户端脚本。完成此脚本后,将打开一个新页面。
我当前的按钮:
<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>
所以我会点击执行 1 => 执行 2 => 执行 3
运算顺序为:
- 运行 客户端 (JavaScript) 代码在浏览器上的操作中定义
- 将页面提交到服务器
- JSF 生命周期开始,处理浏览器内容后,服务器端代码 运行s
- 重新计算 XPage
- HTML传回浏览器渲染
在按钮的标签中添加 JavaScript 不会实现您需要的,因为它做不到。
您正在寻找的是在其他所有事情发生后将 JavaScript 传回页面成为 运行。这就是 view.postScript(String)
将为您做的事情 - 在 (post) HTML 返回到浏览器之后,它实际上是 post 到 运行 的脚本。因为这个来自 view
对象的 运行s,这是服务器端代码,并传递一个将被浏览器解析为 JavaScript.
的字符串
除了 view.postScript,正如 Paul 所建议的,您可以将客户端 JavaScript 添加到事件的 onComplete。这将在活动结束后 运行。我不确定 view.postScript 与 onComplete 在幕后是否存在很大差异。
您可以创建一个隐藏按钮 (style="display: none;") 运行作为第二个服务器端代码。并在第一个服务器事件完成后触发点击事件。
我想创建一个按特定顺序执行不同 actions/scripts 的按钮。 首先,我想保存当前文档(服务器端操作)。保存文档后,执行部分刷新。然后应该执行客户端脚本。完成此脚本后,将打开一个新页面。
我当前的按钮:
<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>
所以我会点击执行 1 => 执行 2 => 执行 3
运算顺序为:
- 运行 客户端 (JavaScript) 代码在浏览器上的操作中定义
- 将页面提交到服务器
- JSF 生命周期开始,处理浏览器内容后,服务器端代码 运行s
- 重新计算 XPage
- HTML传回浏览器渲染
在按钮的标签中添加 JavaScript 不会实现您需要的,因为它做不到。
您正在寻找的是在其他所有事情发生后将 JavaScript 传回页面成为 运行。这就是 view.postScript(String)
将为您做的事情 - 在 (post) HTML 返回到浏览器之后,它实际上是 post 到 运行 的脚本。因为这个来自 view
对象的 运行s,这是服务器端代码,并传递一个将被浏览器解析为 JavaScript.
除了 view.postScript,正如 Paul 所建议的,您可以将客户端 JavaScript 添加到事件的 onComplete。这将在活动结束后 运行。我不确定 view.postScript 与 onComplete 在幕后是否存在很大差异。
您可以创建一个隐藏按钮 (style="display: none;") 运行作为第二个服务器端代码。并在第一个服务器事件完成后触发点击事件。