解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
文件大小: 27k
源码售价: 10 个金币 积分规则     积分充值
资源说明:在IE与google chrome中则一切正常,很是郁闷,找了很多种调用iframe中函数的方法,问题一直没有解决。今天在google上又搜索了一下,耐心的浏览搜索结果,最后发现有人写到可以用 document.getElementById(‘iframeid’).contentWindow.myFunc(); 这样的方式,以前没有看到过这种写法,抱着死马当活马医的心态,试了一下这段代码。奇迹发生了,药到病除。现在这种方法在前面提到的三种浏览器中都能正常的工作,在这里做下笔记,以备后用。 在开发Web应用时,我们经常会遇到跨域、跨框架通信的问题。本文主要讨论的是一个特定的场景:在ExtJS框架下,使用Firefox浏览器时,如何解决关闭并重新打开窗口后,iframe中的JavaScript函数无法被访问的问题。这个问题在Internet Explorer和Google Chrome中并未出现,但在Firefox中成为了一个难题。 我们要理解为什么会出现这种情况。在HTML中,iframe可以被用来嵌入其他网页或页面元素。当一个页面包含iframe时,它们实际上形成了两个独立的上下文,每个都有自己的window对象。如果这两个上下文(即主页面和iframe页面)来自不同的源,那么由于同源策略的限制,JavaScript通常不能直接访问另一个窗口或iframe的内容。 在Firefox中,当一个包含iframe的页面被关闭后,这个iframe的引用可能在内存中仍然存在,但是它的状态可能已经被清除。因此,当你重新打开这个页面时,尽管iframe的HTML内容可能已经加载,但之前建立的JavaScript引用可能不再有效,导致无法调用iframe中的函数。 解决这个问题的关键在于正确地获取iframe中的window对象,并通过它来调用函数。描述中提到的解决方案是使用`document.getElementById('iframeid').contentWindow.myFunc();` 这一行代码。这里的`getElementById`方法用于获取具有指定ID的DOM元素,也就是我们的iframe。`contentWindow`属性则是iframe元素的一个特性,它指向iframe内部的window对象。通过这个对象,我们可以直接访问到iframe内部的JavaScript环境,包括定义的函数`myFunc()`。 这种方法的巧妙之处在于,即使在页面关闭并重新打开后,只要iframe成功加载,`contentWindow`仍然能提供对iframe内容的访问。因此,无论是在IE、Chrome还是Firefox,这都是一个可靠的解决方案。 需要注意的是,这种方法仅适用于同源策略允许的情况。如果iframe加载的内容来自不同源,那么你需要使用其他技术,如postMessage API来进行跨域通信。postMessage允许两个不同源的窗口之间安全地传递消息,从而实现函数调用或数据交换。 在实际应用中,为了确保兼容性并防止潜在错误,建议在尝试调用iframe中的函数之前,先检查`contentWindow`是否存在以及是否可访问。例如: ```javascript var iframe = document.getElementById('iframeid'); if (iframe && iframe.contentWindow) { iframe.contentWindow.myFunc(); } else { console.error('无法访问iframe中的contentWindow'); } ``` 通过这样的检查,可以在无法访问iframe内容时给出适当的错误提示,而不是直接导致程序崩溃。 解决Firefox中ExtJS关闭窗口后再打开后iframe中js函数访问不到的问题,关键在于正确地获取和使用iframe的`contentWindow`属性。同时,了解并遵循同源策略以及适时使用跨域通信技术,对于开发健壮的Web应用至关重要。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。