2011-08-31 42 views
1

我对jQuery的理解是脚本将在文档准备就绪后立即执行。在Jquery中生成HTML之前执行的脚本?

我有一些动态生成的HTML,在页面加载时生成一旦从服务器返回响应以生成什么。 HTML都是模板的一部分。所有这些都是通过以下行开始的。

window.App=new AppView; 

和行之后,我有

alert($("#field").val()); 

其中$( “#场”)是这是动态生成到HTML

和NULL被惊动了模板的一部分。

但是,如果我设置setTimeout来执行警报,我会看到一个值。 这两行代码都在jQuery {}中。

有人可以解释为什么第二行是在第一行中的所有内容执行之前执行的。

P.S.这是生成模板行

 $("body").html($.tmpl("temp", data)); 
+0

如果不知道AppView函数的内容,则无法回答。因为它可能包含一些包含超时的内容。 – Alxandr

+0

没有时间或任何与延迟有关的事情。这是一个非常长的代码,我会尽力提取什么是必要的,如果有必要 –

+0

@Alxandr,还有什么可能的原因,所以我会知道该找什么。里面的所有代码基本上都涉及到,向服务器发送GET请求并将响应解析到字段 –

回答

1

我想我只是想出了问题。你说你的代码涉及从服务器获取GET请求?那么,这意味着异步代码。换句话说,发生了以下情况:

You call new AppView 
    - Inside AppView, a XHR is created, sending a GET request to server 
    - Code finishes inside AppView, and returns to calling function 
You call alert field val (not created yeat) 
Some time later, the GET request is finnished 
    - Inside callback-function for GET-request. Your field get's created. 
+0

是的,这也是我的猜测。这通常是如何解决的?在浏览器控制台中确实存在一个XHR –

+0

通常有两种方式,一种是不好的(同步运行请求),一种是好的,最好的方式是将代码作为回调但是,如果没有更多的代码,我不能解释这一点。 – Alxandr

+0

我想我已经得到你了,谢谢。 –

1

您应该只使用jQuery在DOM准备就绪:

window.App=new AppView; 

$(document).ready(function() { // Triggered when the whole DOM is ready 
    alert($("#field").val()); 
}); 
+0

他是否说过“这两行代码都在jQuery {}”中?“?你不认为这意味着它在jQuery中的功能是这样的:'jQuery(function(){/ * code here * /}',换句话说,在页面加载时运行? – Alxandr

+0

我确实说过所有的东西都在jQuery {}。我也尝试使用单独的$(document).ready ...,没有运气。这次它甚至在浏览器有机会显示来自服务器的响应之前就会发出提醒。 –

0

你需要在事件处理起来包住你的代码多数民众赞成在调用的时候你的页面已经完成装!

$(function() { 
    $('body').html($.tmpl("temp", data)); 
});