2010-03-10 60 views
0

目前我正在开发一个web应用程序,我正在使用preloader图标。我想要的是,每当用户导航到另一个页面或刷新页面时,预加载器都可见。到目前为止,我有以下解决方案:window.unbeforeunload显示div ie7问题

window.onbeforeunload = function() { $("applicationdisabler").show(); }; 

对于Safari和Firefox,它可以在用户单击链接或刷新页面时正常工作。但是,在IE7中,div只在用户点击链接时才可见,而在用户刷新页面时不会显示。

用户可以通过点击F5(在Windows上)或浏览器提供的任何其他可能方式来刷新页面。

当然,我一直在寻找一些解决方法。以下代码显示了IE7中的警报,但是div仍然不可见。

window.onbeforeunload = function() { $("applicationdisabler").show(); alert("come on!"); }; 

我div的代码:

<div id="applicationdisabler"><img src="images/preloader.gif" /></div> 

希望有人能帮助我。

+0

我假定代码不被注释掉在你真正的考验? (它是上面的;实际上,上面是一个语法错误。)另外,你可以显示你的标记(例如,有问题的div)吗? – 2010-03-10 14:18:14

+0

糟糕。你是完全正确的。但是,它并没有在我的“真实”代码中被注释掉。 – Joop 2010-03-10 14:39:45

回答

0

为什么不使用onLoad监听器呢?虽然它会稍微慢一点,但应该更可靠。

实际上,经过一番环顾,我不确定修改DOM是否有意义,除非onBeforeUnload处理程序首先返回false - 即强制用户留在同一页面上。

据我了解的onBeforeUnload事件被触发只是页面被卸载之前,所以如果你不回false浏览器将卸载的页面和DOM,和任何JavaScript执行后,将是毫无意义的。

这并不完全解释为什么没有被正确执行的JavaScript onBeforeUnload功能,但是从我所看到的网站只使用window.alertwindow.prompt对话框,询问用户是否要离开网站,然后经常在用户决定停留的情况下执行JavaScript。

因此,我猜测,当这个事件被触发时,一些浏览器可能不允许DOM操作 - 因为如果页面被卸载,任何DOM操作都是毫无意义的。

因此,要么:

  1. 返回falseonBeforeUnload方法,然后显示您的预加载(虽然这将阻止导航到下一页)
  2. 使用onLoad事件的下一个页面,显示preloader图像代替

另请注意:Opera版本9.5及以下版本不支持此事件(我不确定后期版本),但GMail设法捕捉Opera中的后退按钮。

IE7执行onBeforeUnload事件可能与this security warning有关 - 微软可能会通过修补它来阻止您尝试执行的操作。而我知道出于安全原因,IE6及以下版本不允许在onBeforeUnload处理程序中使用类似document.location=''的命令。

+0

该代码在其他浏览器(Safari和Firefox)中正常工作,但不在IE中。不要认为这是一个代码问题,但更多的是IE的限制。 我正在使用ASP.NET,我没有在响应中使用flush。 onload的事情是,它会在整个过程中很晚才会被解雇。在Safari和Firefox中,只要其他页面尚未加载,浏览器就可以开始呈现足够的数据。当我使用onload时,它不会添加任何值,如果它已经(客户端希望)。 – Joop 2010-03-10 15:33:17

+0

你不能为你的应用程序使用单一页面吗? (肯定是AJAX的主要优势之一) 你可以使用jQuery BBQ之类的东西来允许后退/前进功能并提供不同的入口点。 – 2010-03-10 22:04:01

+0

一切皆有可能,但我更喜欢具有一些额外味道的旧时尚方式。无论如何,我仍然觉得有一个解决方案的IE浏览器。只是不能拿出来呢。 – Joop 2010-03-11 07:09:36

1

你需要把#的jQuery选择的ID前:

$("#applicationdisabler").show();