在APEX 3.2中,我希望能够运行JavaScript验证来检查输入的数据,并在表格形式的每一行上方显示相应的消息。
我不确定这是如何工作的,因为它是一个表格形式,用户可以添加/删除行。
欣赏任何想法或建议。
感谢。
答案 0 :(得分:1)
好的,在表格表单上进行一些javascript验证有点复杂,你需要知道自己在做什么。
首先,您需要知道要检查的元素的ID或名称。您可能知道,表格形式的元素在提交时存储在顶点的数组中,并通过apex_application.g_f01/g_f02/...
访问
这反映在html代码中,生成的元素也将属性“name”设置为它们所属的列。 id还包含列,以及rowindex。但是请注意,只有在“隐式”创建项目时才会生成此ID,即您没有使用apex_item调用(apex_item.textbox(...)
)编写查询。
另一个但是只有保存状态的字段才会定义数组列。您只显示为“仅显示”的项目不会使用输入标记生成,只会作为文本保存在td标记中。
总而言之,当您知道这一点时,接下来的步骤应该足够简单。查看页面源代码,并记下您希望定位的元素。例如,我去了工作领域。
<tr class="highlight-row">
<td headers="CHECK$01" class="data"><label for="f01_0003" class="hideMeButHearMe">Select Row</label><input type="checkbox" name="f01" value="3" class="row-selector" id="f01_0003" /></td>
<td headers="EMPNO_DISPLAY" class="data">7782</td>
<td headers="ENAME" class="data"><label for="f03_0003" class="hideMeButHearMe">Ename</label><input type="text" name="f03" size="12" maxlength="2000" value="CLARK" id="f03_0003" /></td>
<td headers="JOB" class="data"><label for="f04_0003" class="hideMeButHearMe">Job</label><input type="text" name="f04" size="12" maxlength="2000" value="MANAGER" id="f04_0003" /></td>
<td headers="HIREDATE" class="data"><label for="f05_0003" class="hideMeButHearMe">Hiredate</label><span style="white-space: nowrap;"><input type="text" id="f05_0003" name="f05" maxlength="2000" size="12" value="09-JUN-81" autocomplete="off"></span></td>
<td headers="SAL" class="data">
<label for="f06_0003" class="hideMeButHearMe">Sal</label><input type="text" name="f06" size="16" maxlength="2000" value="2450" id="f06_0003" />
<input type="hidden" name="f02" value="7782" id="f02_0003" />
<input type="hidden" id="fcs_0003" name="fcs" value="19BD045E01D6BA148B4DEF9DDC8B21B7">
<input type="hidden" id="frowid_0003" name="frowid" value="AAuDjIABFAAAACTAAC" />
<input type="hidden" id="fcud_0003" name="fcud" value="U" />
</td>
</tr>
在页面的javascript部分,我添加了以下2个功能。
validate_job只对一个字段进行验证,即元素elJob。我使用的验证是非常基础的,由您来确定您想要它的复杂程度。
如果你想在这里引用同一行中的其他字段,你可以做几件事:如果有的话,从id中提取rowindex。如果它不包含它,则获取父TR,然后使用.children("input[name='f##'")
在同一行中获取输入元素。或者如果您需要一个根本不保存状态的项的值,您需要获取TR元素,然后通过headers属性找到包含所需元素的TD,该属性包含列名。 / p>
function validate_job(elJob){
var sJob = $v(elJob).toUpperCase();
$(elJob).val(sJob);
//do your validations for the field job here
if(sJob=="MANAGER"){
$(elJob).css({"border-color":"red"});
alert("invalid value!");
//depends what you want to do now:
//keep the focus on this element? Set a flag an error occured? Store the error?
return false;
} else {
$(elJob).css({"border-color":""});
alert("value ok");
};
};
调用bind_validations onload。如果允许创建行,请将click事件绑定到addrow按钮并调用bind_validations。
function bind_validations(){
//f01 : row selector
//f03 : ename
//f04 : job
//f05 : hiredate
//f06 : sal
//each input element with attribute name with value f04
//blur event is when the user leaves the field, fe tab out, or even click apply changes
//much like how when-validate-item behaved in forms
$("input[name='f04']").blur(function(){validate_job(this);});
};
虽然是一个适当的警告。到目前为止,我在某些应用程序中使用过javascript验证,但我知道它们只会被少数人使用,然后才会在内部使用。这只是一个领域,有一些验证。当验证失败时,我将光标重新聚焦在字段上,因此它们无法跳转到下一条记录并更改它。要么给出了有效值,要么重新加载页面或取消操作。如此设置,他们也无法按下应用更改,因为模糊事件也会触发,验证字段。
当您的受众群体规模扩大时,它会变得更加不确定:我的JavaScript被禁用了什么?如果他们找到了解决方法怎么办? Wizzkids?
我仍然喜欢它给出的即时反馈,但在更关键的环境中,我也会使用服务器端验证。为此,您需要验证“函数返回错误文本”类型。查看this page以获取示例,或this one查看一些有用的提示(至少对于4.0之前的版本!)。另外:apex 4.1在表格形式验证方面确实提高了很多! ;)