没有提交的表格形式验证

时间:2011-11-13 23:32:53

标签: oracle-apex

在APEX 3.2中,我希望能够运行JavaScript验证来检查输入的数据,并在表格形式的每一行上方显示相应的消息。

我不确定这是如何工作的,因为它是一个表格形式,用户可以添加/删除行。

欣赏任何想法或建议。

感谢。

1 个答案:

答案 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在表格形式验证方面确实提高了很多! ;)