$(window).load(handler)不会触发

时间:2011-10-19 00:51:08

标签: c# jquery asp.net load

我一直在使用jQuery在Asp.NET Web应用程序上工作,以生成一个甜美,灵活和快速的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>

现在onStart我将使用jQuery追加一些动态创建的DOM元素。我这样做是通过调用Page_Load方法(ASP)中的两个js函数来实现的。然后我需要初始化几个脚本(tabbedContent和iNettuts)。 问题是这些脚本只有在创建整个页面后才需要初始化 - 包括动态创建的内容 - 所以我可以使用$(document).ready,当我使用$(window).load时,它有时会起作用,有时它会没有。

我已经谷歌搜索了至少两个星期,但仍然没有。我该怎么办?是不是jQuery应该处理这个问题?如果没有..有任何解决方法吗?

PS。试着让它在IE7-8,Chrome 10和FF 6中运行

顺便说一下,一旦我实现了这一点,我需要做一些Web服务调用来从数据库中获取数据。这会影响行为吗?我应该期待更多头痛吗?

7 个答案:

答案 0 :(得分:2)

经过对你的建议的一些研究以及实施Radus建议的非常漫长的一夜 - 这可能被解释为每个要加载的元素的标志 - 我开始问自己:如果ready()有一个标志怎么办?在这种情况下,我不应该担心初始化的时间。事实证明,这个标志确实存在,它被称为holdReady()。 基本上,它会阻止ready()事件启动,直到标志设置为false。

“$ .holdReady()方法允许调用者延迟jQuery的ready事件。这个高级功能通常由想要在允许就绪事件发生之前加载jQuery插件之类的其他JavaScript的动态脚本加载器使用,甚至尽管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/

答案 1 :(得分:1)

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);
    }
}

答案 2 :(得分:1)

$(document).ready(handler)是正确的表单。您也可以$(handler)

.load方法是在元素上完成的,实际上用于将XHR调用的HTML响应加载到元素中。

答案 3 :(得分:1)

你不应该在Page_Load处理程序中从.Net调用javascript函数(当然这是可能的)。

相反,将所有jQuery功能放在$(document).ready()中。然后它将在页面加载后执行,并准备接受通过JavaScript的动态操作。这对于IE6兼容性尤其重要,因为如果您在页面加载完成之前尝试更改DOM,它将会阻塞。

因此,在您的情况下,您的jQuery javascript代码可能如下所示:

$(document).ready(function() {
    // create your dynamic content here
    tabbedContent();
    iNettuts();
});

答案 4 :(得分:0)

请尝试$(document).load

答案 5 :(得分:0)

或尝试$(document).ready()而不是

答案 6 :(得分:0)

$(document).ready()函数中,您可以创建一个哈希,其中包含需要作为键加载的动态对象及其作为值的就绪状态。每个动态对象完成加载后,将其值设置为true。然后,您可以轮询以查看所有值何时为真,并在发生这种情况时执行所需的代码。

$(window).load()有时会起作用,有时却不起作用,因为有时会发生所有元素的加载速度足以让它们在代码运行时准备就绪。