【问题标题】:$(window).load(handler) won't fire$(window).load(handler) 不会触发
【发布时间】:2011-10-19 00:51:07
【问题描述】:

我一直在使用 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 服务调用以从数据库中获取数据。这会影响行为吗?我应该期待更多的头痛吗?

【问题讨论】:

    标签: c# jquery asp.net load


    【解决方案1】:

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

    “$.holdReady() 方法允许调用者延迟 jQuery 的就绪事件。动态脚本加载器通常会使用此高级功能,这些加载器希望在允许就绪事件发生之前加载额外的 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/

    【讨论】:

    • 很好,我不知道这个,看起来很棒!你应该接受你的回答。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您不应该真的在 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 函数。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        改用$(document).load。

        【讨论】:

        • 为什么有人在回答同样的问题时投了反对票?
        • +1 $(document).load() 不是 OP 所需要的,但没有必要因为试图提供帮助而被否决
        【解决方案6】:

        或者改用$(document).ready()

        【讨论】:

        • OP 刚刚说$(document).ready() 没有做他需要做的事情......他需要在加载一些动态内容之后发生一些事情,这发生在 文档之后准备好了。
        • 可能是因为他没有正确使用它,$(document).ready() 就像一个魅力。
        • @rick schott,一旦所有 DOM 元素都被渲染,文档就准备好了。如果然后您继续通过 AJAX 加载这些元素的内容并填充它们,这会发生在 DOM 被渲染之后,因此 在 文档准备好之后。
        • 我知道,这就是 .live 发挥作用的地方,但这与启动/初始化函数无关。
        • @rick schott,我同意live(),但同样,这似乎不是他想要的。考虑一个场景,您需要用数据填充 10 个 div,然后 填充所有这些 div,然后运行一些代码。您需要找出它们何时全部完成填充,而 live() 在这种情况下无济于事。
        【解决方案7】:

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

        $(window).load() 有时有效,有时无效,因为有时会发生所有元素加载速度足够快,以便在您的代码运行时准备好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-01
          • 1970-01-01
          • 2015-05-15
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          相关资源
          最近更新 更多