浏览 3266 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-03-12
该问题在单一页面里面是不会出现的,而在使用多框架开发的项目中,可能会出现。 问题的关键我下面从一个实例中分析: 我们有一个框架页面frameset,其中框架里面有2个frame, 一个A,一个B。B是隐藏框架,用来保存数据或作其他操作,A是我们看的见的框架。(也可以是都是看的见的框架)。在多框架的情况下,我们经常会遇到框架B里面的函数访问框架A里面的函数的情况。 而框架A又在很随机的情况下手动或通过提交操作刷新了页面(此时B框架是没有刷新的),如果我们B框架里面有一个变量 var bFunc = top.frame[“A”].aFunc; 而aFunc是框架A的一个函数,正常情况下调用bFunc(); 是没有问题的。但是如果框架A重新刷新过,而框架B 没有刷新的情况下就会出现异常,该异常的描述就是 “不能调用已经释放的javascript代码”。 下面是具体代码 Main.html: <frameset rows="0,*" cols="*" id="myframe" name="myframe" framespacing="0" frameborder="no"> <frame src="a.html " name="A" id="A"> <frame src=”b.html" id="B" name="B"> </frameset> a. html <script> function aFunc(){ alert(“alert”); } </script> b. html <script> var bFunc = top.frames[“A”].aFunc; </script> 该问题只是在框架B有重新刷新的情况下,再调用bFunc();方法的时候产生。ps:如果变量bFunc 引用的是框架A的一个变量,则不会出现该问题。 因为javascript的特殊性,对于function类型来说赋值操作都是一个地址引用(其他的变量是拷贝过程)。 而当框架B重新刷新过后,该框架的javascript重新加载近来,以前的代码空间已经释放掉,所以函数及变量地址都已经发生变化,而框架B的变量bFunc 所指向的框架A的函数aFunc地址不变,导致再次调用bFunc();时出现“不能调用已经释放的javascript代码”。 总结: 当我们工程调用框架比较多时候很容易不小心出现这样的隐患, 所以在我们项目中应该尽量少的使用框架,如果实在要用, 则尽量减少框架之间的关系, 避免不必要的麻烦. ps: 当我们使用 ajax 的 onreadystatechange 回调函数的时候也容易出现这样类似的错误。 上文仅为个人的一点点认识,希望和大家交流, 谢谢 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |