在事件已经触发后,注册jQuery(window).load(...)事件?

6

我是新来的,对于jQuery(window).load(function() {});有一个简单的问题。

我有一个外部JS文件,它在窗口加载事件发生后动态插入到页面中。在这个JS文件中,我有如下语句:

jQuery(window).load(function() {
    alert("Something");
});

我有一个问题,上面的alert()语句是否会得到执行,因为当我的函数被注册到窗口加载事件时,事件已经触发。我期望上面的警报立即触发,因为它要等待的事件已经完成。
我欣赏任何想法。
谢谢!

可能应该使用 jQuery(document).load( ... ) 代替。 - Pointy
另外:目前发生了什么? - Pointy
目前它不触发。我认为立即触发该函数会更合理。因为编码人员打算在窗口加载事件发生后执行他的函数,而且jQuery应该足够智能,能够理解事件已发生,我们应立即调用该函数。 - amitsaurav
jQuery提供了一种机制:$(document).ready(function() { }),为什么这段代码没有使用它?它需要图像载入吗? - Nick Craver
这段代码在页面上嵌入了一些Flash,并考虑到一些延迟问题,我不希望加载事件被阻塞在Flash完成加载上。因此,我希望在窗口加载事件发生后再嵌入这个Flash。此外,整个嵌入逻辑都在一个外部JS文件中,该文件也是在加载事件之后获取的,这就是我提出这个问题的原因。感谢您的回复。 :) - amitsaurav
2个回答

4
不会自动触发事件,不过您可以在插入后手动调用该事件,方法如下:
$(window).load(); //or.. $(window).trigger('load');

这将触发代码运行。

使用document.ready会在文档已经准备好后立即触发,但是$(window).load(function() {... })是显式地绑定到窗口的加载事件,该事件已经触发。


谢谢!我本来期望这个行为会更加智能一些,但是我明白你的意思了。我会尝试在load事件实际触发之前注册我的函数。(更多内容请见上面的评论)。 - amitsaurav

1
这个问题也困扰了我。我猜在页面加载后添加“load”回调可能会有风险,因为如果“load”事件已经触发,它将完全不会被调用!
我完全同意——我也期望我的回调函数立即被调用,因为它要等待的事件已经完成。似乎这更符合文档“ready”事件的方式,如果文档已经准备好,它会立即触发其回调...
这是我的解决方法,用CoffeeScript编写:
$(window).on 'load', ->
  window._loaded = true

window.on_window_load_safe = (callback) ->
  if window._loaded
    # Since the load even already happened, if we tried to add a new callback now, it would not even
    # get called. So just call the callback immediately now.
    callback.call()
  else
    $(window).on 'load', ->
      callback.call()

你可以用类似这样的方式进行测试:
  setTimeout(->
    on_window_load_safe ->
      console.debug 'on_window_load_safe called me'
  , 2000)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接