如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里
1、cookie的作用:
我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。
2、机制的区别:
session机制采用的是在服务器端保持状态的方案,而cookie机制则是在客户端保持状态的方案,cookie又叫会话跟踪机制。打开一次浏览器到关闭浏览器算是一次会话。说到这里,讲下HTTP协议,前面提到,HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。此时,服务器无法从链接上跟踪会话。cookie可以跟踪会话,弥补HTTP无状态协议的不足。
3、cookie的分类:
cookie分为会话cookie和持久cookie,会话cookie是指在不设定它的生命周期expires时的状态,前面说了,浏览器的开启到关闭就是一次会话,当关闭浏览器时,会话cookie就会跟随浏览器而销毁。当关闭一个页面时,不影响会话cookie的销毁。会话cookie就像我们没有办理积分卡时,单一的买卖过程,离开之后,信息则销毁。
持久cookie则是设定了它的生命周期expires,此时,cookie像商品一样,有个保质期,关闭浏览器之后,它不会销毁,直到设定的过期时间。对于持久cookie,可以在同一个浏览器中传递数据,比如,你在打开一个淘宝页面登陆后,你在点开一个商品页面,依然是登录状态,即便你关闭了浏览器,再次开启浏览器,依然会是登录状态。这就是因为cookie自动将数据传送到服务器端,在反馈回来的结果。持久cookie就像是我们办理了一张积分卡,即便离开,信息一直保留,直到时间到期,信息销毁。
4、简单的使用cookie的代码
cookie的几种常见属性:document.cookie="key=value;expires=失效时间;path=路径;domain=域名;secure;(secure表安全级别),
cookie以字符串的形式保存在浏览器中。下面贴段代码出来,是一个类似购物网站的将商品添加到购物车,再从购物车还原商品信息的过程,是自己用原生JS封装的函数。
封装的cookie的存入,读取以及删除的函数:(这里是将信息以对象的形式存放到cookie中的,会用到JSON的知识)
下面是商品详情页的JS代码
购物车还原商品信息:
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务
如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里
说到前端, 大家第一反应是不是都是vue、react、webpack等这些大大小小的框架或者工具, 但其实这些都是和js相关的, 真正的样式会被大家忽略。其实真正呈现给大家看到华丽的页面, 都是样式才让他们多了那份色彩。那么大家觉得简单的css样式, 真的简单么? 让我们一起来看下, 开启css的入坑之旅, 今天一起跟大家简单聊聊盒模型的相关问题......
百度知道对此的解释, 很有意思, 在此引用一下
CSS盒子模型, 内容(CONTENT)就是盒子里装的东西; 而填充(PADDING)就是怕盒子里装的东西(贵重的)损坏而添加的泡沫或者其它抗震的辅料; 边框(BORDER)就是盒子本身了; 至于边界(MARGIN)则说明盒子摆放的时候的不能全部堆在一起,要留一定空隙保持通风,同时也为了方便取出。 —— 百度知道
这段描述很有趣, 很好的解释margin、border、padding之间的关系, 不同模式下, 盒模型的width也是不同的, 那么好, 盒模型的第一个坑来了, width的范围问题。
通常浏览器里, 盒模型的分为两种模式, 两种模式(怪异模式和标准模式)下width和height的值不同, 怪异模式的width和height包含border、padding和content, 而标准模式下的width和height只包含content, 这就是为啥有些浏览器渲染出来的dom标签排版会乱。解决也很简单, 在标签的上面, 加上doctype的设置就好了, 让浏览器统一用同一种标准去解析页面。 怪异模式(左图)和标准模式(右图)的如下:
当然, 还有用来改变盒模型width范围的一个css3的属性,
当设置为'border-box'时, width = border + padding + content;
当设置为'content-box'时, width = content。
那么第一个div的实际宽度为100px, 第二个div的实际宽度为120px。
说完盒模型的padding和border, 那么再来吐槽下margin, 盒模型的margin的折叠(margin collapsing)问题, 有些也叫外边距合并。
通常我们说的折叠, 都是垂直方向上的折叠, 水平方向是不存在的。标准模式下, 上下两个兄弟的块级元素, margin是会重叠的, 并且以最大的那个间距为准(都为正数)。
比如下面这段代码:
上图灰色为重叠部分, 重叠10px的间距。
既然兄弟盒模型会有margin折叠, 那么父子呢? 答案是一定的, 父子也存在margin折叠的问题, 只不过条件稍微苛刻一点, 我们一起来看下。 父子组件的折叠触发, 要求不能有间隙, 就是父组件不能设置border或padding值, 不能有空余的内容, 且同时有margin值, 比如下面这段代码:
当然, 折叠后的空余部分, 也是取较大值, 且折叠触发, 只存在于垂直方向。
上图灰色为重叠部分, 重叠10px的间距。
刚才提到一个词"间隙", 如果有间隙的话是不会触发折叠的, 比如父级元素设置了padding, 或者子元素都设置了相对定位和top值等等。如下图:
看到这里, 我想有些同学会问了, 对于这些
Margins between a floated box and any other box do not collapse (not even between a float and its in-flow children).
Margins of elements that establish new block formatting contexts (such as floats and elements with 'overflow' other than 'visible') do not collapse with their in-flow children.
Margins of absolutely positioned boxes do not collapse (not even with their in-flow children).
Margins of inline-block boxes do not collapse (not even with their in-flow children).
The bottom margin of an in-flow block-level element always collapses with the top margin of its next in-flow block-level sibling, unless that sibling has clearance.
The top margin of an in-flow block element collapses with its first in-flow block-level child's top margin if the element has no top border, no top padding, and the child has no clearance.
The bottom margin of an in-flow block box with a 'height' of 'auto' and a 'min-height' of zero collapses with its last in-flow block-level child's bottom margin if the box has no bottom padding and no bottom border and the child's bottom margin does not collapse with a top margin that has clearance.
A box's own margins collapse if the 'min-height' property is zero, and it has neither top or bottom borders nor top or bottom padding, and it has a 'height' of either 0 or 'auto', and it does not contain a line box, and all of its in-flow children's margins (if any) collapse.
这是从W3C里引用的原文, 这8条规则是特殊的不折叠的情况, 简单翻译过来(仅供参考):
浮动的盒模型不会margin折叠
创建BFC与子不折叠
设置定位的盒模型不会折叠
行内块级元素的盒模型不折叠
兄弟元素有间隙不折叠
父子盒模型元素, 孩子元素有border、padding、有浮动就不折叠
height为auto、min-height为0的块级盒模型, 和它的最后一个没有border和padding的孩子盒模型底边距折叠, 且孩子的底部外边距和被清除浮动上边距有间隙不折叠。
如果min-height为0, 上下border、上下padding都为0, height为0或auto, 且没有行内盒模型, 他的孩子节点都会折叠
有点晦涩难懂, 大家不妨消化一下。说到这, 再补充一下, 盒模型margin折叠的计算问题, 总结了以下几点:
同为正值时, 取较大者为两者为间距
一正一负时, 正负相加为间距, 若结果为负值, 则两者部分重合
都为负值时, 两者重合, 且重合部分为绝对值大者
举个例子:
两者都为负值, 两个div上下重合, 且重合间距为15px。
暂时就想到这么多, css的学习之路任重而道远, 盒模型又是重中之重。上面有描述不对的地方也欢迎各位同学批评指正, 也欢迎大家来到大转转FE做客, 一起讨论一起研究前端的技术问题。志同道合的同学, 也欢迎加入我们转转FE团队, 咱们一起打拼。
盒模型
box-sizing
:
<div class="wrapper z1"></div>
<div class="wrapper z2"></div>
.wrapper{
width: 100px;
height: 50px;
padding: 10px;
background-color: #dedede;
}
.z1{
box-sizing: border-box;
}
.z2{
box-sizing: content-box;
}
<div class="wrapper"></div>
<div class="wrapper"></div>
.wrapper{
width: 100px;
height: 50px;
margin: 10px;
background-color: #dedede;
}
<div class="outer">
<div class="inner"></div>
</div>
.outer{
width: 200px;
height: 100px;
margin: 10px;
background-color: #dedede;
}
.inner{
width: 100px;
height: 50px;
margin: 10px;
background-color: #bcbcbc;
}
margin collapsing
, 有没有一个统一的整理, 对于大转转的FEer, 我们当然想到了大家的前面, 请看下面:
<div class="wrapper z-01"></div>
<div class="wrapper z-02"></div>
.wrapper{
width: 100px;
height: 50px;
background-color: #dedede;
}
.z-01{
margin: -10px;
}
.z-02{
margin: -15px;
}
如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里
代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。
(可以想象一下明星与经纪人的关系,明星是请求的本体,经纪人就是代理proxy)
代理对象内部含有对本体对象的引用,因而可以与调用本体的相关方法;同时,代理对象提供与本体对象相同的接口,方便在任何时刻代理本体对象。
代理模式的变体有很多,有:保护代理、虚拟代理、缓存代理、防火墙代理、远程代理、智能引用代理、写时复制代理。具体介绍前三种。
(1)保护代理
保护代理主要用于控制不同权限的对象对本体对象的访问权限。比如很多人想访问本体A,如果有代理B存在的话,B会首先剔除不满足A的访问条件的访问者,符合条件的才能访问。
作用:过滤请求
例如:权限的划分和管理就是使用保护代理proxy来完成的。
注册普通用户:code为“001”
论坛管理者 :code为“002”
系统管理者 :code为“003”
游 客 :code为“000”
论坛开放了四个基础功能
1,发帖
2,帖子审核
3,清除帖子
4,留言
游客不具备任何操作权限,注册用户只能发帖,论坛管理者可以审核以及删帖操作,系统管理者具有所有功能权限。
在该例子中,论坛代理有与user本体相同的接口,可以在满足条件时,执行与本体相同的代码,与调用方法的人而言,是不透明的,我实现了调用,但不在乎是通过代理实现的,还是本体实现的。
本案例来源:大熊君大话设计模式JavaScript
(2)虚拟代理
虚拟代理是将调用本体方法的请求进行管理,等到本体适合执行时,再执行。
作用:将开销很大的对象,延迟到真正需要它的时候再执行。
比如:利用虚拟代理实现图片预加载功能:
比如:利用虚拟代理合并HTTP请求
在这些例子中,虚拟代理对请求进行搁置处理,等到合适的时机,对本体的接口进行调用,可以有效提升Web性能。
(3)缓存代理
缓存代理可以为开销大的一些运算结果提供暂时性的存储,如果再次传进相同的参数是,直接返回结果,避免大量重复计算。
什么情况下使用代理
当我们需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy)。例如:如果构建一个对象很耗费时间和计算机资源,代理模式(Proxy)允许我们控制这种情况,直到我们需要使用实际的对象。一个代理(Proxy)通常包含和将要使用的对象同样的方法,一旦开始使用这个对象,这些方法将通过代理(Proxy)传递给实际的对象。
比如上面的代码:需要花很长的时间加载很多图片,复杂的运算过程,频繁的多次请求处理等;都可以用到代理模式。
小结
代理模式的一个好处就是对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操作行为,从而可以在不影响外部调用情况下,进行系统扩展。也就是说,我要修改真实角色的操作的时候,尽量不要修改他,而是在外部在“包”一层进行附加行为,即代理类。
什么是代理模式
如何实现代理模式
例子(上代码)
"这是移动端界面设计规范尺寸安卓篇也是第二篇小总结,主讲如何一稿去适配众多的安卓机型。如果你有兴趣也可以去官方研读下设计文档,这样的话,就可以比较系统的掌握知识。
每次QQ有新的重要版本发布时,移动端的介绍使用了HTML5页面,通过7个独立的页面简洁地介绍了它的主要功能。在每个页面切换时伴随着背景图片的切换,让介绍页面生动有趣。
如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里
说到前端, 大家第一反应是不是都是vue、react、webpack等这些大大小小的框架或者工具, 但其实这些都是和js相关的, 真正的样式会被大家忽略。其实真正呈现给大家看到华丽的页面, 都是样式才让他们多了那份色彩。那么大家觉得简单的css样式, 真的简单么? 让我们一起来看下, 开启css的入坑之旅, 今天一起跟大家简单聊聊盒模型的相关问题......
百度知道对此的解释, 很有意思, 在此引用一下
CSS盒子模型, 内容(CONTENT)就是盒子里装的东西; 而填充(PADDING)就是怕盒子里装的东西(贵重的)损坏而添加的泡沫或者其它抗震的辅料; 边框(BORDER)就是盒子本身了; 至于边界(MARGIN)则说明盒子摆放的时候的不能全部堆在一起,要留一定空隙保持通风,同时也为了方便取出。 —— 百度知道
这段描述很有趣, 很好的解释margin、border、padding之间的关系, 不同模式下, 盒模型的width也是不同的, 那么好, 盒模型的第一个坑来了, width的范围问题。
通常浏览器里, 盒模型的分为两种模式, 两种模式(怪异模式和标准模式)下width和height的值不同, 怪异模式的width和height包含border、padding和content, 而标准模式下的width和height只包含content, 这就是为啥有些浏览器渲染出来的dom标签排版会乱。解决也很简单, 在标签的上面, 加上doctype的设置就好了, 让浏览器统一用同一种标准去解析页面。 怪异模式(左图)和标准模式(右图)的如下:
当然, 还有用来改变盒模型width范围的一个css3的属性,
当设置为'border-box'时, width = border + padding + content;
当设置为'content-box'时, width = content。
那么第一个div的实际宽度为100px, 第二个div的实际宽度为120px。
说完盒模型的padding和border, 那么再来吐槽下margin, 盒模型的margin的折叠(margin collapsing)问题, 有些也叫外边距合并。
通常我们说的折叠, 都是垂直方向上的折叠, 水平方向是不存在的。标准模式下, 上下两个兄弟的块级元素, margin是会重叠的, 并且以最大的那个间距为准(都为正数)。
比如下面这段代码:
上图灰色为重叠部分, 重叠10px的间距。
既然兄弟盒模型会有margin折叠, 那么父子呢? 答案是一定的, 父子也存在margin折叠的问题, 只不过条件稍微苛刻一点, 我们一起来看下。 父子组件的折叠触发, 要求不能有间隙, 就是父组件不能设置border或padding值, 不能有空余的内容, 且同时有margin值, 比如下面这段代码:
当然, 折叠后的空余部分, 也是取较大值, 且折叠触发, 只存在于垂直方向。
上图灰色为重叠部分, 重叠10px的间距。
刚才提到一个词"间隙", 如果有间隙的话是不会触发折叠的, 比如父级元素设置了padding, 或者子元素都设置了相对定位和top值等等。如下图:
看到这里, 我想有些同学会问了, 对于这些
Margins between a floated box and any other box do not collapse (not even between a float and its in-flow children).
Margins of elements that establish new block formatting contexts (such as floats and elements with 'overflow' other than 'visible') do not collapse with their in-flow children.
Margins of absolutely positioned boxes do not collapse (not even with their in-flow children).
Margins of inline-block boxes do not collapse (not even with their in-flow children).
The bottom margin of an in-flow block-level element always collapses with the top margin of its next in-flow block-level sibling, unless that sibling has clearance.
The top margin of an in-flow block element collapses with its first in-flow block-level child's top margin if the element has no top border, no top padding, and the child has no clearance.
The bottom margin of an in-flow block box with a 'height' of 'auto' and a 'min-height' of zero collapses with its last in-flow block-level child's bottom margin if the box has no bottom padding and no bottom border and the child's bottom margin does not collapse with a top margin that has clearance.
A box's own margins collapse if the 'min-height' property is zero, and it has neither top or bottom borders nor top or bottom padding, and it has a 'height' of either 0 or 'auto', and it does not contain a line box, and all of its in-flow children's margins (if any) collapse.
这是从W3C里引用的原文, 这8条规则是特殊的不折叠的情况, 简单翻译过来(仅供参考):
浮动的盒模型不会margin折叠
创建BFC与子不折叠
设置定位的盒模型不会折叠
行内块级元素的盒模型不折叠
兄弟元素有间隙不折叠
父子盒模型元素, 孩子元素有border、padding、有浮动就不折叠
height为auto、min-height为0的块级盒模型, 和它的最后一个没有border和padding的孩子盒模型底边距折叠, 且孩子的底部外边距和被清除浮动上边距有间隙不折叠。
如果min-height为0, 上下border、上下padding都为0, height为0或auto, 且没有行内盒模型, 他的孩子节点都会折叠
有点晦涩难懂, 大家不妨消化一下。说到这, 再补充一下, 盒模型margin折叠的计算问题, 总结了以下几点:
同为正值时, 取较大者为两者为间距
一正一负时, 正负相加为间距, 若结果为负值, 则两者部分重合
都为负值时, 两者重合, 且重合部分为绝对值大者
举个例子:
两者都为负值, 两个div上下重合, 且重合间距为15px。
暂时就想到这么多, css的学习之路任重而道远, 盒模型又是重中之重。上面有描述不对的地方也欢迎各位同学批评指正, 也欢迎大家来到大转转FE做客, 一起讨论一起研究前端的技术问题。志同道合的同学, 也欢迎加入我们转转FE团队, 咱们一起打拼。
盒模型
box-sizing
:
<div class="wrapper z1"></div>
<div class="wrapper z2"></div>
.wrapper{
width: 100px;
height: 50px;
padding: 10px;
background-color: #dedede;
}
.z1{
box-sizing: border-box;
}
.z2{
box-sizing: content-box;
}
<div class="wrapper"></div>
<div class="wrapper"></div>
.wrapper{
width: 100px;
height: 50px;
margin: 10px;
background-color: #dedede;
}
<div class="outer">
<div class="inner"></div>
</div>
.outer{
width: 200px;
height: 100px;
margin: 10px;
background-color: #dedede;
}
.inner{
width: 100px;
height: 50px;
margin: 10px;
background-color: #bcbcbc;
}
margin collapsing
, 有没有一个统一的整理, 对于大转转的FEer, 我们当然想到了大家的前面, 请看下面:
<div class="wrapper z-01"></div>
<div class="wrapper z-02"></div>
.wrapper{
width: 100px;
height: 50px;
background-color: #dedede;
}
.z-01{
margin: -10px;
}
.z-02{
margin: -15px;
}
如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里
Ajax的核心是XMLHttpRequest对象(发送异步请求、接受响应及执行回调),它是ajax实现的关键
XMLHttpRequest对象的open()方法与send()方法
方法 | 描述 |
---|---|
open(method,url,async) |
规定请求的类型、URL 以及是否异步处理请求。
|
send(string) |
将请求发送到服务器。
|
请求类型,GET 还是 POST?
与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。
然而,在以下情况中,请使用 POST 请求:
(1). GET请求
(2). POST请求
方法 | 描述 |
---|---|
setRequestHeader(header,value) |
向请求添加 HTTP 头。
|
async参数设置
XMLHttpRequest对象如果要用于AJAX的话,其open()方法的async参数必须设置为true
通过 AJAX,JavaScript 无需等待服务器的响应,而是:
(1). 当使用 async=true 时,请规定在响应处于 onreadystatechange 事件中的就绪状态时执行的函数:
(2). 当您使用 async=false 时,请不要编写 onreadystatechange 函数 - 把代码放到 send() 语句后面即可:
服务器响应
使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。
属性 | 描述 |
---|---|
responseText | 获得字符串形式的响应数据。 |
responseXML | 获得 XML 形式的响应数据。 |
(1). 如果来自服务器的响应并非 XML,请使用 responseText 属性。
responseText 属性返回字符串形式的响应,因此您可以这样使用:
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
(2). 如果来自服务器的响应是 XML,而且需要作为 XML 对象进行解析,请使用 responseXML 属性
[javascript] view plain copy
- xmlDoc=xmlhttp.responseXML;
- txt="";
- x=xmlDoc.getElementsByTagName("ARTIST");
- for (i=0;i<x.length;i++)
- {
- txt=txt + x[i].childNodes[0].nodeValue + "<br />";
- }
- document.getElementById("myDiv").innerHTML=txt;
当请求被发送到服务器时,我们需要执行一些基于响应的任务。
每当 readyState 改变时,就会触发 onreadystatechange 事件。readyState 属性存有 XMLHttpRequest 的状态信息。
下面是 XMLHttpRequest 对象的三个重要的属性:
属性 | 描述 |
---|---|
onreadystatechange | 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。 |
readyState |
存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
|
status |
200: "OK" 404: 未找到页面 |
Ajax()函数示例:
[javascript] view plain copy
- function Ajax(){
- //code
- }
[javascript] view plain copy
- var xmlHttpReq = null;
[javascript] view plain copy
- if(window.ActiveXObject){
- xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
- }else if(window.XMLHttpRequest){
- xmlHttpReq = new XMLHttpRequest();
- }
IE5、IE6是以ActiveXObject的方式引入XMLHttpRequest对象的,而其他浏览器的XMLHttpRequest对象是window的子对象。
[javascript] view plain copy
- xmlHttpReq.open("GET","test.php",true);
[javascript] view plain copy
- xmlHttpReq.onreadystatechange = RequestCallBack;
[javascript] view plain copy
- xmlHttpReq.send(null);
当请求改变时,XMLHttpRequest对象调用onreadystatechange属性注册的事件处理器,因此在处理该响应前,事件处理器首先应该检查readyState的值和HTTP的状态。当请求完成加载时(readyState==4)并且已经响应成功(status==200)时,就可以调用JavaScript函数来处理该响应内容。
[javascript] view plain copy
- function RequestCallBack(){
- if (xmlHttpReq.readyState == 4) {
- if (xmlHttpReq.status == 200) {
- //将xmlHttpReq.responText的值赋予id为resText的元素
- document.getElementById('resText').innerHTML = xmlHttpReq.responText;
- }
- }
- }
jQuery对Ajax操作进行了封装,在jQuery中$.ajax()方法属于最底层的方法,第2层是load()、$.get()、$.post()方法,第3层是$.getScript()、$.getJSON()方法
1、load()方法 通常用来从WEB服务器上获取静态的数据文件
最常用的Ajax方法,能载入远程HTML代码并插入DOM中
load(url[,data][,callback]);
- url:String 请求HTML页面的URL地址
- data:Object 发送至服务器的key/value数据
- callback:Function 请求完成时的回调函数,无论请求成功或失败
[javascript] view plain copy
- $(function(){
- $("#send").click(function(){
- $("#resText").load("test.html");
- })
- })
[javascript] view plain copy
- <button type="button" id="send">ajax加载</button>
- <div class="comment">已有评论:</div>
- <div id="resText">替换内容</div>
test.html代码为:
[javascript] view plain copy
- <div class="comment">
- <h6>张三:</h6>
- <p class="para">沙发</p>
- </div>
- <div class="comment">
- <h6>李四:</h6>
- <p class="para">板凳</p>
- </div>
- <div class="comment">
- <h6>王五:</h6>
- <p class="para">地板</p>
- </div>
筛选载入的HTML文档
load()方法的URL参数的语法结构为:“url selector”
[javascript] view plain copy
- $("#resText").load("test.html .para");
load()传递方式根据参数data自动指定,没有参数 --> GET,反之为POST
[javascript] view plain copy
- // 无参数传递 GET
- $("#resText").load("test.html",function(){
- //code
- });
- // 有参数传递 POST
- $("#resText").load("test.html",{name:"rain",age:"22"},function(){
- //code
- });
回调函数:有三个参数,请求返回的内容、请求状态、XMLHttpRequest对象
[javascript] view plain copy
- // 回调函数
- $("#resText").load("test.html",function(responseText,textStatus,XMLHttpRequest){
- //responseText 请求返回的内容
- //textStatus 请求状态:success、error、notmodified、timeout
- //XMLHttpRequest XMLHttpRequest对象
- });
2、$.get()和$.post()方法 jQuery中的全局函数
2.1 $.get() 使用GET方式来进行异步请求
[javascript] view plain copy
- $.get(url[,data][,callback][,type]);
- url:String 请求HTML页面的URL地址
- data:Object 发送至服务器的key/value数据会作为QueryString附加到请求URL中
- callback:Function 载入成功时回调函数(只有当response的返回状态是success才调用该函数)自动将请求结果和状态传递给该方法
- type:服务器返回内容的格式,包括html、xml、script、json、text、_default
[javascript] view plain copy
- $("#send").click(function(){
- $.get("get1.php",{
- username:$("#username").val(),
- content:$("#comment").val()
- },function(data,textStatus){
- // data:返回的内容
- // textStatus:请求状态,success、error、notmodified、timeout
- })
- })
数据格式:服务器返回的数据格式
(1)HTML片段 较少工作量
[javascript] view plain copy
- $.get("get1.php",{
- username:$("#username").val(),
- content:$("#comment").val()
- },function(data,textStatus){
- // data:返回的内容
- // textStatus:请求状态,success、error、notmodified、timeout
- $("#resText").html(data); //将返回的数据添加到页面上
- });
(2) XML文档 需要对返回的数据处理
方便使用
可以通过attr()、find()、filter()方法对数据进行处理
由于期待服务器返回的数据类型为XML文档,因此需要在服务期端设置Content-Type类型[javascript] view plain copy
- $("#send").click(function(){
- $.get("get1.php", {
- username : $("#username").val() ,
- content : $("#content").val()
- }, function (data, textStatus){
- var username = $(data).find("comment").attr("username");
- var content = $(data).find("comment content").text();
- var txtHtml = "<div class='comment'><h6>"+username
- +":</h6><p class='para'>"+content+"</p></div>";
- $("#resText").html(txtHtml); // 把返回的数据添加到页面上
- });
- })
[javascript] view plain copy
- header("Content-Type:text/html; charset=utf-8");
(3)JSON文件 需要对返回的数据处理
JSON相对于XML比较简洁
[javascript] view plain copy
- $("#send").click(function(){
- $.get("get3.php", {
- username : $("#username").val() ,
- content : $("#content").val()
- }, function (data, textStatus){
- var username = data.username;
- var content = data.content;
- var txtHtml = "<div class='comment'><h6>"+username
- +":</h6><p class='para'>"+content+"</p></div>";
- $("#resText").html(txtHtml); // 把返回的数据添加到页面上
- },"json");
- })
以上三种方法对比:
HTML返回数据最简单,如果数据需要重用使用JSON(性能与文件大小方面有优势),当远程程序未知时使用XML。
2.2 $.post() 通过 HTTP POST 请求从服务器上请求数据
[javascript] view plain copy
- $.post(URL[,data][,callback]);
- url:String 请求的URL地址
- data:Object 发送至服务器的key/value数据
- callback:Function 载入成功时的回调函数
由于POST和GET方式提交的所有数据都可以通过$_REQUEST[]来获取,因此只需要改变jQuery函数,就可以将程序在GET请求和POST请求之间切换。
![]()
当load()方法带有参数传递时,会使用POST方式发送请求。因此也可以使用load()方法来完成同样的功能。
![]()
$.post()与$.get()方法的区别:
- GET请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给Web服务器。当然,在Ajax请求中,这种区别对用户是不可见的。
- GET方式对传输的数据有大小限制(通常不能大于2KB),而使用POST方式传递的数据量要比GET方式大得多(理论上不受限制)。
- GET方式请求的数据会被浏览器缓存起来,因此其他人就可以从浏览器的历史记录中读取到这些数据,例如账号和密码等。在某种情况下,GET方式会带来严重的安全性问题,而POST方式相对来说就可以避免这些问题。
- GET方式和POST方式传递的数据在服务器端的获取也不相同。在PHP中,GET方式的数据可以用$_GET[]获取,而POST方式可以用$_POST[]获取。两种方式都可以用$_REQUEST[]来获取。
上面使用load()、$.get()和$.post()方法完成了一些常规的Ajax程序,如果还需要编写一些复杂的Ajax程序,那么就要用到jQuery中的$.ajax()方法。$.ajax()方法不仅能实现与load()、$.get()和$.post()方法同样的功能,而且还可以设定beforeSend(提交前回调函数)、error(请求失败后处理)、success(请求成功后处理)以及complete(请求完成后处理)回调函数,通过这些回调函数,可以给用户更多的Ajax提示信息。另外,还有一些参数,可以设置Ajax请求的超时时间或者页面的“最后更改”状态等。
3、$.getScript()和$.getJSON()方法
3.1 $.getScript()
有时候,在页面初次加载时就取得所需的全部JavaScript文件是完全没有必要的。虽然可以在需要哪个JavaScript文件时,动态地创建<script>标签
上述方法不理想,jQuery又提供了$.getScript()方法[javascript] view plain copy
- $(document.createElement("script").attr("src","test.js")).appenChild("head");
- //或
- $("<script type='text/javscript' src='test.js'></script>").appendChild("head");
有回调函数[javascript] view plain copy
- $(function(){
- $("#btn").click(function(){
- $.getScript("test.js");
- })
- })
[javascript] view plain copy
- $.getScript("test.js",function(){
- $(element).click(function(){
- $(element).animate({backgroundcolor:'pink'},1000)
- .animate({backgroundcolor:'coral'},1000);
- })
- });
3.2 $.getJSON()方法 用于加载JSON文件,用法同$.getScript()方法
[javascript] view plain copy
- $(function(){
- $("#btn").click(function(){
- $.getJSON("test.json");
- })
- })
上面函数虽然加载了JSON代码,但是并没有告诉JS对返回的数据如何处理,所以需要回调函数
[javascript] view plain copy
- $(function(){
- $("#btn").click(function(){
- $.getJSON("test.json",function(){
- //data:返回的数据
- });
- })
- })
jQuery遍历方法 --> $.each()方法 遍历对象和数组
$.each(data,callback) // 为全局函数 不同于each()方法
- data:数组或对象
- callback:回调函数,有两个参数(对象的成员或数组的索引,对应变量或内容)
![]()
4、$.ajax()方法 jQuery最底层的Ajax实现
$.ajax(options);
参数名称 | 类型 | 说明 |
---|---|---|
url | String | (默认为当前页地址)发送请求的地址 |
type | String |
请求方式(POST/GET)默认GE 注意其他HTTP请求方法,例如PUT和DELETE,仅部分浏览器支持 |
timeout | Number |
设置请求超时时间(毫秒) 此设置将覆盖$.ajaxSetup()方法的全局设置 |
data | Object/String |
发送到服务器的数据。如果已经不是字符串,将自动转换为字符串格式。 GET请求中将附加在URL后。防止这种自动转换,可以查看processData选项。 对象必须为key/value格式 例如:{foo1:"bar1",foo2:"bar2"}转换为&foo1=bar1&foo2=bar2。 如果是数组,jQuery将自动为不同的值对应同一个名称 例如:{foo:["bar1","bar2"]}转换为&foo=bar1&foo=bar2 |
dataType | String |
预期服务器返回的数据类型。 如果不指定,jQuery将自动根据HTTP包MIME信息返回responseXML或responseText, 并作为回调函数参数传递。 可用类型, xml:返回XML文档,可用jQuery处理 html:返回纯文本HTML信息,包含的script标签会在插入DOM是执行 script:返回纯文本的JavaScript代码,不会自动缓存结果。除非设置cache参数 注意在远程请求时(不在同一个域下),所有POST请求都将转换为GET请求 json:返回json数据 jsonp:jsonp格式,使用jsonp形式调用参数时,myurl?callback=? jQuery:将自动替换后一个“?”为正确的函数名,以执行回调函数 text:返回纯文本字符串 |
beforeSend | Function |
发送请求前可以修改XMLHttpRequest对象的函数例如添加自定义HTTP头。 在beforeSend中如果返回false可以取消本次Ajax请求。XMLHttpRequest对象是唯一的函数 function(XMLHttpRequest){ this;//调用本次Ajax请求时传递的options参数 } |
complete | Function |
请求完成后调用的函数(请求成功或失败时均调用) 参数:XMLHttpRequest对象和一个描述成功请求类型的字符串 function(XMLHttpRequest,textStatus){
this;//调用本次Ajax请求时传递的options参数 } |
success | Function |
请求完成后调用的函数(请求成功或失败时均调用) 参数:(1) 由服务器返回,并根据datatype参数进行设置 (2) 描述状态的字符串 function(XMLHttpRequest,textStatus){ //data可能是XMLDoc、jsonObj、html、text等
this;//调用本次Ajax请求时传递的options参数 } |
error | Function |
请求失败时被调用的函数 参数:(1) XMLHttpRequest对象 (2) 错误信息
(3) 捕获的错误对象(可选) function(XMLHttpRequest,textStatus,errorThrown){ //通常情况下textStatus和errorThrown只有其中一个包含信息
this;//调用本次Ajax请求时传递的options参数 } |
global | Boolean |
默认为true。表示是否触发全局Ajax事件。设置为false将不会触发全局Ajax事件 AjaxStart或AjaxStop可用于控制各种Ajax事件 |
前面用到的$.load()、$.get()、$.post()、$.getScript()和$.getJSON()这些方法,都是基于$.ajax()方法构建的,$.ajax()方法是jQuery最底层的Ajax实现,因此可以用它来代替前面的所有方法。
[javascript] view plain copy
- $(function(){
- $("#btn").click(function(){
- $.getScript("test.js");
- })
- })
可被替换为
[javascript] view plain copy
- $(function(){
- $("#btn").click(function(){
- $.ajax({
- type:"GET",
- url:"test.js",
- dataType:"script"
- });
- });
- })
[javascript] view plain copy
- $(function(){
- $("#btn").click(function(){
- $.getJSON("test.json",function(data){
- $("#resText").empty();
- var html = " ";
- $.each(data,function(commentIndex,comment){
- html+='<div class="comment"><h6>'+comment['username']
- +'</h6><p class="para">'+comment['content']
- +'</p></div>'
- })
- $("resText").html(html);
- }
- });
- });
- })
可被替换为
[javascript] view plain copy
- $(function(){
- $("#btn").click(function(){
- $.ajax({
- type:"GET",
- url:"test.json",
- dataType:"json",
- success:function(data){
- $("#resText").empty();
- var html = " ";
- $.each(data,function(commentIndex,comment){
- html+='<div class="comment"><h6>'+comment['username']
- +'</h6><p class="para">'+comment['content']
- +'</p></div>'
- })
- $("resText").html(html);
} }); });
- })
1.serialize()方法
异步提交表单,并将服务器返回的数据显示到当前页面中
[javascript] view plain copy
- $.get("get1.php",{
- username:$("#username").val(),
- content:$("#comment").val()
- },function(data,textStatus){
- // data:返回的内容
- // textStatus:请求状态,success、error、notmodified、timeout
- $("#resText").html(data); //将返回的数据添加到页面上
- });
serialize()方法也是作用于一个jQuery对象,它能够将DOM元素内容序列化为字符串,用于Ajax请求。可将上述代码简化为:
[javascript] view plain copy
- $.get("get1.php",$("#form1").serialize(),function(data,textStatus){
- // data:返回的内容
- // textStatus:请求状态,success、error、notmodified、timeout
- $("#resText").html(data); //将返回的数据添加到页面上
- });
serialize()方法作用于jQuery对象,所以不光只有表单能使用它,其他选择器选取的元素也都能使用它,如以下jQuery代码:
[javascript] view plain copy
- $(":checkbox,:radio").serialize();
把复选框和单选框的值序列化为字符串形式,只会将选中的值序列化。
2.serializeArray()方法
该方法不是返回字符串,而是将DOM元素序列化后,返回JSON格式的数据
![]()
3.$.param()方法
它是serialize()方法的核心,用来对一个数组或对象按照key/value进行序列化。
比如将一个普通的对象序列化:
![]()
四、jQuery中的全局事件
jQuery简化Ajax操作不仅体现在调用Ajax方法和处理响应方面,而且还体现在对调用Ajax方法的过程中的HTTP请求的控制。通过jQuery提供的一些自定义全局函数,能够为各种与Ajax相关的事件注册回调函数。例如当Ajax请求开始时,会触发ajaxStart()方法的回调函数;当Ajax请求结束时,会触发ajaxStop()方法的回调函数。这些方法都是全局的方法,因此无论创建它们的代码位于何处,只要有Ajax请求发生时,就会触发它们。
有时,当网页加载过慢时,就需要为网页添加一个提示信息,常用的提示信息是“加载中…”,代码如下:
然后通过CSS控制元素隐藏,当Ajax请求开始的时候,将此元素显示,用来提示用户Ajax请求正在进行。当Ajax请求结束后,将此元素隐藏。[javascript] view plain copy
- <div class="loading">加载中...</div>
[javascript] view plain copy
- $("$loading").ajaxStart(function(){
- $(this).show();
- }).ajaxStop(function(){
- $(this).hide();
- });
jQuery的Ajax全局事件中还有几个方法,也可以在使用Ajax方法的过程中为其带来方便。
方法名称 说明 ajaxComplete(callback) Ajax请求完成时执行的函数 ajaxError(callback) Ajax请求发生错误时执行的函数,捕捉到的错误可以作为最后一个参数传递 ajaxSend(callback) Ajax请求发送前执行的函数 ajaxSuccess(callback) Ajax请求成功时执行的函数 注意:
1,如果想使某个Ajax请求不受全局方法的影响,那么可以在使用$.ajax(options)方法时,将参数中的global设置为false,jQuery代码如下
[javascript] view plain copy
- $.ajax({
- url:"test.html",
- global:false
- });
2,在jQuery1.5版本之后,如果Ajax请求不触发全局方法,那么可以设置:
[javascript] view plain copy
- $.ajaxPrefilter(function(options){
- options.global = true;
- })
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务
如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里
效果图
-----------------------------------------------------------------------更新---------------------------------------------------------
去掉连续显示多个点,每次只显示一个点
涉及setInterval传参的问题。
发现用addMarker(jdata.data[i].gpsx,jdata.data[i].gpsy);时程序可正常运行,但是将该函数 放到setInterval中后却出现了问题,可通过闭包解决。
<?php echo <<<_END <!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
<title>点标记</title>
<link rel="stylesheet" href="http://cache.amap.com/lbs/static/main1119.css"/>
<style>
.marker {
color: #ff6600; padding: 4px 10px;
border: 1px solid #fff; white-space: nowrap;
font-size: 12px;
font-family: "";
background-color: #0066ff; } </style>
<script src="http://webapi.amap.com/maps?v=1.3&key=您申请的key值"></script>
<script type="text/javascript" src="http://cache.amap.com/lbs/static/addToolbar.js"></script>
</head>
<body>
<div id="container"></div>
<script> var marker, map = new AMap.Map("container", {
resizeEnable: true, center: [126.60580555556, 45.702363888889], zoom: 13 }); var getJSON = function(url) { return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest();
xhr.open('get', url, true);
xhr.responseType = 'json';
xhr.onload = function() { var status = xhr.status; if (status == 200) {
resolve(xhr.response);
} else {
reject(status);
}
};
xhr.send();
});
};
getJSON('http://web.cellpies.com/api/driving/getVehicleLocationPoints?vehicleDeviceId=0400000000030603&timeType=4&startTime=2017-03-17%2013:00:00&stopTime=2017-03-17%2014:00:00').then(function(jdata) { //alert('Your Json result is: ' + jdata); //you can comment this, i used it to debug
//alert(jdata.data[0].gpsx);
//alert(jdata.data[0].gpsy); window.i=0; //addMarker(jdata.data[i].gpsx,jdata.data[i].gpsy); setInterval(function () { addMarker(jdata.data[window.i].gpsx,jdata.data[window.i].gpsy); },"1000");
}, function(status) { //error detection.... alert('Something went wrong.');
}); // 实例化点标记 function addMarker(v1,v2) {
window.i+=10;
marker = new AMap.Marker({
icon: "http://webapi.amap.com/theme/v1.3/markers/n/mark_b.png", position: [v1,v2]
});
marker.setMap(map);
} </script>
</body>
</html>
</script>
</body>
</html> _END; ?>
<?php echo<<<_END <!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
<title>点标记</title>
<link rel="stylesheet" href="http://cache.amap.com/lbs/static/main1119.css"/>
<style>
.marker {
color: #ff6600; padding: 4px 10px;
border: 1px solid #fff; white-space: nowrap;
font-size: 12px;
font-family: "";
background-color: #0066ff; } </style>
<script src="http://webapi.amap.com/maps?v=1.3&key=您申请的key值"></script>
<script type="text/javascript" src="http://cache.amap.com/lbs/static/addToolbar.js"></script>
</head>
<body>
<div id="container"></div>
<script> var marker, map = new AMap.Map("container", {
resizeEnable: true, center: [126.60580555556, 45.702363888889], zoom: 13 }); var getJSON = function(url) { return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest();
xhr.open('get', url, true);
xhr.responseType = 'json';
xhr.onload = function() { var status = xhr.status; if (status == 200) {
resolve(xhr.response);
} else {
reject(status);
}
};
xhr.send();
});
};
getJSON('http://web.cellpies.com/api/driving/getVehicleLocationPoints?vehicleDeviceId=0400000000030603&timeType=4&startTime=2017-03-17%2013:00:00&stopTime=2017-03-17%2014:00:00').then(function(jdata) {
addMarker(jdata.data[0].gpsx,jdata.data[0].gpsy);
window.i=1; //updateMarker(jdata.data[1].gpsx,jdata.data[1].gpsy); setInterval(function () { updateMarker(jdata.data[window.i].gpsx,jdata.data[window.i].gpsy); },"1000");
}, function(status) { //error detection.... alert('Something went wrong.');
}); // 实例化点标记 function addMarker(v1,v2) {
marker = new AMap.Marker({
icon: "http://webapi.amap.com/theme/v1.3/markers/n/mark_b.png", position: [v1,v2]
});
marker.setMap(map);
} function updateMarker(v1,v2) { //在地图上更新标记
// 自定义点标记内容 window.i+=10; var markerContent = document.createElement("div"); // 点标记中的图标 var markerImg = document.createElement("img");
markerImg.className = "markerlnglat";
markerImg.src = "http://webapi.amap.com/theme/v1.3/markers/n/mark_r.png";
markerContent.appendChild(markerImg); // 点标记中的文本 var markerSpan = document.createElement("span");
markerSpan.className = 'marker';
markerSpan.innerHTML = "Hi,我换新装备啦!";
markerContent.appendChild(markerSpan);
marker.setContent(markerContent); //更新点标记内容 marker.setPosition([v1,v2]); //更新点标记位置 } </script>
</body>
</html>
</script>
</body>
</html> _END; ?>
蓝蓝设计的小编 http://www.lanlanwork.com