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
事件控制,而不在页面加载后绑定事件控制。这样就可以避免链接被点击时,事件还没有绑定的问题。