$(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'>
    &nbsp;&nbsp;
    <h3 class='color-black h3'>
        Choose the career</h3>
    <p>
        &nbsp;</p>
    <p>
        &nbsp;</p>
    <p>
        &nbsp;</p>
</div>
<div id='tabbedContent' class='tabbed_content'>
    <div id='tabs' class='tabs'>
        <div class='moving_bg'>
            &nbsp;
        </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服务调用从数据库获取数据。这会影响行为吗?我应该期待更多的头痛吗?

$(window).load(handler) won't fire

在对你的建议进行了一些研究和一个非常非常长的夜晚实施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()有时工作,有时不工作,因为有时会发生所有元素加载足够快,以便在代码运行时准备好