日期:2014-05-16  浏览次数:20365 次

my97 datepicker的'$db.cal'为空或不是对象问题解决参考

前言:

原来项目只有一个域名,一个包,后来种种原因要和其它的一个应用柔和,将自己的应用作为iframe嵌入到另一个应用,自己应用的日期控件用的是My974.5版本,完成嵌入后日期控件图片,输入框什么的都能正常显示,就是点击控件时出现该日期控件报 $db.cal'为空或不是对象 的js问题。

?

问题分析:

根据报错的显示,可能是由于找不到对应的JS资源,但查找了一下自己应用的My97DatePicker目录结构,一直没动过,唯一可能的问题就是My974.5内部调用JS对象的路径时可能会和iframe相关。

?

DEMO示例:

为了很好的展示问题和分析问题,做了两个小应用来重现该问题。附件1是两个小应用,app1和app2。其中app2中用到了my97datepicker,app1中没有。

使用方法:分别将这两个应用部署在自己电脑上的两个TOMCAT中,app1的server端口设置为9090,app2的server端口设置为8080,然后启动这两个tomcat,在地址栏输入http://localhost:9090/app1/html/demo_iframe1.html,点击页面上的日期控件即可发现上述问题报错。

?

原因分析:

用httpwatch工具查看该DEMO的工作流程,发现有404的请求,如下截图

demo

可见9090下是没有app2应用的,该应用是在8080下,而在这之前的请求都没有问题,所以就需要具体分析my97的js加载中的有关路径的操作了。

将my97的核心JS文件WdatePicker.js稍微格式化一下,然后调试测试,发现主要是由于my97为了解决iframe的问题,添加了一个属性$crossFrame : true,意识就是跨FRAME的设置,而这个设置为TRUE以后,核心对象V就由WINDW对象变成了WINDOW.PARENT对象了,这样后续的K(E, $)函数中构建var B时应用的路径_.$dpPath就变成了父框架的域名和子应用的应用名拼接,具体的拼接方法参见L()方法和F(F)方法等。

?

解决办法:

1:在app1所在的tomcat建立一套app2的应用,其中只包含my97datepicker的目录结构,其它的都不要,因为只涉及到访问my97datepicker的相关资源。

2:修改WdatePicker.js的K(E, $)方法和相关的方法,在var B构建之前,将路径修改过来,这个不太好改,地方比较多,而且涉及到版权问题,各位还是用第一种方法吧,简单实用。

?