lizhenqiu blog
最新评论流与站内评论搜索
Comment Stream
最新评论聚合
共 2955 条评论
Current Page
链接聚合
链接标签分页
Latest
评论流
第 136 / 148 页
当前展示 2701 - 2720 条,共 2955 条评论
Web前端的35个jQuery小技巧
一个完整的ajax包,包括了错误处理,超时处理等功能
使用Ajax
使用Ajax的步骤主要有:创建Ajax对象,Ajax对象打开连接,Ajax对象发送数据,Ajax获得响应。
1. 创建Ajax对象
不同的浏览器有着不同的创建方法,因此我们需要封装一个创建Ajax对象的方法,大部分标准浏览器都支持原生的XMLHttpRequest对象,因此我们首先检测是否存在XHR对象方法,存在则直接调用,否则我们定义一个XMLHttpRequest方法。
[javascript] view plaincopy
//自运行函数,用于创建XMLHttpRequest方法
(function() {
//存在原生的XHR,直接返回
if( typeof XMLHttpRequst !== 'undefined') {
return;
} else if( typeof ActiveXObject !== 'undefined') {//否则判断ActiveXObject
XMLHttpRequest = function() {
if( typeof arguments.callee.activeXString !== 'string') {
var versions = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
for(var i = 0, len = versions.length; i < len; ++i) {
try {
var xhr = new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
return xhr;
} catch(ex) {
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
};
} else{
XMLHttpRequest = function(){
throw new Error('No XHR object available');
};
}
})();
2. 打开连接
通过第1步的代码,我们可以首先创建一个AJAX对象: var xhr = new XMLHttpRequest(); 接着打开连接xml.open("GET", "/some/url.cgi", true);
当然,我们通过后台异步的发送请求,自然先要对请求参数进行序列化,以下是一个序列化函数:
[javascript] view plaincopy
//表单数据序列化,支持两种不同的对象:
//-表单输入元素的数组
//-键/值对的散列表
//返回串行化后的字符串
var serialize = function(a){
var s = [];
if(a instanceof Array){
for (var i=0, len = a.length; i<len; ++i) {
s.push(a[i].name + '=' + encodeURIComponent(a[i].value));
};
} else{
for(var k in a){
s.push(k + '=' + encodeURIComponent(a[k]));
}
}
return s.join('&');
};
3.发送请求
发送GET请求则可以按如下步骤:
[javascript] view plaincopy
<pre name="code" class="javascript"><pre name="code" class="javascript">var xhr = new XMLHttpRequest();
xhr.open('GET', "/some/url.cgi?"+serialize(data), true);
xhr.send(null); //参数null对某些浏览器来说是必须的
发送POST的请求则需要先设置请求头的MIME类型,通常是application/x-www-form-urlencoded, 一个简单的示例如下:
[javascript] view plaincopy
<pre name="code" class="javascript" style="margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; background-color: rgb(240, 240, 240); ">var xhr = new XMLHttpRequest();
xhr.open('POST', "/some/url.cgi?", true);
xhr.setRequestHeader("Content-Type","application/x-www-urlencoded");
xhr.send(serialize(data));
4. 处理HTTP响应
在收到响应后,响应的数据会自动填充XHR对象的属性:
responseText:作为响应主体被返回的文本
respinseXML: 如果响应的内容类型是"text/xml"或"application/xml",这个属性将保存包含着响应数据的XML DOM文档
status: 响应的HTTP状态
statusText:HTTP状态的说明
在接到响应后,第一步是检查status属性,以确定响应已经成功返回。一般来说,可以将HTTP状态代码为200作为成功标志,此外状态码304表示请求的资源没有被修改,可以直接使用浏览器中缓存的版本,因此应该检测这两种属性。
当收到响应时,可以检测XHR对象的readyState属性,该属性表示请求/响应过程中的当前活动状态,且当readyState属性的值由一个变成另一个时,会触发一次readyStatechange事件,可以利用这个事件来检测每次状态变化后的readyState的值。 readyState的值有以下几种:
0:未初始化。尚未调用open()方法。
1:启动。已经调用open()方法,但尚未调用send()方法。
2:发送。已经调用send()方法,但尚未收到响应。
3:接收。已经接收到部分响应数据。
4:完成。已经接收到全部响应数据,而且已经可以在客户端使用了。
另外,在IE8中,还为XHR对象添加了一个timeout属性,表示请求在等待响应多少毫秒后就终止,在给timeout设置一个数值后,如果在规定时间内浏览器还未收到响应,那么会触发一个timeout事件,进而会调用ontimeout事件处理程序。当然为了保持跨浏览器的运行,我们可以自行模拟一个超时响应。
有了以上的介绍,我们则可以开发出一个完整的ajax包,包括了错误处理,超时处理等功能。代码如下:
[javascript] view plaincopy
//一个封装好的ajax对象
var ajax = {};
//检查服务器HTTP响应的成功状态
ajax.httpSuccess = function(xhr){
return xhr.status >= 200 && xhr.status < 300 || xhr.status == 304;
};
//发起一个ajax请求,opt为传入的设置参数对象
ajax.request = function(opt){
//如果没有提供某个选项的值,就用默认值代替
opt = {
//请求方法
method: opt.method || "POST",
//请求的URL
url:opt.url || "",
//请求超时的时间
timeout: opt.timeout || 5000,
//请求失败、成功或完成(不管成功还是失败都会调用)时执行的函数
complete: opt.complete || function(){},
error: opt.error || function(){},
success: opt.success || function(){},
//发送的请求参数
params: opt.params || ""
};
var xhr = new XMLHttpRequest(), //创建xhr对象
timeout = opt.timeout,//保存超时时间,默认5秒
requestDone = false,//标志请求是否完成
params = XX.serialize(opt.params); //GET请求的话则将参数序列化接到url后面
if(params !== '' && opt.method === 'GET'){
params = '?' + params;
opt.url += params;
}
//初始化xhr
xhr.open(opt.method, opt.url, true);
//初始化一个5秒的回调函数,用于取消请求(如果尚未完成的话)
setTimeout(function(){
requestDone = true;
}, timeout);
//监听文档状态的更新
xhr.onreadystatechange = function(){
//保持等待,直到数据完全加载,并保证请求未超时
if(xhr.readyState == 4 && !requestDone){
if(XX.ajax.httpSuccess(xhr)){
//成功则调用回调函数,并传入xhr对象
opt.success(xhr, xhr.responseText)
} else {
//发生错误
opt.error();
}
//调用完成回调函数
opt.complete();
//避免内存泄漏,清理文档
xhr = null;
}
};
if(opt.method === 'POST'){
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(params); //若为POST请求,则需序列化数据
} else{
xhr.send(null);
}
};
成功的故事只能倒叙着讲
现在的人工智能太过于追求“像人“这一点上,这是个错误的方向
高中生不知道的13个科学事实
如果不抽气,一开始建立高真空,水进入高真空密闭环境又会怎样?
高中生不知道的13个科学事实
抽气降低压强到一定程度水就会沸腾。一边抽气,一边降低温度,到零度的时候,压强低到一定程度就开始沸腾,可这时候又是冰点,于是一边沸腾一边结冰
高中生不知道的13个科学事实
把猫和黄油面包绑在一起,从高处扔下去,猫会飞起来。
细数电影里那些酷炫的杀器
007: 俗话说,上梁不正下梁歪,你那些手下比你还贪婪,亏你还有脸站在忠党爱国这四个字的前面,中国有你这样的大魔头,老百姓是不会有好日子过的,我今天一定要为民除害。
司令:就凭你们两个废物……
文西:(把外衣一脱)废物?!我费了一生的精力,集合十种杀人武器于一身的超级武器霸王,名字就叫做要你命3000,终于研究成功了。阿七,靠边一点,远一点,再远一点。
司令:是吗?那我倒真想见识见识。
文西 要你命3000,(提出一串烂东西)西瓜刀、铁链、火药、硫酸、毒药、手枪、手榴弹、杀虫剂,每样都能独当一面,现在集中在一起,看你怕不怕?
司令:你这个老神经病,快点去死吧。
文西:哎等一等。(手一伸,没说完子弹穿透手臂,倒下。)
007:文西!
文西:阿七,全靠你了。
007:事到如今,没别的办法,(脱帽,脱外套)我只有单刀赴会。
细数电影里那些酷炫的杀器
行尸走肉瑞克的左轮
细数电影里那些酷炫的杀器
恐怖星球那个,让我想起了城市猎人里的将军
细数电影里那些酷炫的杀器
破坏力最大的大杀器应该是最新版《星球大战》里边可以跨星系发射的歼星炮
PHP导出数据库方法
常用html、demo代码
a标签的onclick与href的执行顺序
onclick的事件被先执行,其次是href中定义的(页面跳转或者javascript)
同时存在两个定义的时候(onclick与href都定义了),如果想阻止href的动作,在onclick必须加上return false;
在href中定义的函数如果有返回值的话,当前页面的内容将被返回值代替。
A标签触发onclick事件而不跳转
常用html、demo代码
yourphp
分页手机版本问题移动设备li
CSS技巧和经验
- CSS参考手册
- CSS探索之旅
- web前端实验室
- 测试li内部元素为设置了display:block的内联元素时底部产生空白
如上代码,IE6及更早浏览器每个li内部的内联元素底部都会产生空白。解决方案是给li内部的内联元素再加上zoom:1 如何解决IE6及更早浏览器下未定义宽度的浮动或绝对定位元素会被内部设置了zoom:1的块元素撑开的问题? BUG重现: #test{zoom:1;overflow:hidden;border:1px solid #ddd;background:#eee;} #test h1{float:left;} #test .nav{float:right;background:#aaa;} #test .nav ul{zoom:1;overflow:hidden;margin:0;padding:0;list-style:none;} #test .nav li{float:left;margin:0 5px;}Doyoe
如果我是相对定位,我的父元素overflow属性设置为auto|hidden将失效。如果你使用的是IE及更早浏览器,你将可以看到这个BUG
如果我是相对定位,我的父元素overflow属性设置为auto|hidden将失效。如果你使用的是IE及更早浏览器,你将可以看到这个BUG
CSS技巧和经验
常用html、demo代码
+Math.random();
js随机函数
提高PHP代码质量的36计
17. 不要直接使用 $_SESSION 变量。也可以公共文件中不同name区分,其他就不用改了:
session_name('MANAGER');
session_start();
19. 使用str_replace取代preg_replace 。使用strtr代替str_replace
为啥不能用行if?? $a && ++$a_count;呢
常用html、demo代码
父容器高度大于子图片高度的原因
div高度比图片高度大。
原因:img是inline元素,有假想元素。基于baseline定位时,父容器高度为假想元素的下半部分高度+图片高度。
解决方法:即消除假想元素影响。可以是 img { display: block; }; 可以是 div { line-height: 0}; 可以是img { vertical-align: middle//也可以是其他值 }; 可以是 div { font-size: 0};
我对“Hello World”30年的爱恨情仇
显示进度的效果好棒,是怎么做到的呀?
利用百度API(js)通过地址获取经纬度
可以使用方法:
BMapLib.GeoUtils.isPointInPolygon(point, polygon) Boolean
判断点是否多边形内
例子:
var _ppoints = [
new BMap.Point(120.220588,30.26135),
new BMap.Point(120.218863,30.258449),
new BMap.Point(120.222618,30.256702),
new BMap.Point(120.224748,30.25926),
new BMap.Point(120.220588,30.26135)];
var pppoint = new BMap.Point(120.222043,30.259197);
var result = BMapLib.GeoUtils.isPointInPolygon(pppoint, _ppolygon);
alert("result:"+result);
返回结果为 true;
另外我查找api ,判断一个点是否在可视范围内,
BMapLib.GeoUtils.isPointInRect(point, bounds) Boolean
判断点是否在矩形内
不管我怎么调,都是报错,报lng不存在,请遇到类似问题的兄弟指点一下。
利用百度API(js)通过地址获取经纬度
判断点是否在多边形内: