经常使用百度搜索的同学,一定不会忽视输入框的下拉索引,它是如此方便,然而得天独厚的条件使得这项异步技术多少面临些考验,高并发的服务端请求督促着他们的前端攻城师必须尽可能地减少发送ajax的次数。听起来似乎与本文无关,但并不是这样。首先就暂且让我们为百度免费做个广告吧。在百度首页输入“前端”一词,利用chromebug可以很轻松地看到所发送的响应,结果显示如下:
代码如下:
window.bdsug.sug({q:'前端';,p:false,s:['前端开发','前端工程师','前端总线','前端开发工程师','前端框架','前端总线频率','前端面试题','前端分析','前端开发工具','前端观察']});
百度试图通过返回一个带有obj参数的sug方法,来进行对下拉数据的渲染,当你在不刷新页面的情况下再次输入“前端”,类似的请求并没有发生,这说明他们很可能建立了一个缓存对象,它的作用是临时存储请求过来的object,当后面输入同样的词汇时,会首先检索缓存对象的键,匹配成功后,直接读取该对象的值,并不再向服务端发送请求,这样就可以有效地节约成本了。
抛砖引玉,接下来谈谈真正的主角:hasOwnProperty方法。
相信jser们对hasOwnProperty并不陌生,我在此也只是江边卖水了。
它是对象的专属,用来判断一个属性是否存在于某对象的键中,return的是一个boolean值。这是一个例子:
代码如下:
var test0 = Array.prototype.hasOwnProperty('split'); //false,因为数组不存在split方法
var test1 = String.prototype.hasOwnProperty('split'); //true,因为split是String对象的内置方法
当你知道这些的时候,似乎还不足以看到hasOwnProperty的作用力,那么下面简单地重现一下百度下拉的例子:
代码如下:
var data = {}, saveObj = function(val){
if(data.hasOwnProperty(val)){ //如果提交的值存在于data对象中,则不发送请求
var len = data[val].length;
for(var i = 0; i < len; i++){
console.log(data[val][i]);
}
}else{
var url = 'http://suggestion.baidu.com/su?wd=' + val;
$.ajax({ //为了示例清晰,此处用jquery的ajax为例
url : url + '&p=3&cb=window.bdsug.sug&sid=1421_1513_1541_1542_1582&t=1353756355137', //最后面一个参数t是一个时间戳
dataType : 'jsonp',
type : 'GET',
success : function(res){
var msg = res.data, len = msg.length;
msg == null && (msg = []);
if(len > 0){
data[val] = msg; //缓存搜索结果
for(var i = 0; i < len; i++){
新闻热点
疑难解答
图片精选