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

4

我一直在开发一个使用jQuery生成漂亮、灵活和快速UI的Asp.NET Web应用程序。我已经创建了框架。

<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不能处理这些问题吗?如果不能...有没有任何解决方法?
顺便说一句,一旦我实现了这个目标,我将需要调用一些Web服务来从数据库获取数据。这会影响行为吗?我应该期望更多的头疼吗?
7个回答

2
经过对您的建议进行一些研究和实施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/


不错,我不知道这个,看起来很棒!你应该接受你的答案。 - rid

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

1

在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函数。 - rick schott

1

$(document).ready(handler) 是正确的形式。你也可以直接使用 $(handler)

.load 方法是针对元素进行的,实际上用于将 XHR 调用的 HTML 响应加载到元素中。


0
尝试使用 $(document).load

为什么有人回答了一样的问题,却被投下了负票? - endyourif
+1 $(document).load() 不是 OP 需要的,但是试图帮助也不应该被点踩。 - rick schott

0

或者尝试使用$(document).ready()


OP刚刚说$(document).ready()不能满足他的需求...他需要在一些动态内容加载后发生一些事情,这是在文档准备好之后发生的。 - rid
可能是因为他没有正确使用,$(document).ready()非常好用。 - rick schott
我知道那点,这就是.live发挥作用的地方,但是那与启动/初始化函数的触发无关。 - rick schott
@rick schott,我同意使用live(),但是它似乎不是他想要的。想象一下这样的场景:你需要用数据填充10个div,并且在所有div都填充完毕之后运行一些代码。你需要找出它们何时全部填充完成,而live()在这种情况下无法帮助。 - rid
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/4375/discussion-between-rick-schott-and-radu - rick schott
显示剩余3条评论

0

在你的$(document).ready()函数内,你可以创建一个哈希表,将需要加载的动态对象作为键,它们的准备状态作为值。一旦每个动态对象完成加载,你就将其值设置为true。然后你可以轮询以查看所有值是否都为true,并在发生这种情况时执行所需的代码。

$(window).load()有时起作用,有时不起作用,因为有时所有元素加载得足够快,以便在代码运行时它们已经准备好了。


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