xpages - 部分刷新 - 根据输入的字符数隐藏按钮
xpages - partial refresh - hide button based upon number of characters entered
在我的 xpages 应用程序中,我想根据在字段 (xp:inputText) 中输入的字符数量来控制提交按钮的可见性(或禁用 [=18=])。
我已经实现了部分刷新的 xsnippet https://openntf.org/XSnippets.nsf/snippet.xsp?id=standby-dialog-custom-control 但是如果我计算输入文本控件中的值的长度,刷新对话框出现每个键事件。
我怎样才能避免这种情况?我可以暂时避免出现待机对话框还是应该在客户端使用 javascript?
这可以通过客户端脚本来完成。无需一直提交数据
XSP.getElementById('id').hidden=true;
如果您确实需要使用客户端-服务器往返计算每个键事件的输入文本控件中值的长度(例如,如果您要确保没有人会破解您的客户端 JS),并且假设您使用上述 XSnippet 并且不希望在每次按键时都出现待机对话框,这里您通常需要做的是:
当你做XSP.partialRefreshPost
时,你可以传递options
对象作为最后一个函数参数。只需向该对象再添加一个 属性(如果您已经将内容放入其中)或使用单个 属性 创建新对象,它必须类似于
XSP.partialRefreshPost('#{id:yourId}', {dontShowDialog: true})
- 这个
options
对象一直传递到第 39 行,partialrefresh-start
事件在此处发布并将该对象公开为最后一个元素
第 137 行订阅了此事件。在它声明的函数中多加一个参数,比如
dojo.subscribe('partialrefresh-start', null, function(method, form, refreshId, options)
现在您可以在函数体
中读取您的options
有点包装下两行,根据您的 options
参数使用条件语句创建对话框。整个事情看起来像这样:
dojo.subscribe('partialrefresh-start', null, function(method, form, refreshId, options) {
if (options) {
if (options.dontShowDialog) return;
}
StandbyDialog_Do = true;
StandbyDialog_Started();
});
以上所有内容都是针对使用客户端事件处理程序的情况(submit
属性 设置为 false
的情况。如果使用服务器端处理程序,事情变得有点复杂,因为你不能将任何额外的自定义属性传递给最终调用的 _partialRefresh
方法。但是,我可以想到一种方法来处理这个问题:
- 在调用
_partialRefresh
方法之前,CSJS引擎会做一些准备工作,其中之一就是为页面上的一些隐藏输入字段设置特定的值。这里我们对 $$xspsubmitid
字段感兴趣,该字段被赋予您声明的事件处理程序客户端 ID 的值。然后你可以在你的劫持者 XSnippet 中读取 $$xxpsubmitid
字段的值,如果它包含你的事件处理程序的 ID - 不要显示待机对话框。这种方式不太灵活,但应该可行
P.S。我自己还没有尝试过上面写的所有内容,但如果你尝试失败了,我很乐意调查并修复。
在我的 xpages 应用程序中,我想根据在字段 (xp:inputText) 中输入的字符数量来控制提交按钮的可见性(或禁用 [=18=])。
我已经实现了部分刷新的 xsnippet https://openntf.org/XSnippets.nsf/snippet.xsp?id=standby-dialog-custom-control 但是如果我计算输入文本控件中的值的长度,刷新对话框出现每个键事件。
我怎样才能避免这种情况?我可以暂时避免出现待机对话框还是应该在客户端使用 javascript?
这可以通过客户端脚本来完成。无需一直提交数据
XSP.getElementById('id').hidden=true;
如果您确实需要使用客户端-服务器往返计算每个键事件的输入文本控件中值的长度(例如,如果您要确保没有人会破解您的客户端 JS),并且假设您使用上述 XSnippet 并且不希望在每次按键时都出现待机对话框,这里您通常需要做的是:
当你做
XSP.partialRefreshPost
时,你可以传递options
对象作为最后一个函数参数。只需向该对象再添加一个 属性(如果您已经将内容放入其中)或使用单个 属性 创建新对象,它必须类似于XSP.partialRefreshPost('#{id:yourId}', {dontShowDialog: true})
- 这个
options
对象一直传递到第 39 行,partialrefresh-start
事件在此处发布并将该对象公开为最后一个元素 第 137 行订阅了此事件。在它声明的函数中多加一个参数,比如
dojo.subscribe('partialrefresh-start', null, function(method, form, refreshId, options)
现在您可以在函数体
中读取您的有点包装下两行,根据您的
options
参数使用条件语句创建对话框。整个事情看起来像这样:dojo.subscribe('partialrefresh-start', null, function(method, form, refreshId, options) { if (options) { if (options.dontShowDialog) return; } StandbyDialog_Do = true; StandbyDialog_Started(); });
options
以上所有内容都是针对使用客户端事件处理程序的情况(submit
属性 设置为 false
的情况。如果使用服务器端处理程序,事情变得有点复杂,因为你不能将任何额外的自定义属性传递给最终调用的 _partialRefresh
方法。但是,我可以想到一种方法来处理这个问题:
- 在调用
_partialRefresh
方法之前,CSJS引擎会做一些准备工作,其中之一就是为页面上的一些隐藏输入字段设置特定的值。这里我们对$$xspsubmitid
字段感兴趣,该字段被赋予您声明的事件处理程序客户端 ID 的值。然后你可以在你的劫持者 XSnippet 中读取$$xxpsubmitid
字段的值,如果它包含你的事件处理程序的 ID - 不要显示待机对话框。这种方式不太灵活,但应该可行
P.S。我自己还没有尝试过上面写的所有内容,但如果你尝试失败了,我很乐意调查并修复。