$(window).load(handler) won't fire
本文关键字:fire handler window load won | 更新日期: 2023-09-27 18:11:43
我一直在做一个Asp。NET web应用程序使用jQuery生成一个甜蜜,灵活和快速的UI。我已经创建了骨架
<div id='title'>
<h3 class='color-black h3'>
Choose the career</h3>
<p>
</p>
<p>
</p>
<p>
</p>
</div>
<div id='tabbedContent' class='tabbed_content'>
<div id='tabs' class='tabs'>
<div class='moving_bg'>
</div>
</div>
<div id='contentID' class='slide_content'>
<div id='tabsliderID' class='tabslider'>
</div>
</div>
</div>
现在我将使用jQuery添加一些动态创建的DOM元素。我通过从Page_Load方法(ASP)调用两个js函数来实现这一点,这将完成所有的魔术。然后,我需要初始化几个脚本(tabbedContent和iNettuts)。问题是,这些脚本需要初始化后,整个页面被创建-包括动态创建的内容-所以我不能使用$(文档)。当我使用$(window)时。加载有时有效,有时无效。
我已经在谷歌上搜索了至少两个星期了,仍然一无所获。我该怎么办?jQuery不应该处理这些问题吗?如果不是……有什么变通办法吗?
p。试着让它在IE7-8, Chrome 10和FF 6中工作
顺便说一句,一旦我实现了这一点,我需要做一些web服务调用从数据库获取数据。这会影响行为吗?我应该期待更多的头痛吗?
在对你的建议进行了一些研究和一个非常非常长的夜晚实施Radus建议-这可以解释为每个元素要加载的标志-我开始问自己:如果ready()有一个标志呢?在这种情况下,我不需要担心初始化的时间。这个标志确实存在,它叫做holdReady()基本上,它阻止ready()事件被启动,直到该标志被设置为false。
" $. holdready()方法允许调用者延迟jQuery的ready事件。这个高级特性通常由动态脚本加载器使用,它希望在允许ready事件发生之前加载额外的JavaScript(如jQuery插件),即使DOM可能已经准备好了。这个方法必须在文档的早期调用,比如在jQuery脚本标记之后。在ready事件已经触发之后调用此方法将没有效果。"[1]
所以,我做了:
$.holdReady(true);
//using ASPs page_load so it will be triggered everytime
//a postback happens -gonna need it for the AJAX requests i'm planning to do.
//Then I create the dynamic content
$.holdReady(false); //then I let the event fire
$(document).ready(function(){
//append the dynamic content
iNettuts.init();
tabbedContent.init();
});
就是这样,问题解决了。希望这篇文章能帮助到其他人,谢谢大家。
[1] http://api.jquery.com/jQuery.holdReady/
$(document).ready(handler)
是正确的形式。也可以直接写$(handler)
.load
方法是在元素上完成的,实际上是用来从一个XHR调用加载HTML响应到一个元素。
你真的不应该在Page_Load处理程序中从。net调用javascript函数(当然这是可能的)。
相反,把所有的jQuery功能放在$(document).ready()
中。然后,一旦页面加载并准备好接受通过JavaScript进行的动态操作,它将被执行。这对于IE6的兼容性尤其重要,因为如果在页面完成加载之前尝试更改DOM,将会导致阻塞。
在你的例子中,你的jQuery javascript代码可能是这样的:
$(document).ready(function() {
// create your dynamic content here
tabbedContent();
iNettuts();
});
Page_Load
将很好地用于您的.ready处理程序。如果你需要真正的动态DOM事件,你应该使用.live()
作为事件绑定。
protected void Page_Load(object sender, EventArgs e)
{
// Define the name and type of the client scripts on the page.
String csname1 = "PageStartUpScript";
Type cstype = this.GetType();
// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;
// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
StringBuilder cstext1 = new StringBuilder();
cstext1.Append(@"$(document).ready(function() {
// add your startup.init functions here
});");
cs.RegisterStartupScript(cstype, csname1, cstext1.ToString(), true);
}
}
尝试$(document).load
。
或者尝试用$(document).ready()
代替
在$(document).ready()
函数中,您可以创建一个散列,其中包含需要作为键加载的动态对象,并将其就绪状态作为值加载。一旦每个动态对象完成加载,就将其值设置为true。然后,您可以轮询查看所有值是否为真,并在发生这种情况时执行所需的代码。
$(window).load()
有时工作,有时不工作,因为有时会发生所有元素加载足够快,以便在代码运行时准备好