document.ready()

document.ready()和传统的方法<body onload=”load()”> 相似,不同的是onload()的方法是在页面加载完成后才发生,这包括DOM元素和其他页面元素(例如图片)的加载,因此,使用document.ready()方法的执行速度比onload()的方法要快。

document.ready()可以说是jQuery的一大特色,它不仅比传统的Javascript函数onload()要快,而且加上jQuery强大的选择器可以在不用修改HTML代码情况下(例如:不用在HTML标签加入onClick()函数来调用其它自定义Javascript函数)对Web页面中的各种元素和事件进行控制、实现和Web客户交互的作用。

可是有时document.ready()并非你想像的那么快,我在最近的一个project里就碰到这个问题。例如一个页面含有多个相似的链接,每一个链接的HTML代码大致如下:


<a rel="popin" href="/cart/?popin=yes&act=add&sku=xxx">
<img src="/images/new/buynow.gif" border="0" />
</a>

当这些链接被点击后,相对应的物品(sku)就会被加入购物篮,为让客户点击链接后不用离开当前页面,我使用了jQuery的ajax方法,从后台调用添加购物篮函数,然后返回xml响应,最后把xml携带的信息通过HTML层(layer)传递给客户。大致的jQuery+ajax代码如下:


$(document).ready(function(){
$("a[rel^=‘popin‘]").click(function(){
$.ajax({
url: $(this).attr(‘href‘),
type: ‘GET‘,
dataType: ‘xml‘,
error: function(){
alert(‘Error loading XML document‘);
},
success: function(xml){
$(‘#cart_sum1‘).html($(xml).find(‘cart‘).text());
$(‘#buynow-result‘).html($(xml).find(‘pop‘).text());
$(‘#buynow-inform‘).show(‘slow‘);
$(‘#cart_sum2‘).html($(xml).find(‘cart‘).text());
}
});
return false;
});
});

注意到我用了document.ready,试图在DOM ready的时候给这些链接(<a[rel^=‘popin‘>)绑定点击事件控制。这在我的机子(windowxp+firefox3)里测试通过,但是在我老板的机子(redhat+firefox)上,有时会出现点击链接后跳出XML代码,原因很明显: 当她点击链接的时候,链接还没有被绑定事件控制,也就是说document.reday()还是不够快。

怎么解决?我有打算在链接代码里加入传统Javscript的onClick函数,这样当客户点击链接的时候,先调用onClick函数,然后在onClick函数里在调用ajax,应该就可以解决问题。今天想看看别人都是怎么解决这个问题,就用Google搜索了一下。找到这篇论坛问答,觉得说的挺有道理:

  • Using window.onload waits until the whole page is loaded. (onload是在页面加载后起作用)
  • Using document.ready waits until the whole DOM is ready (document.ready是在DOM 准备好后起作用)
  • Having the script at the end of the body without document.ready, that doesn‘t wait. (把去掉document.ready的jQuery代码放在</body>前,无需等待)

准备明天到公司试试这种方法。其实把Javascript放在</body>前的说法以前也有看到过,Google的Analytics代码就建议放在</body>前。

Updated:(3/24/08)

经测试,第三种方法也不好用,主要问题是在页面没有完全加载完毕时,链接就已经被点击,这时</body>前的那一段jQuery代码还没有被加载,因此链接还没有被绑定ajax事件控制。

最终的解决办法是,把上面那段jQuery代码写出一个函数,反正header里,然后结合传统Javascript onClick函数,在链接被点击时直接调用header里函数。具体更改如下:

1. jQuery函数 (这段函数被放在header里)


function ajax_add(url_str){//把jquery代码写成一个函数
$.ajax({
url: url_str,
type: ‘GET‘,
dataType: ‘xml‘,
//timeout: 5000,
error: function(){
alert(‘Error loading XML document‘);
},
success: function(xml){
$(‘#cart_sum1‘).html($(xml).find(‘cart‘).text());
$(‘#buynow-result‘).html($(xml).find(‘pop‘).text());
$(‘#buynow-inform‘).show(‘slow‘);
$(‘#cart_sum2‘).html($(xml).find(‘cart‘).text());
}
});
}

2. 链接代码:


<a onClick="add_ajax(‘/cart/?popin=yes&act=add&sku=xxx‘)" href="#">
<img src="/images/new/buynow.gif" border="0" />
</a>

注意:链接直接加入onClick事件控制,而不在页面加载后绑定事件控制。这样就可以避免链接被点击时,事件还没有绑定的问题。

时间: 2024-08-29 11:49:48

document.ready()的相关文章

jquery $(document).ready() 与window.onload的区别

转载自http://www.jb51.net/article/21628.htm 1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行.         $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2.编写个数不同 window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个          $(document).ready()可以同时编写多个,并且都可以得到执行 3.简化

JavaScript tips:window.onload与$(document).ready()的差异

1.window.onload在$(document).ready()之后执行 原因:二者触发与否,都是依据document.readyState这个属性. (1)document.readyState的值:uninitialized.loading.interactive.complete(这四个值,依据时间先后排序). (2)当其值为interactive时,会触发documentContentLoaded事件,JQuery.ready()就是对documentContentLoaded事件

document.ready和onload的区别

转载地址:http://blog.csdn.net/zndxlxm/article/details/7404758 页面加载完成有两种事件,一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件),二是onload,指示页面包含图片等文件在内的所有元素都加载完成. 用jQ的人很多人都是这么开始写脚本的:      $(function(){           // do something     });其实这个就是jq ready()的简写,他等价于:      $(docum

jQuery的document ready与 onload事件——你真的思考过吗?

在进行实验和资料查询时,我遇到了几个关键问题: 1. window.onload到底是什么加载完触发? 2. body为什么会有onload事件? 3. 为什么是window.onload,而不是document.onload? 4. document ready到底是什么ready,DOM渲染完成? 5. jQuery怎么实现$(document).ready? 6. jQuery的ready,还能ready什么? 7. jQuery的document ready就一定比window.onlo

JS 页面加载触发事件 document.ready和window.onload的区别

document.ready和onload的区别——JavaScript文档加载完成事件页面加载完成有两种事件: 一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件): 二是onload,指示页面包含图片等文件在内的所有元素都加载完成. 1.Dom Ready 使用jq时一般都是这么开始写脚本的: $(function(){ // do something }); 例如: $(function() { $("a").click(function() { alert(&

Jquery中$(document).ready() 和 JavaScript中的window.onload方法 比较

Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2.编写个数不同 window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个(最后一个)       

window.onload和document.ready区别

1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行.         $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2.编写个数不同 window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个          $(document).ready()可以同时编写多个,并且都可以得到执行 3.简化写法 window.onload没有简化写法          $(documen

jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解

1.(function($) {…})(jQuery); 在(function($) {…})(jQuery)在内部定义的函数和变量只能在此范围内有效. 形成是否函数函数.私有变量的概念.比如: var i=3; function init(){ alert("外层init:"+i); } (function($) { var i=2; function init(){ alert("内层init:"+i); } init(); })(jQuery); init()

$(window).load(function(){}) 和 $(document).ready(function(){})的区别

在JavaScript中 window.onload = function(){ alert("text1"); }; 等同于在jQuery中 $(window).load(function(){ alert("text1"); }); 他们都是用于当页面的所有元素,包括外部引用文件,图片等都加载完毕时运行函数内的alert函数.load方法只能执行一次,如果在js文件里写了多个,只能执行最后一个.(初学者常常在页面结构里对元素直接写行为函数,这样是很丑陋的,可以用

比较body.onload(function())、$(document).ready(function())与$(windows).load(function)

原理对比: body.onload(function())是优先将document的DOM渲染,即将页面所有的元素(包括html标签以及所引用到的图片,flash媒体等媒体文件)加载完成,然后再执行页面的脚本: $(windows).load(function())的加载效果与body.onload(function())是一样的效果: $(document).ready(function())是优先对文档结构进行加载(不包括图片等非文字媒体文件),即优先加载HTML DOM,然后执行脚本. ★