Javascript .集中注意力,不要呆在原地

Javascript .集中注意力,不要呆在原地,javascript,dojo,xpages,Javascript,Dojo,Xpages,我在SSJS脚本库中保留了一个验证例程。当我按下保存按钮时,它会被调用。其目的(如本文中的几篇文章所示)是执行表单验证,创建错误消息,然后onClientLoad事件将显示该消息并将焦点返回到它找到的第一个问题字段 下面是代码片段;从SSJS脚本库: 函数DBValidate(FormName:String){ var efn:string=null;//错误字段名 var errorMessages:String=null; //在这里,我们通过调用表单对验证进行分组。 开关(FormNam

我在SSJS脚本库中保留了一个验证例程。当我按下保存按钮时,它会被调用。其目的(如本文中的几篇文章所示)是执行表单验证,创建错误消息,然后onClientLoad事件将显示该消息并将焦点返回到它找到的第一个问题字段

下面是代码片段;从SSJS脚本库:

函数DBValidate(FormName:String){
var efn:string=null;//错误字段名
var errorMessages:String=null;
//在这里,我们通过调用表单对验证进行分组。
开关(FormName){
案例“FieldDef”:
if(isEmpty(currentDocument.getItemValue(“FormName”)[0])setError(“FormName”,“表单名称不能为空”);
if(isEmpty(currentDocument.getItemValue(“EnglishFormName”)[0])setError(“EnglishFormName”,“英文表单名称不能为空”);
打破
违约:
}
//我们构建了错误消息(所有消息都将显示在OnClient Load事件的promptbox中)
//表单必须有一个ErrorMessage字段,因为我们嵌入了回车
//在消息和viewScope.get中,我们不太喜欢这些…但是我们可以通过
//viewScope变量中的错误字段(如果我得到该字段,则用于焦点…)。
getComponent(“ErrorMessage”).setValue(errorMessages);
viewScope.put(“错误字段”,efn);
如果(errorMessages==null){
返回true;
}否则{
返回false;
}
}
函数设置错误(fName:string,emsg:string){
//DBValidate中的字段验证失败后,我们
//记下字段名并生成错误消息
//我们将在onClientLoad事件中显示。
//记下第一个失败的字段ID,以便
//把焦点对准它。
如果(efn==null)efn=getClientId(fName);
如果(errorMessages==null){
errorMessages=String.fromCharCode(10)+emsg;
}否则{
errorMessages+=String.fromCharCode(10)+emsg;
}
返回
}

0) { 
警报(em);
var efn='#{javascript:viewScope.get(“errorField”)}';
var ef=dojo.byId(efn);
ef.focus();
}
]]>

我也遇到过类似的问题,一些“幕后道场魔术”正在上演,因此转移了焦点

我绕过它的方式是一个小“黑客”,我使用客户端超时功能延迟设置焦点100-200毫秒

不理想,但我放弃了直接让它工作;-)


/John

请在
ef.focus()
行之后添加
return false
。这将立即停止执行任何服务器端代码。

如果您有两个或更多错误,它是否尝试循环执行所有错误?(甚至非常快)它循环执行所有错误,并将错误消息存储在errorMessages字段中。在setError例程中,我获取第一个字段的id,在该字段中,我们在“efn”字段中遇到了错误,我通过获取viewScope变量在onClientLoad事件中获取了该字段。调试器显示我正在返回正确的字段并且focus命令正在工作,我看到垂直的黑色光标线瞬间出现在该字段中,但随后它消失了。onClientLoad事件之后发生了一些事情只是为了好玩,尝试在if语句之后添加一行“return false”您的代码是在onClientLoad的“Client”还是onClientLoad的“Server”中?它看起来在服务器端,但XSP.getElementByID是客户端。我从未尝试过,但我认为XSP类和方法在SSJS中不起作用。您是否打算将其添加到客户端,并意外地添加到服务器端,这很容易做到??我将代码替换为;setTimeout(函数(){ef.focus()},300)。我不认为是这样。在以前的尝试中,我硬编码了字段名,而不是使用dojo函数。同样的结果。嗯。。。好啊那只是一次快速的尝试;-)