以下是我所拥有的:按页面按url参数填写表单的Xpages页面。这可能需要10秒才能渲染,我想让用户知道表单正在做某事。
Fredrik Norling做了一个很棒的待机对话框,当我在按钮上使用它时它的功能很棒(保存) http://openntf.org/XSnippets.nsf/snippet.xsp?id=standby-dialog-custom-control (我在保存时对表单上的ID使用部分更新)
如何从电子邮件中的链接执行此脚本块? 有像beforepageload,afturpageload或我应该使用beforeRenderResponse的选项 如果是这样我该怎么做。
答案 0 :(得分:3)
在做了一些实验之后,看起来你很难完成你想做的事情。您上面引用的事件都是服务器端事件,因此无法与用户端进行通信。 view.postScript也不适用于此。
问题是(我假设)你的所有逻辑都是在页面加载之前完成的。因此,我认为实现这一目标的唯一方法是延迟逻辑处理,直到通过部分刷新加载页面为止。
您可以通过将所有逻辑移动到自定义控件,将该自定义控件添加到面板,然后在XPage的onClientLoad事件中执行此操作,对面板进行部分刷新,这将触发待机功能自动。
我嘲笑了我所说的一个例子:
Xpage code
<xp:this.beforePageLoad><![CDATA[#{javascript:viewScope.showLogic = false}]]></xp:this.beforePageLoad>
<xp:panel id="panelLogic">
<xc:logic id="logic"
rendered="#{javascript:viewScope.showLogic == true;}">
</xc:logic>
</xp:panel>
<xp:br></xp:br>
<xp:br></xp:br>
<xc:standby></xc:standby>
<xp:eventHandler event="onClientLoad" submit="true"
refreshMode="partial" refreshId="panelLogic">
<xp:this.action><![CDATA[#{javascript:viewScope.showLogic = true;}]]></xp:this.action>
</xp:eventHandler>
</xp:view>
上面代码的关键部分是在页面加载时将viewScope变量设置为“false”,然后在部分刷新之前将其设置为“true”。将其设置为true将取消隐藏逻辑自定义控件并允许其正常处理。
逻辑自定义控件
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:text escape="true" id="computedField1">
<xp:this.value><![CDATA[#{javascript:for (x=0;x<100000000;x++) {
}}]]></xp:this.value>
</xp:text>
</xp:view>
我怀疑可能有更好的方法来做到这一点,但这种方法效果很好。
答案 1 :(得分:1)
我会将XPage加载为空,并在页面的onload事件中单击一个隐藏按钮。 此按钮将执行一些服务器端SSJS,它将显示您要显示的控件。然后Standby小部件将处理其余部分。用户将获得等待对话框。
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xc="http://www.ibm.com/xsp/custom">
<xp:button value="Clickme" id="LoadWait"
style="visibility:hidden;display:none">
<xp:eventHandler event="onclick" submit="true"
refreshMode="partial" refreshId="MainContent">
<xp:this.action><![CDATA[#{javascript:viewScope.HideOnLoad=true}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:div id="MainContent">
<xp:div>
<xp:this.rendered><![CDATA[#{javascript:if(!viewScope.HideOnLoad){
return false
}else{
return true
}}]]></xp:this.rendered>
<xp:div>
<xp:table>
<xp:tr>
<xp:td>
<xp:label id="label1">
<xp:this.value><![CDATA[#{javascript:var startTime = new Date().getTime();
var elapsedTime = 0;
var timeOutSeconds = 20;
while ( elapsedTime < timeOutSeconds) {
java.lang.Thread.currentThread().sleep(1000);
//re-check condition here
elapsedTime = (new Date().getTime() - startTime) / 1024;
}
return "Name1"}]]></xp:this.value></xp:label></xp:td>
<xp:td>
<xp:inputText id="inputText1"
value="#{viewScope.Name}">
<xp:this.defaultValue><![CDATA[#{javascript:"test"}]]></xp:this.defaultValue></xp:inputText></xp:td>
</xp:tr>
<xp:tr>
<xp:td>
<xp:label value="Company" id="label2"></xp:label></xp:td>
<xp:td>
<xp:inputText id="inputText2"
value="#{viewScope.Company}">
</xp:inputText></xp:td>
</xp:tr>
</xp:table></xp:div>
</xp:div>
</xp:div>
<xc:standby></xc:standby>
<xp:eventHandler event="onClientLoad" submit="false">
<xp:this.script><![CDATA[//increase timeout value for long running XPage requests
dojo.onLoad(function(){XSP.submitLatency = 600 * 1000; var id =“#{id:LoadWait}”; document.getElementById(id).click()}]]&gt;
要使代码正常工作,您需要将standby widget code添加到名为“待机”的自定义控件中
答案 2 :(得分:0)
这不是最佳做法,但您可以创建一个XPage(XParent),它只包含一个活动的备用小部件(或任何加载指示符)和一个iframe,它实际上要向用户显示XPage(XChild)。 XParent需要一个名为hideStandby()
的JavaScript函数,它允许隐藏备用小部件。然后,您只需将parent.hideStandby()
添加到XChild的onClientLoad事件中。使用此设置,当用户访问XParent时,备用窗口小部件立即可见,并且XChild将加载到iframe内的后台。加载完成后,XParent中的备用窗口小部件将在XChild中隐藏。如果跨越整个页面上的iframe(css = position:fixed; width:100%; height:100%; border:none; ...),用户将不知道实际上涉及2个不同的页面。 / p>