1

我在触发 onChange 事件的 inputText 字段上启用了预输入。除非页面有一段时间没有刷新(在测试中,它会在 1 小时后停止工作,但可能会更少),否则这工作正常。刷新页面完全解决了这个问题。

inputText 字段的代码如下;

<xp:inputText id="quickSelectEntry" style="width:170px;">
    <xp:this.dojoAttributes>
        <xp:dojoAttribute name="placeHolder" value="Enter name">
        </xp:dojoAttribute>
    </xp:this.dojoAttributes>
    <xp:typeAhead mode="none" minChars="2" ignoreCase="true"
        var="searchValue" valueMarkup="true">
        <xp:this.valueList><![CDATA[#{javascript:return         nameTypeAhead(searchValue)}]]></xp:this.valueList>
                </xp:typeAhead>

                <xp:eventHandler event="onchange" submit="true"
                    refreshMode="norefresh">
                    <xp:this.action>
                        <xp:actionGroup>
                            <xp:executeScript>
                                <xp:this.script><![CDATA[#{javascript:var searchVal:string = getComponent("quickSelectEntry").getValue();
if (searchVal.substr(0,1).equals("?")) {
    context.redirectToPage("xCheckSecurityGroup.xsp?group=" + searchVal.substr(1));
    return false;
} else {
    var doc:NotesDocument = quickLookupView.getDocumentByKey(searchVal, true);
    if (null != doc) {
        viewScope.lookupKey = doc.getUniversalID();
        viewScope.lookupForm = doc.getItemValueString("form");
        return true;
    } else {
        viewScope.lookupKey = ""
        viewScope.lookupForm = ""
        return false;
    }
}
]]></xp:this.script>
                            </xp:executeScript>
                            <xp:actionGroup>
                                <xp:this.condition><![CDATA[#{javascript:viewScope.lookupKey != ""}]]></xp:this.condition>

                                <xp:openPage target="openDocument"
                                    documentId="#{javascript:return viewScope.lookupKey}">
                                    <xp:this.name><![CDATA[#{javascript:return "x" + viewScope.lookupForm + ".xsp" }]]></xp:this.name>
                                </xp:openPage>
                            </xp:actionGroup>
        </xp:actionGroup>
    </xp:this.action>
</xp:eventHandler>

到目前为止,我已经尝试对包含面板进行定时部分刷新,但没有任何乐趣,我已经将 typeahead 模式从 none 设置为 full。没有不同。

除了每 10 分钟刷新一次页面之外,还有什么其他原因导致了这个问题。仅供参考,实际的预输入始终如一地正常工作,它只是停止触发的 onchange 事件。

4

4 回答 4

2

似乎发生的情况是服务器 Web 会话完好无损,但 XPages 会话丢失了。

将以下内容添加到 XPage 的底部,它将根据您的设置(以毫秒为单位)定期刷新 DIV(300000 = 300 秒 = 5 分钟)——我成功测试的最长时间是 3.5 小时。

您需要设置一个至少比数据库应用程序属性中设置的会话超时长度短一分钟的值。

<xp:div id="keepSessionAlive"></xp:div>
<xp:scriptBlock id="scriptBlock1">
    <xp:this.value>
    <![CDATA[   
        XSP.addOnLoad(function(){
            setInterval(function(){
                XSP.partialRefreshPost("#{id:keepSessionAlive}", {});   
            }, 300000)
        })]]>
    </xp:this.value>
</xp:scriptBlock>

不要设置较短的刷新时间,因为这会不必要地浪费带宽,还会使浏览器无法很好地管理的 IE 的 RAM 使用量膨胀。

同时了解这是一个安全问题 - 通过基本上保持空闲计算机的会话处于活动状态,您可以在用户不知情的情况下让它处于劫持状态 - 这是超时的一部分

于 2012-09-13T20:14:47.140 回答
1

问题是 XSP 会话超时(根据您的服务器设置)。有关保持会话活动的建议,请参阅此答案: 如何在部分刷新不起作用时自动刷新页面?

于 2012-09-13T06:40:05.667 回答
1

我也见过这个。我最终放置了一个元刷新标签,每 30 分钟重新加载一次页面。这是唯一似乎有效的方法。

霍华德

于 2012-09-13T13:17:21.030 回答
0

可能要检查应用程序属性(转到 Xpages 选项卡)。在那里您可以设置数据库的应用程序和会话超时。如果这些是空白的,我认为它们将默认为通常为 30 分钟的服务器。

视听/视听,

凯夫

于 2012-09-13T21:53:40.813 回答