[经验分享]关于PB12.5 WEBFORM数据窗口中checkbox引起的脚本异常

[经验分享]关于PB12.5 WEBFORM数据窗口中checkbox引起的脚本错误
前几日小生碰到一非常郁闷和费解的问题:
MAIN窗口中有一列表数据窗口,其中第一列是让用户勾选记录的checkbox。当双击该数据窗口某条记录时,可以打开那条记录进行维护,维护窗口是respons类型的窗口。但如果当双击打开窗口后不做任何操作直接点关闭,返回到MAIN窗口时。网页会报一个dw.dataform不能为空的提示,指向的错误行时line 1696。
问题的处理:
经过一番分析和测试后,基本确定了,此问题与程序代码无关,但和checkbox有关,因为当MAIN窗口的数据窗口中的checkbox删掉或将焦点序号设置成0后,同样操作就不会出错。并且同样的代码在CS下是不会出错的。只有WEB下会。当时分析可能产生这个的原因:PB12.5BUG造成。当时用的补丁是2511,后来升级到3072,问题依旧。
僵持数天后。。。。。。
最后想起了,WEB和CS代码同样的情况下,有一样东西是有区别的,因为WEB是要经过JS的控制来优化(个人优化和系统控制优化,PB安装目录下有个JS目录下的控制文件),好在有1696行的文件并不多。在pbdatawindow.js文件中的1696行代码为:var controlExists = eval('typeof ' + controlId);上一行代码为var controlId = 'dw.dataForm.' + dw.name + '_' + row + '_' + col;于是欣喜,问题果然出在这里。一看这个代码所属的函数PBDataWindowFocusNoRowChange,是和焦点有关。基本确定了。于是分析这两行代码。第1695行代码里的controlid引用到了dw.dataform,但如果后面某个变量为null,那么controlid就为NULL了,到1696行,直接去引用controlid去执行脚本语句。当它为空时,当然会提示错误。
解决方法:
解决方法其实很简单,是个程序员都会做,不知道为什么SYBASE公司的开发人员为什么没做。
在1695和1696行间插入对controlid变量为空的校验,空时直接return
if (controlId !== null)
return;


问题就此解决。。。
PS。修改JS文件,建议别用记事本,因为用了后,因为编码问题,会变的很无序,不利于日后的查看。建议使用editplus等工具来打开、修改、保存。

------解决方案--------------------
感谢楼主分享