隨著時(shí)代的更新,網(wǎng)民開(kāi)始逐漸適應(yīng)使用手機(jī)來(lái)進(jìn)行網(wǎng)上活動(dòng)
如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里
1、cookie的作用:
我們?cè)跒g覽器中,經(jīng)常涉及到數(shù)據(jù)的交換,比如你登錄郵箱,登錄一個(gè)頁(yè)面。我們經(jīng)常會(huì)在此時(shí)設(shè)置30天內(nèi)記住我,或者自動(dòng)登錄選項(xiàng)。那么它們是怎么記錄信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服務(wù)器設(shè)置的,保存在瀏覽器中,但HTTP協(xié)議是一種無(wú)狀態(tài)協(xié)議,在數(shù)據(jù)交換完畢后,服務(wù)器端和客戶端的鏈接就會(huì)關(guān)閉,每次交換數(shù)據(jù)都需要建立新的鏈接。就像我們?nèi)コ匈I東西,沒(méi)有積分卡的情況下,我們買完?yáng)|西之后,超市沒(méi)有我們的任何消費(fèi)信息,但我們辦了積分卡之后,超市就有了我們的消費(fèi)信息。cookie就像是積分卡,可以保存積分,商品就是我們的信息,超市的系統(tǒng)就像服務(wù)器后臺(tái),http協(xié)議就是交易的過(guò)程。
2、機(jī)制的區(qū)別:
session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案,而cookie機(jī)制則是在客戶端保持狀態(tài)的方案,cookie又叫會(huì)話跟蹤機(jī)制。打開(kāi)一次瀏覽器到關(guān)閉瀏覽器算是一次會(huì)話。說(shuō)到這里,講下HTTP協(xié)議,前面提到,HTTP協(xié)議是一種無(wú)狀態(tài)協(xié)議,在數(shù)據(jù)交換完畢后,服務(wù)器端和客戶端的鏈接就會(huì)關(guān)閉,每次交換數(shù)據(jù)都需要建立新的鏈接。此時(shí),服務(wù)器無(wú)法從鏈接上跟蹤會(huì)話。cookie可以跟蹤會(huì)話,彌補(bǔ)HTTP無(wú)狀態(tài)協(xié)議的不足。
3、cookie的分類:
cookie分為會(huì)話cookie和持久cookie,會(huì)話cookie是指在不設(shè)定它的生命周期expires時(shí)的狀態(tài),前面說(shuō)了,瀏覽器的開(kāi)啟到關(guān)閉就是一次會(huì)話,當(dāng)關(guān)閉瀏覽器時(shí),會(huì)話cookie就會(huì)跟隨瀏覽器而銷毀。當(dāng)關(guān)閉一個(gè)頁(yè)面時(shí),不影響會(huì)話cookie的銷毀。會(huì)話cookie就像我們沒(méi)有辦理積分卡時(shí),單一的買賣過(guò)程,離開(kāi)之后,信息則銷毀。
持久cookie則是設(shè)定了它的生命周期expires,此時(shí),cookie像商品一樣,有個(gè)保質(zhì)期,關(guān)閉瀏覽器之后,它不會(huì)銷毀,直到設(shè)定的過(guò)期時(shí)間。對(duì)于持久cookie,可以在同一個(gè)瀏覽器中傳遞數(shù)據(jù),比如,你在打開(kāi)一個(gè)淘寶頁(yè)面登陸后,你在點(diǎn)開(kāi)一個(gè)商品頁(yè)面,依然是登錄狀態(tài),即便你關(guān)閉了瀏覽器,再次開(kāi)啟瀏覽器,依然會(huì)是登錄狀態(tài)。這就是因?yàn)閏ookie自動(dòng)將數(shù)據(jù)傳送到服務(wù)器端,在反饋回來(lái)的結(jié)果。持久cookie就像是我們辦理了一張積分卡,即便離開(kāi),信息一直保留,直到時(shí)間到期,信息銷毀。
4、簡(jiǎn)單的使用cookie的代碼
cookie的幾種常見(jiàn)屬性:document.cookie="key=value;expires=失效時(shí)間;path=路徑;domain=域名;secure;(secure表安全級(jí)別),
cookie以字符串的形式保存在瀏覽器中。下面貼段代碼出來(lái),是一個(gè)類似購(gòu)物網(wǎng)站的將商品添加到購(gòu)物車,再?gòu)馁?gòu)物車還原商品信息的過(guò)程,是自己用原生JS封裝的函數(shù)。
封裝的cookie的存入,讀取以及刪除的函數(shù):(這里是將信息以對(duì)象的形式存放到cookie中的,會(huì)用到JSON的知識(shí))
下面是商品詳情頁(yè)的JS代碼
購(gòu)物車還原商品信息:
藍(lán)藍(lán)設(shè)計(jì)( www.yvirxh.cn )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)
如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里
說(shuō)到前端, 大家第一反應(yīng)是不是都是vue、react、webpack等這些大大小小的框架或者工具, 但其實(shí)這些都是和js相關(guān)的, 真正的樣式會(huì)被大家忽略。其實(shí)真正呈現(xiàn)給大家看到華麗的頁(yè)面, 都是樣式才讓他們多了那份色彩。那么大家覺(jué)得簡(jiǎn)單的css樣式, 真的簡(jiǎn)單么? 讓我們一起來(lái)看下, 開(kāi)啟css的入坑之旅, 今天一起跟大家簡(jiǎn)單聊聊盒模型的相關(guān)問(wèn)題......
百度知道對(duì)此的解釋, 很有意思, 在此引用一下
CSS盒子模型, 內(nèi)容(CONTENT)就是盒子里裝的東西; 而填充(PADDING)就是怕盒子里裝的東西(貴重的)損壞而添加的泡沫或者其它抗震的輔料; 邊框(BORDER)就是盒子本身了; 至于邊界(MARGIN)則說(shuō)明盒子擺放的時(shí)候的不能全部堆在一起,要留一定空隙保持通風(fēng),同時(shí)也為了方便取出。 —— 百度知道
這段描述很有趣, 很好的解釋margin、border、padding之間的關(guān)系, 不同模式下, 盒模型的width也是不同的, 那么好, 盒模型的第一個(gè)坑來(lái)了, width的范圍問(wèn)題。
通常瀏覽器里, 盒模型的分為兩種模式, 兩種模式(怪異模式和標(biāo)準(zhǔn)模式)下width和height的值不同, 怪異模式的width和height包含border、padding和content, 而標(biāo)準(zhǔn)模式下的width和height只包含content, 這就是為啥有些瀏覽器渲染出來(lái)的dom標(biāo)簽排版會(huì)亂。解決也很簡(jiǎn)單, 在標(biāo)簽的上面, 加上doctype的設(shè)置就好了, 讓瀏覽器統(tǒng)一用同一種標(biāo)準(zhǔn)去解析頁(yè)面。 怪異模式(左圖)和標(biāo)準(zhǔn)模式(右圖)的如下:
當(dāng)然, 還有用來(lái)改變盒模型width范圍的一個(gè)css3的屬性,
當(dāng)設(shè)置為'border-box'時(shí), width = border + padding + content;
當(dāng)設(shè)置為'content-box'時(shí), width = content。
那么第一個(gè)div的實(shí)際寬度為100px, 第二個(gè)div的實(shí)際寬度為120px。
說(shuō)完盒模型的padding和border, 那么再來(lái)吐槽下margin, 盒模型的margin的折疊(margin collapsing)問(wèn)題, 有些也叫外邊距合并。
通常我們說(shuō)的折疊, 都是垂直方向上的折疊, 水平方向是不存在的。標(biāo)準(zhǔn)模式下, 上下兩個(gè)兄弟的塊級(jí)元素, margin是會(huì)重疊的, 并且以最大的那個(gè)間距為準(zhǔn)(都為正數(shù))。
比如下面這段代碼:
上圖灰色為重疊部分, 重疊10px的間距。
既然兄弟盒模型會(huì)有margin折疊, 那么父子呢? 答案是一定的, 父子也存在margin折疊的問(wèn)題, 只不過(guò)條件稍微苛刻一點(diǎn), 我們一起來(lái)看下。 父子組件的折疊觸發(fā), 要求不能有間隙, 就是父組件不能設(shè)置border或padding值, 不能有空余的內(nèi)容, 且同時(shí)有margin值, 比如下面這段代碼:
當(dāng)然, 折疊后的空余部分, 也是取較大值, 且折疊觸發(fā), 只存在于垂直方向。
上圖灰色為重疊部分, 重疊10px的間距。
剛才提到一個(gè)詞"間隙", 如果有間隙的話是不會(huì)觸發(fā)折疊的, 比如父級(jí)元素設(shè)置了padding, 或者子元素都設(shè)置了相對(duì)定位和top值等等。如下圖:
看到這里, 我想有些同學(xué)會(huì)問(wèn)了, 對(duì)于這些
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條規(guī)則是特殊的不折疊的情況, 簡(jiǎn)單翻譯過(guò)來(lái)(僅供參考):
浮動(dòng)的盒模型不會(huì)margin折疊
創(chuàng)建BFC與子不折疊
設(shè)置定位的盒模型不會(huì)折疊
行內(nèi)塊級(jí)元素的盒模型不折疊
兄弟元素有間隙不折疊
父子盒模型元素, 孩子元素有border、padding、有浮動(dòng)就不折疊
height為auto、min-height為0的塊級(jí)盒模型, 和它的最后一個(gè)沒(méi)有border和padding的孩子盒模型底邊距折疊, 且孩子的底部外邊距和被清除浮動(dòng)上邊距有間隙不折疊。
如果min-height為0, 上下border、上下padding都為0, height為0或auto, 且沒(méi)有行內(nèi)盒模型, 他的孩子節(jié)點(diǎn)都會(huì)折疊
有點(diǎn)晦澀難懂, 大家不妨消化一下。說(shuō)到這, 再補(bǔ)充一下, 盒模型margin折疊的計(jì)算問(wèn)題, 總結(jié)了以下幾點(diǎn):
同為正值時(shí), 取較大者為兩者為間距
一正一負(fù)時(shí), 正負(fù)相加為間距, 若結(jié)果為負(fù)值, 則兩者部分重合
都為負(fù)值時(shí), 兩者重合, 且重合部分為絕對(duì)值大者
舉個(gè)例子:
兩者都為負(fù)值, 兩個(gè)div上下重合, 且重合間距為15px。
暫時(shí)就想到這么多, css的學(xué)習(xí)之路任重而道遠(yuǎn), 盒模型又是重中之重。上面有描述不對(duì)的地方也歡迎各位同學(xué)批評(píng)指正, 也歡迎大家來(lái)到大轉(zhuǎn)轉(zhuǎn)FE做客, 一起討論一起研究前端的技術(shù)問(wèn)題。志同道合的同學(xué), 也歡迎加入我們轉(zhuǎn)轉(zhuǎn)FE團(tuán)隊(duì), 咱們一起打拼。
盒模型
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
, 有沒(méi)有一個(gè)統(tǒng)一的整理, 對(duì)于大轉(zhuǎn)轉(zhuǎn)的FEer, 我們當(dāng)然想到了大家的前面, 請(qǐng)看下面:
<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;
}
如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里
代理模式是為一個(gè)對(duì)象提供一個(gè)代用品或占位符,以便控制對(duì)它的訪問(wèn)。
(可以想象一下明星與經(jīng)紀(jì)人的關(guān)系,明星是請(qǐng)求的本體,經(jīng)紀(jì)人就是代理proxy)
代理對(duì)象內(nèi)部含有對(duì)本體對(duì)象的引用,因而可以與調(diào)用本體的相關(guān)方法;同時(shí),代理對(duì)象提供與本體對(duì)象相同的接口,方便在任何時(shí)刻代理本體對(duì)象。
代理模式的變體有很多,有:保護(hù)代理、虛擬代理、緩存代理、防火墻代理、遠(yuǎn)程代理、智能引用代理、寫(xiě)時(shí)復(fù)制代理。具體介紹前三種。
(1)保護(hù)代理
保護(hù)代理主要用于控制不同權(quán)限的對(duì)象對(duì)本體對(duì)象的訪問(wèn)權(quán)限。比如很多人想訪問(wèn)本體A,如果有代理B存在的話,B會(huì)首先剔除不滿足A的訪問(wèn)條件的訪問(wèn)者,符合條件的才能訪問(wèn)。
作用:過(guò)濾請(qǐng)求
例如:權(quán)限的劃分和管理就是使用保護(hù)代理proxy來(lái)完成的。
注冊(cè)普通用戶:code為“001”
論壇管理者 :code為“002”
系統(tǒng)管理者 :code為“003”
游 客 :code為“000”
論壇開(kāi)放了四個(gè)基礎(chǔ)功能
1,發(fā)帖
2,帖子審核
3,清除帖子
4,留言
游客不具備任何操作權(quán)限,注冊(cè)用戶只能發(fā)帖,論壇管理者可以審核以及刪帖操作,系統(tǒng)管理者具有所有功能權(quán)限。
在該例子中,論壇代理有與user本體相同的接口,可以在滿足條件時(shí),執(zhí)行與本體相同的代碼,與調(diào)用方法的人而言,是不透明的,我實(shí)現(xiàn)了調(diào)用,但不在乎是通過(guò)代理實(shí)現(xiàn)的,還是本體實(shí)現(xiàn)的。
本案例來(lái)源:大熊君大話設(shè)計(jì)模式JavaScript
(2)虛擬代理
虛擬代理是將調(diào)用本體方法的請(qǐng)求進(jìn)行管理,等到本體適合執(zhí)行時(shí),再執(zhí)行。
作用:將開(kāi)銷很大的對(duì)象,延遲到真正需要它的時(shí)候再執(zhí)行。
比如:利用虛擬代理實(shí)現(xiàn)圖片預(yù)加載功能:
比如:利用虛擬代理合并HTTP請(qǐng)求
在這些例子中,虛擬代理對(duì)請(qǐng)求進(jìn)行擱置處理,等到合適的時(shí)機(jī),對(duì)本體的接口進(jìn)行調(diào)用,可以有效提升Web性能。
(3)緩存代理
緩存代理可以為開(kāi)銷大的一些運(yùn)算結(jié)果提供暫時(shí)性的存儲(chǔ),如果再次傳進(jìn)相同的參數(shù)是,直接返回結(jié)果,避免大量重復(fù)計(jì)算。
什么情況下使用代理
當(dāng)我們需要使用的對(duì)象很復(fù)雜或者需要很長(zhǎng)時(shí)間去構(gòu)造,這時(shí)就可以使用代理模式(Proxy)。例如:如果構(gòu)建一個(gè)對(duì)象很耗費(fèi)時(shí)間和計(jì)算機(jī)資源,代理模式(Proxy)允許我們控制這種情況,直到我們需要使用實(shí)際的對(duì)象。一個(gè)代理(Proxy)通常包含和將要使用的對(duì)象同樣的方法,一旦開(kāi)始使用這個(gè)對(duì)象,這些方法將通過(guò)代理(Proxy)傳遞給實(shí)際的對(duì)象。
比如上面的代碼:需要花很長(zhǎng)的時(shí)間加載很多圖片,復(fù)雜的運(yùn)算過(guò)程,頻繁的多次請(qǐng)求處理等;都可以用到代理模式。
小結(jié)
代理模式的一個(gè)好處就是對(duì)外部提供統(tǒng)一的接口方法,而代理類在接口中實(shí)現(xiàn)對(duì)真實(shí)類的附加操作行為,從而可以在不影響外部調(diào)用情況下,進(jìn)行系統(tǒng)擴(kuò)展。也就是說(shuō),我要修改真實(shí)角色的操作的時(shí)候,盡量不要修改他,而是在外部在“包”一層進(jìn)行附加行為,即代理類。
什么是代理模式
如何實(shí)現(xiàn)代理模式
例子(上代碼)
"這是移動(dòng)端界面設(shè)計(jì)規(guī)范尺寸安卓篇也是第二篇小總結(jié),主講如何一稿去適配眾多的安卓機(jī)型。如果你有興趣也可以去官方研讀下設(shè)計(jì)文檔,這樣的話,就可以比較系統(tǒng)的掌握知識(shí)。
每次QQ有新的重要版本發(fā)布時(shí),移動(dòng)端的介紹使用了HTML5頁(yè)面,通過(guò)7個(gè)獨(dú)立的頁(yè)面簡(jiǎn)潔地介紹了它的主要功能。在每個(gè)頁(yè)面切換時(shí)伴隨著背景圖片的切換,讓介紹頁(yè)面生動(dòng)有趣。
如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里
說(shuō)到前端, 大家第一反應(yīng)是不是都是vue、react、webpack等這些大大小小的框架或者工具, 但其實(shí)這些都是和js相關(guān)的, 真正的樣式會(huì)被大家忽略。其實(shí)真正呈現(xiàn)給大家看到華麗的頁(yè)面, 都是樣式才讓他們多了那份色彩。那么大家覺(jué)得簡(jiǎn)單的css樣式, 真的簡(jiǎn)單么? 讓我們一起來(lái)看下, 開(kāi)啟css的入坑之旅, 今天一起跟大家簡(jiǎn)單聊聊盒模型的相關(guān)問(wèn)題......
百度知道對(duì)此的解釋, 很有意思, 在此引用一下
CSS盒子模型, 內(nèi)容(CONTENT)就是盒子里裝的東西; 而填充(PADDING)就是怕盒子里裝的東西(貴重的)損壞而添加的泡沫或者其它抗震的輔料; 邊框(BORDER)就是盒子本身了; 至于邊界(MARGIN)則說(shuō)明盒子擺放的時(shí)候的不能全部堆在一起,要留一定空隙保持通風(fēng),同時(shí)也為了方便取出。 —— 百度知道
這段描述很有趣, 很好的解釋margin、border、padding之間的關(guān)系, 不同模式下, 盒模型的width也是不同的, 那么好, 盒模型的第一個(gè)坑來(lái)了, width的范圍問(wèn)題。
通常瀏覽器里, 盒模型的分為兩種模式, 兩種模式(怪異模式和標(biāo)準(zhǔn)模式)下width和height的值不同, 怪異模式的width和height包含border、padding和content, 而標(biāo)準(zhǔn)模式下的width和height只包含content, 這就是為啥有些瀏覽器渲染出來(lái)的dom標(biāo)簽排版會(huì)亂。解決也很簡(jiǎn)單, 在標(biāo)簽的上面, 加上doctype的設(shè)置就好了, 讓瀏覽器統(tǒng)一用同一種標(biāo)準(zhǔn)去解析頁(yè)面。 怪異模式(左圖)和標(biāo)準(zhǔn)模式(右圖)的如下:
當(dāng)然, 還有用來(lái)改變盒模型width范圍的一個(gè)css3的屬性,
當(dāng)設(shè)置為'border-box'時(shí), width = border + padding + content;
當(dāng)設(shè)置為'content-box'時(shí), width = content。
那么第一個(gè)div的實(shí)際寬度為100px, 第二個(gè)div的實(shí)際寬度為120px。
說(shuō)完盒模型的padding和border, 那么再來(lái)吐槽下margin, 盒模型的margin的折疊(margin collapsing)問(wèn)題, 有些也叫外邊距合并。
通常我們說(shuō)的折疊, 都是垂直方向上的折疊, 水平方向是不存在的。標(biāo)準(zhǔn)模式下, 上下兩個(gè)兄弟的塊級(jí)元素, margin是會(huì)重疊的, 并且以最大的那個(gè)間距為準(zhǔn)(都為正數(shù))。
比如下面這段代碼:
上圖灰色為重疊部分, 重疊10px的間距。
既然兄弟盒模型會(huì)有margin折疊, 那么父子呢? 答案是一定的, 父子也存在margin折疊的問(wèn)題, 只不過(guò)條件稍微苛刻一點(diǎn), 我們一起來(lái)看下。 父子組件的折疊觸發(fā), 要求不能有間隙, 就是父組件不能設(shè)置border或padding值, 不能有空余的內(nèi)容, 且同時(shí)有margin值, 比如下面這段代碼:
當(dāng)然, 折疊后的空余部分, 也是取較大值, 且折疊觸發(fā), 只存在于垂直方向。
上圖灰色為重疊部分, 重疊10px的間距。
剛才提到一個(gè)詞"間隙", 如果有間隙的話是不會(huì)觸發(fā)折疊的, 比如父級(jí)元素設(shè)置了padding, 或者子元素都設(shè)置了相對(duì)定位和top值等等。如下圖:
看到這里, 我想有些同學(xué)會(huì)問(wèn)了, 對(duì)于這些
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條規(guī)則是特殊的不折疊的情況, 簡(jiǎn)單翻譯過(guò)來(lái)(僅供參考):
浮動(dòng)的盒模型不會(huì)margin折疊
創(chuàng)建BFC與子不折疊
設(shè)置定位的盒模型不會(huì)折疊
行內(nèi)塊級(jí)元素的盒模型不折疊
兄弟元素有間隙不折疊
父子盒模型元素, 孩子元素有border、padding、有浮動(dòng)就不折疊
height為auto、min-height為0的塊級(jí)盒模型, 和它的最后一個(gè)沒(méi)有border和padding的孩子盒模型底邊距折疊, 且孩子的底部外邊距和被清除浮動(dòng)上邊距有間隙不折疊。
如果min-height為0, 上下border、上下padding都為0, height為0或auto, 且沒(méi)有行內(nèi)盒模型, 他的孩子節(jié)點(diǎn)都會(huì)折疊
有點(diǎn)晦澀難懂, 大家不妨消化一下。說(shuō)到這, 再補(bǔ)充一下, 盒模型margin折疊的計(jì)算問(wèn)題, 總結(jié)了以下幾點(diǎn):
同為正值時(shí), 取較大者為兩者為間距
一正一負(fù)時(shí), 正負(fù)相加為間距, 若結(jié)果為負(fù)值, 則兩者部分重合
都為負(fù)值時(shí), 兩者重合, 且重合部分為絕對(duì)值大者
舉個(gè)例子:
兩者都為負(fù)值, 兩個(gè)div上下重合, 且重合間距為15px。
暫時(shí)就想到這么多, css的學(xué)習(xí)之路任重而道遠(yuǎn), 盒模型又是重中之重。上面有描述不對(duì)的地方也歡迎各位同學(xué)批評(píng)指正, 也歡迎大家來(lái)到大轉(zhuǎn)轉(zhuǎn)FE做客, 一起討論一起研究前端的技術(shù)問(wèn)題。志同道合的同學(xué), 也歡迎加入我們轉(zhuǎn)轉(zhuǎn)FE團(tuán)隊(duì), 咱們一起打拼。
盒模型
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
, 有沒(méi)有一個(gè)統(tǒng)一的整理, 對(duì)于大轉(zhuǎn)轉(zhuǎn)的FEer, 我們當(dāng)然想到了大家的前面, 請(qǐng)看下面:
<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;
}
如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里
Ajax的核心是XMLHttpRequest對(duì)象(發(fā)送異步請(qǐng)求、接受響應(yīng)及執(zhí)行回調(diào)),它是ajax實(shí)現(xiàn)的關(guān)鍵
XMLHttpRequest對(duì)象的open()方法與send()方法
方法 | 描述 |
---|---|
open(method,url,async) |
規(guī)定請(qǐng)求的類型、URL 以及是否異步處理請(qǐng)求。
|
send(string) |
將請(qǐng)求發(fā)送到服務(wù)器。
|
請(qǐng)求類型,GET 還是 POST?
與 POST 相比,GET 更簡(jiǎn)單也更快,并且在大部分情況下都能用。
然而,在以下情況中,請(qǐng)使用 POST 請(qǐng)求:
(1). GET請(qǐng)求
(2). POST請(qǐng)求
方法 | 描述 |
---|---|
setRequestHeader(header,value) |
向請(qǐng)求添加 HTTP 頭。
|
async參數(shù)設(shè)置
XMLHttpRequest對(duì)象如果要用于AJAX的話,其open()方法的async參數(shù)必須設(shè)置為true
通過(guò) AJAX,JavaScript 無(wú)需等待服務(wù)器的響應(yīng),而是:
(1). 當(dāng)使用 async=true 時(shí),請(qǐng)規(guī)定在響應(yīng)處于 onreadystatechange 事件中的就緒狀態(tài)時(shí)執(zhí)行的函數(shù):
(2). 當(dāng)您使用 async=false 時(shí),請(qǐng)不要編寫(xiě) onreadystatechange 函數(shù) - 把代碼放到 send() 語(yǔ)句后面即可:
服務(wù)器響應(yīng)
使用 XMLHttpRequest 對(duì)象的 responseText 或 responseXML 屬性。
屬性 | 描述 |
---|---|
responseText | 獲得字符串形式的響應(yīng)數(shù)據(jù)。 |
responseXML | 獲得 XML 形式的響應(yīng)數(shù)據(jù)。 |
(1). 如果來(lái)自服務(wù)器的響應(yīng)并非 XML,請(qǐng)使用 responseText 屬性。
responseText 屬性返回字符串形式的響應(yīng),因此您可以這樣使用:
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
(2). 如果來(lái)自服務(wù)器的響應(yīng)是 XML,而且需要作為 XML 對(duì)象進(jìn)行解析,請(qǐng)使用 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;
當(dāng)請(qǐng)求被發(fā)送到服務(wù)器時(shí),我們需要執(zhí)行一些基于響應(yīng)的任務(wù)。
每當(dāng) readyState 改變時(shí),就會(huì)觸發(fā) onreadystatechange 事件。readyState 屬性存有 XMLHttpRequest 的狀態(tài)信息。
下面是 XMLHttpRequest 對(duì)象的三個(gè)重要的屬性:
屬性 | 描述 |
---|---|
onreadystatechange | 存儲(chǔ)函數(shù)(或函數(shù)名),每當(dāng) readyState 屬性改變時(shí),就會(huì)調(diào)用該函數(shù)。 |
readyState |
存有 XMLHttpRequest 的狀態(tài)。從 0 到 4 發(fā)生變化。
|
status |
200: "OK" 404: 未找到頁(yè)面 |
Ajax()函數(shù)示例:
[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對(duì)象的,而其他瀏覽器的XMLHttpRequest對(duì)象是window的子對(duì)象。
[javascript] view plain copy
- xmlHttpReq.open("GET","test.php",true);
[javascript] view plain copy
- xmlHttpReq.onreadystatechange = RequestCallBack;
[javascript] view plain copy
- xmlHttpReq.send(null);
當(dāng)請(qǐng)求改變時(shí),XMLHttpRequest對(duì)象調(diào)用onreadystatechange屬性注冊(cè)的事件處理器,因此在處理該響應(yīng)前,事件處理器首先應(yīng)該檢查readyState的值和HTTP的狀態(tài)。當(dāng)請(qǐng)求完成加載時(shí)(readyState==4)并且已經(jīng)響應(yīng)成功(status==200)時(shí),就可以調(diào)用JavaScript函數(shù)來(lái)處理該響應(yīng)內(nèi)容。
[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對(duì)Ajax操作進(jìn)行了封裝,在jQuery中$.ajax()方法屬于最底層的方法,第2層是load()、$.get()、$.post()方法,第3層是$.getScript()、$.getJSON()方法
1、load()方法 通常用來(lái)從WEB服務(wù)器上獲取靜態(tài)的數(shù)據(jù)文件
最常用的Ajax方法,能載入遠(yuǎn)程HTML代碼并插入DOM中
load(url[,data][,callback]);
- url:String 請(qǐng)求HTML頁(yè)面的URL地址
- data:Object 發(fā)送至服務(wù)器的key/value數(shù)據(jù)
- callback:Function 請(qǐng)求完成時(shí)的回調(diào)函數(shù),無(wú)論請(qǐng)求成功或失敗
[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">已有評(píng)論:</div>
- <div id="resText">替換內(nèi)容</div>
test.html代碼為:
[javascript] view plain copy
- <div class="comment">
- <h6>張三:</h6>
- <p class="para">沙發(fā)</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參數(shù)的語(yǔ)法結(jié)構(gòu)為:“url selector”
[javascript] view plain copy
- $("#resText").load("test.html .para");
load()傳遞方式根據(jù)參數(shù)data自動(dòng)指定,沒(méi)有參數(shù) --> GET,反之為POST
[javascript] view plain copy
- // 無(wú)參數(shù)傳遞 GET
- $("#resText").load("test.html",function(){
- //code
- });
- // 有參數(shù)傳遞 POST
- $("#resText").load("test.html",{name:"rain",age:"22"},function(){
- //code
- });
回調(diào)函數(shù):有三個(gè)參數(shù),請(qǐng)求返回的內(nèi)容、請(qǐng)求狀態(tài)、XMLHttpRequest對(duì)象
[javascript] view plain copy
- // 回調(diào)函數(shù)
- $("#resText").load("test.html",function(responseText,textStatus,XMLHttpRequest){
- //responseText 請(qǐng)求返回的內(nèi)容
- //textStatus 請(qǐng)求狀態(tài):success、error、notmodified、timeout
- //XMLHttpRequest XMLHttpRequest對(duì)象
- });
2、$.get()和$.post()方法 jQuery中的全局函數(shù)
2.1 $.get() 使用GET方式來(lái)進(jìn)行異步請(qǐng)求
[javascript] view plain copy
- $.get(url[,data][,callback][,type]);
- url:String 請(qǐng)求HTML頁(yè)面的URL地址
- data:Object 發(fā)送至服務(wù)器的key/value數(shù)據(jù)會(huì)作為QueryString附加到請(qǐng)求URL中
- callback:Function 載入成功時(shí)回調(diào)函數(shù)(只有當(dāng)response的返回狀態(tài)是success才調(diào)用該函數(shù))自動(dòng)將請(qǐng)求結(jié)果和狀態(tài)傳遞給該方法
- type:服務(wù)器返回內(nèi)容的格式,包括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:返回的內(nèi)容
- // textStatus:請(qǐng)求狀態(tài),success、error、notmodified、timeout
- })
- })
數(shù)據(jù)格式:服務(wù)器返回的數(shù)據(jù)格式
(1)HTML片段 較少工作量
[javascript] view plain copy
- $.get("get1.php",{
- username:$("#username").val(),
- content:$("#comment").val()
- },function(data,textStatus){
- // data:返回的內(nèi)容
- // textStatus:請(qǐng)求狀態(tài),success、error、notmodified、timeout
- $("#resText").html(data); //將返回的數(shù)據(jù)添加到頁(yè)面上
- });
(2) XML文檔 需要對(duì)返回的數(shù)據(jù)處理
方便使用
可以通過(guò)attr()、find()、filter()方法對(duì)數(shù)據(jù)進(jìn)行處理
由于期待服務(wù)器返回的數(shù)據(jù)類型為XML文檔,因此需要在服務(wù)期端設(shè)置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); // 把返回的數(shù)據(jù)添加到頁(yè)面上
- });
- })
[javascript] view plain copy
- header("Content-Type:text/html; charset=utf-8");
(3)JSON文件 需要對(duì)返回的數(shù)據(jù)處理
JSON相對(duì)于XML比較簡(jiǎn)潔
[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); // 把返回的數(shù)據(jù)添加到頁(yè)面上
- },"json");
- })
以上三種方法對(duì)比:
HTML返回?cái)?shù)據(jù)最簡(jiǎn)單,如果數(shù)據(jù)需要重用使用JSON(性能與文件大小方面有優(yōu)勢(shì)),當(dāng)遠(yuǎn)程程序未知時(shí)使用XML。
2.2 $.post() 通過(guò) HTTP POST 請(qǐng)求從服務(wù)器上請(qǐng)求數(shù)據(jù)
[javascript] view plain copy
- $.post(URL[,data][,callback]);
- url:String 請(qǐng)求的URL地址
- data:Object 發(fā)送至服務(wù)器的key/value數(shù)據(jù)
- callback:Function 載入成功時(shí)的回調(diào)函數(shù)
由于POST和GET方式提交的所有數(shù)據(jù)都可以通過(guò)$_REQUEST[]來(lái)獲取,因此只需要改變jQuery函數(shù),就可以將程序在GET請(qǐng)求和POST請(qǐng)求之間切換。
![]()
當(dāng)load()方法帶有參數(shù)傳遞時(shí),會(huì)使用POST方式發(fā)送請(qǐng)求。因此也可以使用load()方法來(lái)完成同樣的功能。
![]()
$.post()與$.get()方法的區(qū)別:
- GET請(qǐng)求會(huì)將參數(shù)跟在URL后進(jìn)行傳遞,而POST請(qǐng)求則是作為HTTP消息的實(shí)體內(nèi)容發(fā)送給Web服務(wù)器。當(dāng)然,在Ajax請(qǐng)求中,這種區(qū)別對(duì)用戶是不可見(jiàn)的。
- GET方式對(duì)傳輸?shù)臄?shù)據(jù)有大小限制(通常不能大于2KB),而使用POST方式傳遞的數(shù)據(jù)量要比GET方式大得多(理論上不受限制)。
- GET方式請(qǐng)求的數(shù)據(jù)會(huì)被瀏覽器緩存起來(lái),因此其他人就可以從瀏覽器的歷史記錄中讀取到這些數(shù)據(jù),例如賬號(hào)和密碼等。在某種情況下,GET方式會(huì)帶來(lái)嚴(yán)重的安全性問(wèn)題,而POST方式相對(duì)來(lái)說(shuō)就可以避免這些問(wèn)題。
- GET方式和POST方式傳遞的數(shù)據(jù)在服務(wù)器端的獲取也不相同。在PHP中,GET方式的數(shù)據(jù)可以用$_GET[]獲取,而POST方式可以用$_POST[]獲取。兩種方式都可以用$_REQUEST[]來(lái)獲取。
上面使用load()、$.get()和$.post()方法完成了一些常規(guī)的Ajax程序,如果還需要編寫(xiě)一些復(fù)雜的Ajax程序,那么就要用到j(luò)Query中的$.ajax()方法。$.ajax()方法不僅能實(shí)現(xiàn)與load()、$.get()和$.post()方法同樣的功能,而且還可以設(shè)定beforeSend(提交前回調(diào)函數(shù))、error(請(qǐng)求失敗后處理)、success(請(qǐng)求成功后處理)以及complete(請(qǐng)求完成后處理)回調(diào)函數(shù),通過(guò)這些回調(diào)函數(shù),可以給用戶更多的Ajax提示信息。另外,還有一些參數(shù),可以設(shè)置Ajax請(qǐng)求的超時(shí)時(shí)間或者頁(yè)面的“最后更改”狀態(tài)等。
3、$.getScript()和$.getJSON()方法
3.1 $.getScript()
有時(shí)候,在頁(yè)面初次加載時(shí)就取得所需的全部JavaScript文件是完全沒(méi)有必要的。雖然可以在需要哪個(gè)JavaScript文件時(shí),動(dòng)態(tài)地創(chuàng)建<script>標(biāo)簽
上述方法不理想,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");
有回調(diào)函數(shù)[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");
- })
- })
上面函數(shù)雖然加載了JSON代碼,但是并沒(méi)有告訴JS對(duì)返回的數(shù)據(jù)如何處理,所以需要回調(diào)函數(shù)
[javascript] view plain copy
- $(function(){
- $("#btn").click(function(){
- $.getJSON("test.json",function(){
- //data:返回的數(shù)據(jù)
- });
- })
- })
jQuery遍歷方法 --> $.each()方法 遍歷對(duì)象和數(shù)組
$.each(data,callback) // 為全局函數(shù) 不同于each()方法
- data:數(shù)組或?qū)ο?
- callback:回調(diào)函數(shù),有兩個(gè)參數(shù)(對(duì)象的成員或數(shù)組的索引,對(duì)應(yīng)變量或內(nèi)容)
![]()
4、$.ajax()方法 jQuery最底層的Ajax實(shí)現(xiàn)
$.ajax(options);
參數(shù)名稱 | 類型 | 說(shuō)明 |
---|---|---|
url | String | (默認(rèn)為當(dāng)前頁(yè)地址)發(fā)送請(qǐng)求的地址 |
type | String |
請(qǐng)求方式(POST/GET)默認(rèn)GE 注意其他HTTP請(qǐng)求方法,例如PUT和DELETE,僅部分瀏覽器支持 |
timeout | Number |
設(shè)置請(qǐng)求超時(shí)時(shí)間(毫秒) 此設(shè)置將覆蓋$.ajaxSetup()方法的全局設(shè)置 |
data | Object/String |
發(fā)送到服務(wù)器的數(shù)據(jù)。如果已經(jīng)不是字符串,將自動(dòng)轉(zhuǎn)換為字符串格式。 GET請(qǐng)求中將附加在URL后。防止這種自動(dòng)轉(zhuǎn)換,可以查看processData選項(xiàng)。 對(duì)象必須為key/value格式 例如:{foo1:"bar1",foo2:"bar2"}轉(zhuǎn)換為&foo1=bar1&foo2=bar2。 如果是數(shù)組,jQuery將自動(dòng)為不同的值對(duì)應(yīng)同一個(gè)名稱 例如:{foo:["bar1","bar2"]}轉(zhuǎn)換為&foo=bar1&foo=bar2 |
dataType | String |
預(yù)期服務(wù)器返回的數(shù)據(jù)類型。 如果不指定,jQuery將自動(dòng)根據(jù)HTTP包MIME信息返回responseXML或responseText, 并作為回調(diào)函數(shù)參數(shù)傳遞。 可用類型, xml:返回XML文檔,可用jQuery處理 html:返回純文本HTML信息,包含的script標(biāo)簽會(huì)在插入DOM是執(zhí)行 script:返回純文本的JavaScript代碼,不會(huì)自動(dòng)緩存結(jié)果。除非設(shè)置cache參數(shù) 注意在遠(yuǎn)程請(qǐng)求時(shí)(不在同一個(gè)域下),所有POST請(qǐng)求都將轉(zhuǎn)換為GET請(qǐng)求 json:返回json數(shù)據(jù) jsonp:jsonp格式,使用jsonp形式調(diào)用參數(shù)時(shí),myurl?callback=? jQuery:將自動(dòng)替換后一個(gè)“?”為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù) text:返回純文本字符串 |
beforeSend | Function |
發(fā)送請(qǐng)求前可以修改XMLHttpRequest對(duì)象的函數(shù)例如添加自定義HTTP頭。 在beforeSend中如果返回false可以取消本次Ajax請(qǐng)求。XMLHttpRequest對(duì)象是唯一的函數(shù) function(XMLHttpRequest){ this;//調(diào)用本次Ajax請(qǐng)求時(shí)傳遞的options參數(shù) } |
complete | Function |
請(qǐng)求完成后調(diào)用的函數(shù)(請(qǐng)求成功或失敗時(shí)均調(diào)用) 參數(shù):XMLHttpRequest對(duì)象和一個(gè)描述成功請(qǐng)求類型的字符串 function(XMLHttpRequest,textStatus){
this;//調(diào)用本次Ajax請(qǐng)求時(shí)傳遞的options參數(shù) } |
success | Function |
請(qǐng)求完成后調(diào)用的函數(shù)(請(qǐng)求成功或失敗時(shí)均調(diào)用) 參數(shù):(1) 由服務(wù)器返回,并根據(jù)datatype參數(shù)進(jìn)行設(shè)置 (2) 描述狀態(tài)的字符串 function(XMLHttpRequest,textStatus){ //data可能是XMLDoc、jsonObj、html、text等
this;//調(diào)用本次Ajax請(qǐng)求時(shí)傳遞的options參數(shù) } |
error | Function |
請(qǐng)求失敗時(shí)被調(diào)用的函數(shù) 參數(shù):(1) XMLHttpRequest對(duì)象 (2) 錯(cuò)誤信息
(3) 捕獲的錯(cuò)誤對(duì)象(可選) function(XMLHttpRequest,textStatus,errorThrown){ //通常情況下textStatus和errorThrown只有其中一個(gè)包含信息
this;//調(diào)用本次Ajax請(qǐng)求時(shí)傳遞的options參數(shù) } |
global | Boolean |
默認(rèn)為true。表示是否觸發(fā)全局Ajax事件。設(shè)置為false將不會(huì)觸發(fā)全局Ajax事件 AjaxStart或AjaxStop可用于控制各種Ajax事件 |
前面用到的$.load()、$.get()、$.post()、$.getScript()和$.getJSON()這些方法,都是基于$.ajax()方法構(gòu)建的,$.ajax()方法是jQuery最底層的Ajax實(shí)現(xiàn),因此可以用它來(lái)代替前面的所有方法。
[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()方法
異步提交表單,并將服務(wù)器返回的數(shù)據(jù)顯示到當(dāng)前頁(yè)面中
[javascript] view plain copy
- $.get("get1.php",{
- username:$("#username").val(),
- content:$("#comment").val()
- },function(data,textStatus){
- // data:返回的內(nèi)容
- // textStatus:請(qǐng)求狀態(tài),success、error、notmodified、timeout
- $("#resText").html(data); //將返回的數(shù)據(jù)添加到頁(yè)面上
- });
serialize()方法也是作用于一個(gè)jQuery對(duì)象,它能夠?qū)OM元素內(nèi)容序列化為字符串,用于Ajax請(qǐng)求。可將上述代碼簡(jiǎn)化為:
[javascript] view plain copy
- $.get("get1.php",$("#form1").serialize(),function(data,textStatus){
- // data:返回的內(nèi)容
- // textStatus:請(qǐng)求狀態(tài),success、error、notmodified、timeout
- $("#resText").html(data); //將返回的數(shù)據(jù)添加到頁(yè)面上
- });
serialize()方法作用于jQuery對(duì)象,所以不光只有表單能使用它,其他選擇器選取的元素也都能使用它,如以下jQuery代碼:
[javascript] view plain copy
- $(":checkbox,:radio").serialize();
把復(fù)選框和單選框的值序列化為字符串形式,只會(huì)將選中的值序列化。
2.serializeArray()方法
該方法不是返回字符串,而是將DOM元素序列化后,返回JSON格式的數(shù)據(jù)
![]()
3.$.param()方法
它是serialize()方法的核心,用來(lái)對(duì)一個(gè)數(shù)組或?qū)ο蟀凑誯ey/value進(jìn)行序列化。
比如將一個(gè)普通的對(duì)象序列化:
![]()
四、jQuery中的全局事件
jQuery簡(jiǎn)化Ajax操作不僅體現(xiàn)在調(diào)用Ajax方法和處理響應(yīng)方面,而且還體現(xiàn)在對(duì)調(diào)用Ajax方法的過(guò)程中的HTTP請(qǐng)求的控制。通過(guò)jQuery提供的一些自定義全局函數(shù),能夠?yàn)楦鞣N與Ajax相關(guān)的事件注冊(cè)回調(diào)函數(shù)。例如當(dāng)Ajax請(qǐng)求開(kāi)始時(shí),會(huì)觸發(fā)ajaxStart()方法的回調(diào)函數(shù);當(dāng)Ajax請(qǐng)求結(jié)束時(shí),會(huì)觸發(fā)ajaxStop()方法的回調(diào)函數(shù)。這些方法都是全局的方法,因此無(wú)論創(chuàng)建它們的代碼位于何處,只要有Ajax請(qǐng)求發(fā)生時(shí),就會(huì)觸發(fā)它們。
有時(shí),當(dāng)網(wǎng)頁(yè)加載過(guò)慢時(shí),就需要為網(wǎng)頁(yè)添加一個(gè)提示信息,常用的提示信息是“加載中…”,代碼如下:
然后通過(guò)CSS控制元素隱藏,當(dāng)Ajax請(qǐng)求開(kāi)始的時(shí)候,將此元素顯示,用來(lái)提示用戶Ajax請(qǐng)求正在進(jìn)行。當(dāng)Ajax請(qǐng)求結(jié)束后,將此元素隱藏。[javascript] view plain copy
- <div class="loading">加載中...</div>
[javascript] view plain copy
- $("$loading").ajaxStart(function(){
- $(this).show();
- }).ajaxStop(function(){
- $(this).hide();
- });
jQuery的Ajax全局事件中還有幾個(gè)方法,也可以在使用Ajax方法的過(guò)程中為其帶來(lái)方便。
方法名稱 說(shuō)明 ajaxComplete(callback) Ajax請(qǐng)求完成時(shí)執(zhí)行的函數(shù) ajaxError(callback) Ajax請(qǐng)求發(fā)生錯(cuò)誤時(shí)執(zhí)行的函數(shù),捕捉到的錯(cuò)誤可以作為最后一個(gè)參數(shù)傳遞 ajaxSend(callback) Ajax請(qǐng)求發(fā)送前執(zhí)行的函數(shù) ajaxSuccess(callback) Ajax請(qǐng)求成功時(shí)執(zhí)行的函數(shù) 注意:
1,如果想使某個(gè)Ajax請(qǐng)求不受全局方法的影響,那么可以在使用$.ajax(options)方法時(shí),將參數(shù)中的global設(shè)置為false,jQuery代碼如下
[javascript] view plain copy
- $.ajax({
- url:"test.html",
- global:false
- });
2,在jQuery1.5版本之后,如果Ajax請(qǐng)求不觸發(fā)全局方法,那么可以設(shè)置:
[javascript] view plain copy
- $.ajaxPrefilter(function(options){
- options.global = true;
- })
藍(lán)藍(lán)設(shè)計(jì)( www.yvirxh.cn )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)
通常在PC上常出現(xiàn)的下拉菜單,在移動(dòng)端上都是用什么交互來(lái)實(shí)現(xiàn)的?將最近項(xiàng)目里碰到的情況總結(jié)一下。
如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里
效果圖
-----------------------------------------------------------------------更新---------------------------------------------------------
去掉連續(xù)顯示多個(gè)點(diǎn),每次只顯示一個(gè)點(diǎn)
涉及setInterval傳參的問(wèn)題。
發(fā)現(xiàn)用addMarker(jdata.data[i].gpsx,jdata.data[i].gpsy);時(shí)程序可正常運(yùn)行,但是將該函數(shù) 放到setInterval中后卻出現(xiàn)了問(wèn)題,可通過(guò)閉包解決。
<?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>點(diǎn)標(biāo)記</title>
<link rel="stylesheet" />
<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=您申請(qǐng)的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.');
}); // 實(shí)例化點(diǎn)標(biāo)記 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>點(diǎn)標(biāo)記</title>
<link rel="stylesheet" />
<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=您申請(qǐng)的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.');
}); // 實(shí)例化點(diǎn)標(biāo)記 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) { //在地圖上更新標(biāo)記
// 自定義點(diǎn)標(biāo)記內(nèi)容 window.i+=10; var markerContent = document.createElement("div"); // 點(diǎn)標(biāo)記中的圖標(biāo) 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); // 點(diǎn)標(biāo)記中的文本 var markerSpan = document.createElement("span");
markerSpan.className = 'marker';
markerSpan.innerHTML = "Hi,我換新裝備啦!";
markerContent.appendChild(markerSpan);
marker.setContent(markerContent); //更新點(diǎn)標(biāo)記內(nèi)容 marker.setPosition([v1,v2]); //更新點(diǎn)標(biāo)記位置 } </script>
</body>
</html>
</script>
</body>
</html> _END; ?>
藍(lán)藍(lán)設(shè)計(jì)的小編 http://www.yvirxh.cn