首頁

移動端優(yōu)化如何做好

藍(lán)藍(lán)設(shè)計的小編

隨著時代的更新,網(wǎng)民開始逐漸適應(yīng)使用手機(jī)來進(jìn)行網(wǎng)上活動

關(guān)于Cookie的原理、作用,區(qū)別以及使用

seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里

1、cookie的作用:

我們在瀏覽器中,經(jīng)常涉及到數(shù)據(jù)的交換,比如你登錄郵箱,登錄一個頁面。我們經(jīng)常會在此時設(shè)置30天內(nèi)記住我,或者自動登錄選項。那么它們是怎么記錄信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服務(wù)器設(shè)置的,保存在瀏覽器中,但HTTP協(xié)議是一種無狀態(tài)協(xié)議,在數(shù)據(jù)交換完畢后,服務(wù)器端和客戶端的鏈接就會關(guān)閉,每次交換數(shù)據(jù)都需要建立新的鏈接。就像我們?nèi)コ匈I東西,沒有積分卡的情況下,我們買完東西之后,超市沒有我們的任何消費(fèi)信息,但我們辦了積分卡之后,超市就有了我們的消費(fèi)信息。cookie就像是積分卡,可以保存積分,商品就是我們的信息,超市的系統(tǒng)就像服務(wù)器后臺,http協(xié)議就是交易的過程。


2、機(jī)制的區(qū)別:

session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案,而cookie機(jī)制則是在客戶端保持狀態(tài)的方案,cookie又叫會話跟蹤機(jī)制。打開一次瀏覽器到關(guān)閉瀏覽器算是一次會話。說到這里,講下HTTP協(xié)議,前面提到,HTTP協(xié)議是一種無狀態(tài)協(xié)議,在數(shù)據(jù)交換完畢后,服務(wù)器端和客戶端的鏈接就會關(guān)閉,每次交換數(shù)據(jù)都需要建立新的鏈接。此時,服務(wù)器無法從鏈接上跟蹤會話。cookie可以跟蹤會話,彌補(bǔ)HTTP無狀態(tài)協(xié)議的不足。


3、cookie的分類:

cookie分為會話cookie和持久cookie,會話cookie是指在不設(shè)定它的生命周期expires時的狀態(tài),前面說了,瀏覽器的開啟到關(guān)閉就是一次會話,當(dāng)關(guān)閉瀏覽器時,會話cookie就會跟隨瀏覽器而銷毀。當(dāng)關(guān)閉一個頁面時,不影響會話cookie的銷毀。會話cookie就像我們沒有辦理積分卡時,單一的買賣過程,離開之后,信息則銷毀。

持久cookie則是設(shè)定了它的生命周期expires,此時,cookie像商品一樣,有個保質(zhì)期,關(guān)閉瀏覽器之后,它不會銷毀,直到設(shè)定的過期時間。對于持久cookie,可以在同一個瀏覽器中傳遞數(shù)據(jù),比如,你在打開一個淘寶頁面登陸后,你在點(diǎn)開一個商品頁面,依然是登錄狀態(tài),即便你關(guān)閉了瀏覽器,再次開啟瀏覽器,依然會是登錄狀態(tài)。這就是因?yàn)閏ookie自動將數(shù)據(jù)傳送到服務(wù)器端,在反饋回來的結(jié)果。持久cookie就像是我們辦理了一張積分卡,即便離開,信息一直保留,直到時間到期,信息銷毀。


4、簡單的使用cookie的代碼

cookie的幾種常見屬性:document.cookie="key=value;expires=失效時間;path=路徑;domain=域名;secure;(secure表安全級別),

cookie以字符串的形式保存在瀏覽器中。下面貼段代碼出來,是一個類似購物網(wǎng)站的將商品添加到購物車,再從購物車還原商品信息的過程,是自己用原生JS封裝的函數(shù)。

封裝的cookie的存入,讀取以及刪除的函數(shù):(這里是將信息以對象的形式存放到cookie中的,會用到JSON的知識)

[javascript] view plain copy
  1. // key : cookie 名  
  2. // value : cookie 值  
  3. // options : 可選配置參數(shù)  
  4. //      options = {  
  5. //          expires : 7|new Date(), // 失效時間  
  6. //          path : "/", // 路徑  
  7. //          domain : "", // 域名  
  8. //          secure : true // 安全連接  
  9. //      }  
  10. function cookie(key, value, options) {  
  11.     /* read 讀取 */  
  12.     // 如果沒有傳遞 value ,則表示根據(jù) key 讀取 cookie 值  
  13.     if (typeof value === "undefined") { // 讀取  
  14.         // 獲取當(dāng)前域下所有的 cookie,保存到 cookies 數(shù)組中  
  15.         var cookies = document.cookie.split("; ");  
  16.         // 遍歷 cookies 數(shù)組中的每個元素  
  17.         for (var i = 0, len = cookies.length; i < len; i++) {  
  18.             // cookies[i] : 當(dāng)前遍歷到的元素,代表的是 "key=value" 意思的字符串,  
  19.             // 將字符串以 = 號分割返回的數(shù)組中第一個元素表示 key,  
  20.             // 第二個元素表示 value  
  21.             var cookie = cookies[i].split("=");  
  22.             // 判斷是否是要查找的 key,對查找的 key 、value 都要做解碼操作  
  23.             if (decodeURIComponent(cookie[0]) === key) {  
  24.                 return decodeURIComponent(cookie[1]);  
  25.             }  
  26.         }  
  27.         // 沒有查找到指定的 key 對應(yīng)的 value 值,則返回 null  
  28.         return null;  
  29.     }  
  30.   
  31.     /* 存入 設(shè)置 */  
  32.     // 設(shè)置 options 默認(rèn)為空對象  
  33.     options = options || {};  
  34.     // key = value,對象 key,value 編碼  
  35.     var cookie = encodeURIComponent(key) + "=" + encodeURIComponent(value);  
  36.     // 失效時間  
  37.     if ((typeof options.expires) !== "undefined") { // 有配置失效時間  
  38.         if (typeof options.expires === "number") { // 失效時間為數(shù)字  
  39.             var days = options.expires,   
  40.                 t = options.expires = new Date();  
  41.             t.setDate(t.getDate() + days);  
  42.         }   
  43.         cookie += ";expires=" + options.expires.toUTCString();  
  44.     }  
  45.     // 路徑  
  46.     if (typeof options.path !== "undefined")  
  47.         cookie += ";path=" + options.path;  
  48.     // 域名  
  49.     if (typeof options.domain !== "undefined")  
  50.         cookie += ";domain=" + options.domain;  
  51.     // 安全連接  
  52.     if (options.secure)  
  53.         cookie += ";secure";  
  54.   
  55.     // 保存  
  56.     document.cookie = cookie;  
  57. }  
  58.   
  59. // 從所有的 cookie 中刪除指定的 cookie  
  60. function removeCookie(key, options) {  
  61.     options = options || {};  
  62.     options.expires = -1; // 將失效時間設(shè)置為 1 天前  
  63.     cookie(key, "", options);  
  64. }  

下面是商品詳情頁的JS代碼

[javascript] view plain copy
  1. // 找到所有的 “添加到購物車” 超級鏈接  
  2.             var links = $("a", $("#tab"));  
  3.             // 循環(huán),為每個 “添加到購物車” 的超級鏈接添加點(diǎn)擊事件  
  4.             for (var i = 0, len = links.length; i < len; i++) {  
  5.                 links[i].onclick = function(){  
  6.                     // 獲取當(dāng)前超級鏈接所在行的所有單元格  
  7.                     var _cells = this.parentNode.parentNode.cells;  
  8.                     // 獲取到即將添加到購物車中的商品信息  
  9.                     var _id = _cells[0].innerHTML,  
  10.                         _name = _cells[1].innerHTML,  
  11.                         _price = _cells[2].innerHTML;  
  12.                     // 將商品信息包裝到一個對象中  
  13.                     var product = {  
  14.                         id : _id,  
  15.                         name : _name,  
  16.                         price : _price,  
  17.                         amount : 1  
  18.                     };  
  19.   
  20.                     /* 將當(dāng)前選購的商品對象保存到 cookie 中去 */  
  21.                     // 從 cookie 中讀取已有的保存購物車的數(shù)組結(jié)構(gòu)  
  22.                     var _products = cookie("products");  
  23.                     if (_products === null// cookie 中不存在 products 名的 cookie  
  24.                         _products = [];  
  25.                     else // 存在,則解析 cookie 讀取到的字符串為 數(shù)組 結(jié)構(gòu)  
  26.                         _products = JSON.parse(_products);  
  27.   
  28.                     // 將當(dāng)前選購的商品追加到數(shù)組中保存  
  29.                     _products.push(product);  
  30.                     // 繼續(xù)將 _products 數(shù)組內(nèi)容存回 cookie  
  31.                     cookie("products", JSON.stringify(_products), {expires:7});  
  32.                 }  
  33.             }  
html代碼,css代碼大家可以自己寫

[javascript] view plain copy
  1. <table id="tab">  
  2.         <tr>  
  3.             <td>序號</td>  
  4.             <td>名稱</td>  
  5.             <td>價格</td>  
  6.             <td>操作</td>  
  7.         </tr>  
  8.         <tr>  
  9.             <td>1</td>  
  10.             <td>空調(diào)</td>  
  11.             <td>3999</td>  
  12.             <td><a href="javascript:void(0);">添加到購物車</a></td>  
  13.         </tr>  
  14.         <tr>  
  15.             <td>2</td>  
  16.             <td>風(fēng)扇</td>  
  17.             <td>288</td>  
  18.             <td><a href="javascript:void(0);">添加到購物車</a></td>  
  19.         </tr>  
  20.     </table>  
  21.     <a href="cart_購物車.html" target="_blank">查看購物車</a>  

購物車還原商品信息:

[javascript] view plain copy
  1. // 從 cookie 中讀取購物車已有的商品信息  
  2.             var _products = cookie("products");  
  3.             // 判斷購物車是否有商品  
  4.             if (_products === null || (_products = JSON.parse(_products)).length === 0)  
  5.                 return;  
  6.   
  7.             // 如果有商品,則顯示到頁面中  
  8.             $(".result")[0].innerHTML = "";  
  9.             for (var i = 0, len = _products.length; i < len; i++) {  
  10.                 // 當(dāng)前遍歷到的商品對象  
  11.                 var prod = _products[i];  
  12.                 // 克隆 .row 的節(jié)點(diǎn)  
  13.                 var _row = $(".row")[0].cloneNode(true);  
  14.                 // 將當(dāng)前商品對象的信息替換節(jié)點(diǎn)中對應(yīng)的部分,用class名獲取到的節(jié)點(diǎn)返回類型是一個數(shù)組所以要在后面加上[0]  
  15.                 $(".index", _row)[0].innerHTML = prod.id; // 編號  
  16.                 $(".name", _row)[0].innerHTML = prod.name; // 名稱  
  17.                 $(".price", _row)[0].innerHTML = prod.price; // 價格  
  18.                 $(".amount", _row)[0].innerHTML = prod.amount; // 數(shù)量  
  19.                 $(".oper", _row)[0].innerHTML = "<a href='javascript:void(0);'>刪除</a>"  
  20.   
  21.                 // 將克隆的節(jié)點(diǎn)副本追加到 .result 的 div 中  
  22.                 $(".result")[0].appendChild(_row);  
  23.             };  
  24.   
  25.             // 為每個 “刪除” 的超級鏈接綁定點(diǎn)擊事件  
  26.             var links = $("a", $("#container"));  
  27.             for (var i = 0, len = links.length; i < len; i++) {  
  28.                 // links[i].index = i; // 為當(dāng)前遍歷到的超級鏈接附加數(shù)據(jù)  
  29.                 links[i].product = _products[i]; //   
  30.                 links[i].onclick = function(){  
  31.                     // alert("你點(diǎn)擊的是第" + (this.index + 1) + "個連接");  
  32.                     var index = inArray(this.product, _products);  
  33.                       
  34.                     if (index !== -1) {  
  35.                         _products.splice(index, 1);  
  36.                     }  
  37.                     // 更新 cookie  
  38.                     cookie("products", JSON.stringify(_products), {expires:7});  
  39.   
  40.                     // 找出頁面中待刪除的行  
  41.                     var _row = this.parentNode.parentNode;  
  42.                     _row.parentNode.removeChild(_row);  
  43.                 };  
  44.             }  
這里的$(' ')函數(shù)是自己封裝的函數(shù),用于獲取到DOM節(jié)點(diǎn),可以看下我關(guān)于getElementsByClassName的兼容那篇文章。

藍(lán)藍(lán)設(shè)計sillybuy.com )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計、 網(wǎng)站建設(shè) 、平面設(shè)計服務(wù)

你真的了解盒模型么

seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里

說到前端, 大家第一反應(yīng)是不是都是vue、react、webpack等這些大大小小的框架或者工具, 但其實(shí)這些都是和js相關(guān)的, 真正的樣式會被大家忽略。其實(shí)真正呈現(xiàn)給大家看到華麗的頁面, 都是樣式才讓他們多了那份色彩。那么大家覺得簡單的css樣式, 真的簡單么? 讓我們一起來看下, 開啟css的入坑之旅, 今天一起跟大家簡單聊聊盒模型的相關(guān)問題......

盒模型

百度知道對此的解釋, 很有意思, 在此引用一下

CSS盒子模型, 內(nèi)容(CONTENT)就是盒子里裝的東西; 而填充(PADDING)就是怕盒子里裝的東西(貴重的)損壞而添加的泡沫或者其它抗震的輔料; 邊框(BORDER)就是盒子本身了; 至于邊界(MARGIN)則說明盒子擺放的時候的不能全部堆在一起,要留一定空隙保持通風(fēng),同時也為了方便取出。 —— 百度知道

640?wx_fmt=png&wxfrom=5&wx_lazy=1

這段描述很有趣, 很好的解釋margin、border、padding之間的關(guān)系, 不同模式下, 盒模型的width也是不同的, 那么好, 盒模型的第一個坑來了, width的范圍問題。

通常瀏覽器里, 盒模型的分為兩種模式, 兩種模式(怪異模式和標(biāo)準(zhǔn)模式)下width和height的值不同, 怪異模式的width和height包含border、padding和content, 而標(biāo)準(zhǔn)模式下的width和height只包含content, 這就是為啥有些瀏覽器渲染出來的dom標(biāo)簽排版會亂。解決也很簡單, 在標(biāo)簽的上面, 加上doctype的設(shè)置就好了, 讓瀏覽器統(tǒng)一用同一種標(biāo)準(zhǔn)去解析頁面。 怪異模式(左圖)和標(biāo)準(zhǔn)模式(右圖)的如下:

640?wx_fmt=png

當(dāng)然, 還有用來改變盒模型width范圍的一個css3的屬性, box-sizing:

當(dāng)設(shè)置為'border-box'時, width = border + padding + content;

當(dāng)設(shè)置為'content-box'時, width = content。

640?wx_fmt=png


    
  1.   <div class="wrapper z1"></div>

  2.   <div class="wrapper z2"></div>


    

   .wrapper{

  1.     width: 100px;

  2.     height: 50px;

  3.     padding: 10px;

  4.     background-color: #dedede;

   }

  1. .z1{

  2.     box-sizing: border-box;

  3. }

  4. .z2{

  5.     box-sizing: content-box;

     }

那么第一個div的實(shí)際寬度為100px, 第二個div的實(shí)際寬度為120px。

說完盒模型的padding和border, 那么再來吐槽下margin, 盒模型的margin的折疊(margin collapsing)問題, 有些也叫外邊距合并。

通常我們說的折疊, 都是垂直方向上的折疊, 水平方向是不存在的。標(biāo)準(zhǔn)模式下, 上下兩個兄弟的塊級元素, margin是會重疊的, 并且以最大的那個間距為準(zhǔn)(都為正數(shù))。

比如下面這段代碼:


    

   <div class="wrapper"></div>

   <div class="wrapper"></div>


    

   .wrapper{

  1.      width: 100px;

  2.      height: 50px;

  3.      margin: 10px;

  4.      background-color: #dedede;

  5.   }

640?wx_fmt=png

上圖灰色為重疊部分, 重疊10px的間距。

既然兄弟盒模型會有margin折疊, 那么父子呢? 答案是一定的, 父子也存在margin折疊的問題, 只不過條件稍微苛刻一點(diǎn), 我們一起來看下。 父子組件的折疊觸發(fā), 要求不能有間隙, 就是父組件不能設(shè)置border或padding值, 不能有空余的內(nèi)容, 且同時有margin值, 比如下面這段代碼:


    
  1. <div class="outer">

  2.   <div class="inner"></div>

  3. </div>


    

   .outer{

  1.     width: 200px;

  2.     height: 100px;

  3.     margin: 10px;

  4.     background-color: #dedede;

   }

   .inner{

  1.      width: 100px;

  2.      height: 50px;

  3.      margin: 10px;

  4.      background-color: #bcbcbc;

   }

當(dāng)然, 折疊后的空余部分, 也是取較大值, 且折疊觸發(fā), 只存在于垂直方向。

640?wx_fmt=png

上圖灰色為重疊部分, 重疊10px的間距。

剛才提到一個詞"間隙", 如果有間隙的話是不會觸發(fā)折疊的, 比如父級元素設(shè)置了padding, 或者子元素都設(shè)置了相對定位和top值等等。如下圖:

640?wx_fmt=png

看到這里, 我想有些同學(xué)會問了, 對于這些 margin collapsing, 有沒有一個統(tǒng)一的整理, 對于大轉(zhuǎn)轉(zhuǎn)的FEer, 我們當(dāng)然想到了大家的前面, 請看下面:

  • 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ī)則是特殊的不折疊的情況, 簡單翻譯過來(僅供參考):

  • 浮動的盒模型不會margin折疊

  • 創(chuàng)建BFC與子不折疊

  • 設(shè)置定位的盒模型不會折疊

  • 行內(nèi)塊級元素的盒模型不折疊

  • 兄弟元素有間隙不折疊

  • 父子盒模型元素, 孩子元素有border、padding、有浮動就不折疊

  • height為auto、min-height為0的塊級盒模型, 和它的最后一個沒有border和padding的孩子盒模型底邊距折疊, 且孩子的底部外邊距和被清除浮動上邊距有間隙不折疊。

  • 如果min-height為0, 上下border、上下padding都為0, height為0或auto, 且沒有行內(nèi)盒模型, 他的孩子節(jié)點(diǎn)都會折疊

有點(diǎn)晦澀難懂, 大家不妨消化一下。說到這, 再補(bǔ)充一下, 盒模型margin折疊的計算問題, 總結(jié)了以下幾點(diǎn):

  • 同為正值時, 取較大者為兩者為間距

  • 一正一負(fù)時, 正負(fù)相加為間距, 若結(jié)果為負(fù)值, 則兩者部分重合

  • 都為負(fù)值時, 兩者重合, 且重合部分為絕對值大者

舉個例子:


    
  1.    <div class="wrapper z-01"></div>

  2.    <div class="wrapper z-02"></div>


    
  1.    .wrapper{

  2.        width: 100px;

  3.        height: 50px;

  4.        background-color: #dedede;

  5.    }

  6.    .z-01{

  7.        margin: -10px;

  8.    }

  9.    .z-02{

  10.        margin: -15px;

  11.    }

兩者都為負(fù)值, 兩個div上下重合, 且重合間距為15px。

暫時就想到這么多, css的學(xué)習(xí)之路任重而道遠(yuǎn), 盒模型又是重中之重。上面有描述不對的地方也歡迎各位同學(xué)批評指正, 也歡迎大家來到大轉(zhuǎn)轉(zhuǎn)FE做客, 一起討論一起研究前端的技術(shù)問題。志同道合的同學(xué), 也歡迎加入我們轉(zhuǎn)轉(zhuǎn)FE團(tuán)隊, 咱們一起打拼。

藍(lán)藍(lán)設(shè)計sillybuy.com )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計、 網(wǎng)站建設(shè) 、平面設(shè)計服務(wù)

js設(shè)計模式——代理模式proxy

seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里

什么是代理模式

代理模式是為一個對象提供一個代用品或占位符,以便控制對它的訪問。

(可以想象一下明星與經(jīng)紀(jì)人的關(guān)系,明星是請求的本體,經(jīng)紀(jì)人就是代理proxy)

如何實(shí)現(xiàn)代理模式

代理對象內(nèi)部含有對本體對象的引用,因而可以與調(diào)用本體的相關(guān)方法;同時,代理對象提供與本體對象相同的接口,方便在任何時刻代理本體對象。

例子(上代碼)

代理模式的變體有很多,有:保護(hù)代理、虛擬代理緩存代理、防火墻代理、遠(yuǎn)程代理、智能引用代理、寫時復(fù)制代理。具體介紹前三種。

(1)保護(hù)代理

保護(hù)代理主要用于控制不同權(quán)限的對象對本體對象的訪問權(quán)限。比如很多人想訪問本體A,如果有代理B存在的話,B會首先剔除不滿足A的訪問條件的訪問者,符合條件的才能訪問。

作用:過濾請求

例如:權(quán)限的劃分和管理就是使用保護(hù)代理proxy來完成的。

注冊普通用戶:code為“001”

論壇管理者   :code為“002”

系統(tǒng)管理者   :code為“003”

游        客    :code為“000”

論壇開放了四個基礎(chǔ)功能

1,發(fā)帖

2,帖子審核

3,清除帖子

4,留言

游客不具備任何操作權(quán)限,注冊用戶只能發(fā)帖,論壇管理者可以審核以及刪帖操作,系統(tǒng)管理者具有所有功能權(quán)限。

[javascript] view plain copy
  1. //用戶本體  
  2. function User(name,code){  
  3.     this.name = name ;  
  4.     this.code = code ;  
  5. } ;  
  6. User.prototype = {  
  7.     getName : function(){  
  8.         return this.name ;  
  9.     } ,  
  10.     getCode : function(){  
  11.         return this.code ;  
  12.     } ,  
  13.     post : function(){  
  14.         console.log("發(fā)帖子!") ;  
  15.     } ,  
  16.     remove : function(){  
  17.         console.log("刪除帖子!") ;  
  18.     } ,  
  19.     check : function(){  
  20.         console.log("審核帖子!") ;  
  21.     } ,  
  22.     comment : function(){  
  23.         console.log("回復(fù)帖子!") ;  
  24.     }  
  25. } ;  
  26. //代理論壇類  
  27. function Forum(user){  
  28.     this.user = user ;  
  29. } ;  
  30. Forum.prototype = {  
  31.     getUser : function(){  
  32.         return this.user ;  
  33.     } ,  
  34.     post : function(){  
  35.         if(this.user.getCode() == "001" || this.user.getCode() == "003"){  
  36.             return this.user.post() ;  
  37.         }  
  38.         console.log("沒權(quán)限發(fā)帖子!") ;  
  39.     } ,  
  40.     remove : function(){  
  41.         if(this.user.getCode() == "002" || this.user.getCode() == "003"){  
  42.             return this.user.remove() ;  
  43.         }  
  44.         console.log("沒權(quán)限刪除帖子!") ;  
  45.     } ,  
  46.     check : function(){  
  47.         if(this.user.getCode() == "002" || this.user.getCode() == "003"){  
  48.             return this.user.check() ;  
  49.         }  
  50.         console.log("沒權(quán)限審核帖子!") ;  
  51.     } ,  
  52.     comment : function(){  
  53.         if(this.user.getCode() == "003"){  
  54.             return this.user.comment() ;  
  55.         }  
  56.         console.log("沒權(quán)限回復(fù)帖子!") ;  
  57.     }  
  58. } ;  
  59. //功能測試  
  60. function ForumClient(){  
  61.      this.run = function(){  
  62.          new Forum(new User("bigbear","003")).check() ; // 審核帖子  
  63.      }  
  64.  } ;  

在該例子中,論壇代理有與user本體相同的接口,可以在滿足條件時,執(zhí)行與本體相同的代碼,與調(diào)用方法的人而言,是不透明的,我實(shí)現(xiàn)了調(diào)用,但不在乎是通過代理實(shí)現(xiàn)的,還是本體實(shí)現(xiàn)的。

本案例來源:大熊君大話設(shè)計模式JavaScript

(2)虛擬代理

虛擬代理是將調(diào)用本體方法的請求進(jìn)行管理,等到本體適合執(zhí)行時,再執(zhí)行。

作用:將開銷很大的對象,延遲到真正需要它的時候再執(zhí)行。

比如:利用虛擬代理實(shí)現(xiàn)圖片預(yù)加載功能:

[javascript] view plain copy
  1. /**在圖片預(yù)加載中實(shí)現(xiàn)虛擬代理 */  
  2. var myImage = (function(){  
  3.     var imageNode = document.createElement('img');  
  4.     document.body.appendChild(imageNode);  
  5.   
  6.     return {  
  7.         setSrc: function(src){  
  8.             imageNode.src = src;  
  9.         }  
  10.     }  
  11. })()  
  12.   
  13. //代理類  
  14. var proxyImage = (function(){  
  15.     var img = new Image();  
  16.     img.onload = function(){  
  17.         myImage.setSrc(this.src);  
  18.     }  
  19.   
  20.     return {  
  21.         setSrc: function(src){  
  22.             myImage.setSrc('本地的圖片地址');  
  23.             img.src = src; //緩存完畢之后會觸發(fā)img的onload事件  
  24.         }  
  25.     }  
  26. })()  

比如:利用虛擬代理合并HTTP請求

[javascript] view plain copy
  1. /**虛擬代理合并http請求 */  
  2. //通過代理函數(shù)收集一段時間的請求,一次性發(fā)送給服務(wù)器,減少頻繁的網(wǎng)絡(luò)請求帶來的極大開銷  
  3. //模擬向服務(wù)器發(fā)送同步請求的函數(shù)  
  4. var synchronousFile = function(id){  
  5.     console.log('開始同步上傳文件,id為:'+id);  
  6. }  
  7.   
  8. //代理類收集一段時間的同步請求,統(tǒng)一發(fā)送  
  9. var proxySynchronousFile = (function(){  
  10.     var cache = [], //設(shè)置緩存數(shù)組  
  11.         timer; //定時器,通過閉包訪問定時器的引用  
  12.   
  13.     return function(id){  
  14.         cache.push(id);  
  15.         if(timer){  
  16.             return;  
  17.         }  
  18.         timer = setTimeout(function(){  
  19.             synchronousFile(cache.join(','));  
  20.             clearTimeout(timer);  
  21.             timer = null;  
  22.             cache.length = 0;  
  23.         },2000)  
  24.     }  
  25. })()  
  26.   
  27. var checkbox = document.getElementsByTagName('input');  
  28.   
  29. for(var i=0,c;c=checkbox[i++];){  
  30.     c.onclick = function(){  
  31.         if(this.check === true){  
  32.             proxySynchronousFile(this.id);  
  33.         }  
  34.     }  
  35. }  

在這些例子中,虛擬代理對請求進(jìn)行擱置處理,等到合適的時機(jī),對本體的接口進(jìn)行調(diào)用,可以有效提升Web性能。

(3)緩存代理

緩存代理可以為開銷大的一些運(yùn)算結(jié)果提供暫時性的存儲,如果再次傳進(jìn)相同的參數(shù)是,直接返回結(jié)果,避免大量重復(fù)計算。

[javascript] view plain copy
  1. /**創(chuàng)建緩存代理工廠 */  
  2. //將緩存代理與工廠模式相結(jié)合,創(chuàng)建多種運(yùn)算的緩存代理  
  3. var mult = function(){  
  4.     var a = 1;  
  5.     for(var i=0;i<arguments.length;i++){  
  6.         a = a*arguments[i];  
  7.     }  
  8.     return a;  
  9. }  
  10. var plus = function(){  
  11.     var a = 0;  
  12.     for(var i=0; i<arguments.length; i++){  
  13.         a = a + arguments[i];  
  14.     }  
  15.     return a;  
  16. }  
  17. //高階函數(shù):將函數(shù)作為參數(shù)或者返回值的函數(shù)  
  18. var proxyFactory = function(fn) {  
  19.     var cache = {}; //參數(shù)緩存列表  
  20.     return function(){  
  21.         var args = Array.prototype.join.call(arguments,',');  
  22.         if(args in cache){  
  23.             return cache[args];  
  24.         }  
  25.         //參數(shù)屬性對應(yīng)的是函數(shù)  
  26.         return cache[args] = fn.apply(this,arguments);  
  27.     }  
  28. }  
  29.   
  30. //測試  
  31. var proxyMult = proxyFactory(mult),  
  32.     proxyPlus = proxyFactory(plus);  
  33.   
  34. console.log(proxyMult(1,2,3,4));  
  35. console.log(proxyMult(1,2,3,4));  
  36. console.log(proxyPlus(5,6,7,8));  
  37. console.log(proxyPlus(5,6,7,8));  

什么情況下使用代理

當(dāng)我們需要使用的對象很復(fù)雜或者需要很長時間去構(gòu)造,這時就可以使用代理模式(Proxy)。例如:如果構(gòu)建一個對象很耗費(fèi)時間和計算機(jī)資源,代理模式(Proxy)允許我們控制這種情況,直到我們需要使用實(shí)際的對象。一個代理(Proxy)通常包含和將要使用的對象同樣的方法,一旦開始使用這個對象,這些方法將通過代理(Proxy)傳遞給實(shí)際的對象。

比如上面的代碼:需要花很長的時間加載很多圖片,復(fù)雜的運(yùn)算過程,頻繁的多次請求處理等;都可以用到代理模式。

小結(jié)

代理模式的一個好處就是對外部提供統(tǒng)一的接口方法,而代理類在接口中實(shí)現(xiàn)對真實(shí)類的附加操作行為,從而可以在不影響外部調(diào)用情況下,進(jìn)行系統(tǒng)擴(kuò)展。也就是說,我要修改真實(shí)角色的操作的時候,盡量不要修改他,而是在外部在“包”一層進(jìn)行附加行為,即代理類。

藍(lán)藍(lán)設(shè)計sillybuy.com )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計、 網(wǎng)站建設(shè) 、平面設(shè)計服務(wù)

移動端界面設(shè)計規(guī)范(Android尺寸篇)

藍(lán)藍(lán)設(shè)計的小編

"這是移動端界面設(shè)計規(guī)范尺寸安卓篇也是第二篇小總結(jié),主講如何一稿去適配眾多的安卓機(jī)型。如果你有興趣也可以去官方研讀下設(shè)計文檔,這樣的話,就可以比較系統(tǒng)的掌握知識。

Axure原型設(shè)計:仿移動端HTML5滑動介紹頁面

藍(lán)藍(lán)設(shè)計的小編

每次QQ有新的重要版本發(fā)布時,移動端的介紹使用了HTML5頁面,通過7個獨(dú)立的頁面簡潔地介紹了它的主要功能。在每個頁面切換時伴隨著背景圖片的切換,讓介紹頁面生動有趣。

你真的了解盒模型么

seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里

說到前端, 大家第一反應(yīng)是不是都是vue、react、webpack等這些大大小小的框架或者工具, 但其實(shí)這些都是和js相關(guān)的, 真正的樣式會被大家忽略。其實(shí)真正呈現(xiàn)給大家看到華麗的頁面, 都是樣式才讓他們多了那份色彩。那么大家覺得簡單的css樣式, 真的簡單么? 讓我們一起來看下, 開啟css的入坑之旅, 今天一起跟大家簡單聊聊盒模型的相關(guān)問題......

盒模型

百度知道對此的解釋, 很有意思, 在此引用一下

CSS盒子模型, 內(nèi)容(CONTENT)就是盒子里裝的東西; 而填充(PADDING)就是怕盒子里裝的東西(貴重的)損壞而添加的泡沫或者其它抗震的輔料; 邊框(BORDER)就是盒子本身了; 至于邊界(MARGIN)則說明盒子擺放的時候的不能全部堆在一起,要留一定空隙保持通風(fēng),同時也為了方便取出。 —— 百度知道

640?wx_fmt=png&wxfrom=5&wx_lazy=1

這段描述很有趣, 很好的解釋margin、border、padding之間的關(guān)系, 不同模式下, 盒模型的width也是不同的, 那么好, 盒模型的第一個坑來了, width的范圍問題。

通常瀏覽器里, 盒模型的分為兩種模式, 兩種模式(怪異模式和標(biāo)準(zhǔn)模式)下width和height的值不同, 怪異模式的width和height包含border、padding和content, 而標(biāo)準(zhǔn)模式下的width和height只包含content, 這就是為啥有些瀏覽器渲染出來的dom標(biāo)簽排版會亂。解決也很簡單, 在標(biāo)簽的上面, 加上doctype的設(shè)置就好了, 讓瀏覽器統(tǒng)一用同一種標(biāo)準(zhǔn)去解析頁面。 怪異模式(左圖)和標(biāo)準(zhǔn)模式(右圖)的如下:

640?wx_fmt=png

當(dāng)然, 還有用來改變盒模型width范圍的一個css3的屬性, box-sizing:

當(dāng)設(shè)置為'border-box'時, width = border + padding + content;

當(dāng)設(shè)置為'content-box'時, width = content。

640?wx_fmt=png


    
  1.   <div class="wrapper z1"></div>

  2.   <div class="wrapper z2"></div>


    

   .wrapper{

  1.     width: 100px;

  2.     height: 50px;

  3.     padding: 10px;

  4.     background-color: #dedede;

   }

  1. .z1{

  2.     box-sizing: border-box;

  3. }

  4. .z2{

  5.     box-sizing: content-box;

     }

那么第一個div的實(shí)際寬度為100px, 第二個div的實(shí)際寬度為120px。

說完盒模型的padding和border, 那么再來吐槽下margin, 盒模型的margin的折疊(margin collapsing)問題, 有些也叫外邊距合并。

通常我們說的折疊, 都是垂直方向上的折疊, 水平方向是不存在的。標(biāo)準(zhǔn)模式下, 上下兩個兄弟的塊級元素, margin是會重疊的, 并且以最大的那個間距為準(zhǔn)(都為正數(shù))。

比如下面這段代碼:


    

   <div class="wrapper"></div>

   <div class="wrapper"></div>


    

   .wrapper{

  1.      width: 100px;

  2.      height: 50px;

  3.      margin: 10px;

  4.      background-color: #dedede;

  5.   }

640?wx_fmt=png

上圖灰色為重疊部分, 重疊10px的間距。

既然兄弟盒模型會有margin折疊, 那么父子呢? 答案是一定的, 父子也存在margin折疊的問題, 只不過條件稍微苛刻一點(diǎn), 我們一起來看下。 父子組件的折疊觸發(fā), 要求不能有間隙, 就是父組件不能設(shè)置border或padding值, 不能有空余的內(nèi)容, 且同時有margin值, 比如下面這段代碼:


    
  1. <div class="outer">

  2.   <div class="inner"></div>

  3. </div>


    

   .outer{

  1.     width: 200px;

  2.     height: 100px;

  3.     margin: 10px;

  4.     background-color: #dedede;

   }

   .inner{

  1.      width: 100px;

  2.      height: 50px;

  3.      margin: 10px;

  4.      background-color: #bcbcbc;

   }

當(dāng)然, 折疊后的空余部分, 也是取較大值, 且折疊觸發(fā), 只存在于垂直方向。

640?wx_fmt=png

上圖灰色為重疊部分, 重疊10px的間距。

剛才提到一個詞"間隙", 如果有間隙的話是不會觸發(fā)折疊的, 比如父級元素設(shè)置了padding, 或者子元素都設(shè)置了相對定位和top值等等。如下圖:

640?wx_fmt=png

看到這里, 我想有些同學(xué)會問了, 對于這些 margin collapsing, 有沒有一個統(tǒng)一的整理, 對于大轉(zhuǎn)轉(zhuǎn)的FEer, 我們當(dāng)然想到了大家的前面, 請看下面:

  • 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ī)則是特殊的不折疊的情況, 簡單翻譯過來(僅供參考):

  • 浮動的盒模型不會margin折疊

  • 創(chuàng)建BFC與子不折疊

  • 設(shè)置定位的盒模型不會折疊

  • 行內(nèi)塊級元素的盒模型不折疊

  • 兄弟元素有間隙不折疊

  • 父子盒模型元素, 孩子元素有border、padding、有浮動就不折疊

  • height為auto、min-height為0的塊級盒模型, 和它的最后一個沒有border和padding的孩子盒模型底邊距折疊, 且孩子的底部外邊距和被清除浮動上邊距有間隙不折疊。

  • 如果min-height為0, 上下border、上下padding都為0, height為0或auto, 且沒有行內(nèi)盒模型, 他的孩子節(jié)點(diǎn)都會折疊

有點(diǎn)晦澀難懂, 大家不妨消化一下。說到這, 再補(bǔ)充一下, 盒模型margin折疊的計算問題, 總結(jié)了以下幾點(diǎn):

  • 同為正值時, 取較大者為兩者為間距

  • 一正一負(fù)時, 正負(fù)相加為間距, 若結(jié)果為負(fù)值, 則兩者部分重合

  • 都為負(fù)值時, 兩者重合, 且重合部分為絕對值大者

舉個例子:


    
  1.    <div class="wrapper z-01"></div>

  2.    <div class="wrapper z-02"></div>


    
  1.    .wrapper{

  2.        width: 100px;

  3.        height: 50px;

  4.        background-color: #dedede;

  5.    }

  6.    .z-01{

  7.        margin: -10px;

  8.    }

  9.    .z-02{

  10.        margin: -15px;

  11.    }

兩者都為負(fù)值, 兩個div上下重合, 且重合間距為15px。

暫時就想到這么多, css的學(xué)習(xí)之路任重而道遠(yuǎn), 盒模型又是重中之重。上面有描述不對的地方也歡迎各位同學(xué)批評指正, 也歡迎大家來到大轉(zhuǎn)轉(zhuǎn)FE做客, 一起討論一起研究前端的技術(shù)問題。志同道合的同學(xué), 也歡迎加入我們轉(zhuǎn)轉(zhuǎn)FE團(tuán)隊, 咱們一起打拼。

藍(lán)藍(lán)設(shè)計sillybuy.com )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計、 網(wǎng)站建設(shè) 平面設(shè)計服務(wù)

jQuery與Ajax的應(yīng)用

seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里


一、Ajax的XMLHttpRrequest對象

Ajax的核心是XMLHttpRequest對象(發(fā)送異步請求、接受響應(yīng)及執(zhí)行回調(diào)),它是ajax實(shí)現(xiàn)的關(guān)鍵

XMLHttpRequest對象的open()方法與send()方法

方法 描述
open(method,url,async)

規(guī)定請求的類型、URL 以及是否異步處理請求。

  • method:請求的類型;GET 或 POST
  • url:文件在服務(wù)器上的位置
  • async:true(異步)或 false(同步)
send(string)

將請求發(fā)送到服務(wù)器。

    • string:僅用于 POST 請求

請求類型,GET 還是 POST?

與 POST 相比,GET 更簡單也更快,并且在大部分情況下都能用。

然而,在以下情況中,請使用 POST 請求:

  • 無法使用緩存文件(更新服務(wù)器上的文件或數(shù)據(jù)庫)
  • 向服務(wù)器發(fā)送大量數(shù)據(jù)(POST 沒有數(shù)據(jù)量限制)
  • 發(fā)送包含未知字符的用戶輸入時,POST 比 GET 更穩(wěn)定也更可靠

(1). GET請求

[javascript] view plain copy
  1. //簡單的get請求,可能得到的是緩存的結(jié)果  
  2. xmlhttp.open("GET","demo_get.asp",true);  
  3. xmlhttp.send();  
  4. //為了避免上述情況,請向 URL 添加一個唯一的ID  
  5. xmlhttp.open("GET","demo_get.asp?t=" + Math.random(),true);  
  6. xmlhttp.send();  
  7. //若希望通過 GET 方法發(fā)送信息,請向 URL 添加信息  
  8. xmlhttp.open("GET","demo_get2.asp?fname=Bill&lname=Gates",true);  
  9. xmlhttp.send();  

(2). POST請求

[javascript] view plain copy
  1. //簡單的POST請求  
  2. xmlhttp.open("POST","demo_post.asp",true);  
  3. xmlhttp.send();  
  4. //如果需要像HTML表單那樣POST數(shù)據(jù),請使用 setRequestHeader()來添加HTTP頭。  
  5. //然后在send()方法中規(guī)定您希望發(fā)送的數(shù)據(jù)  
  6. xmlhttp.open("POST","ajax_test.asp",true);  
  7. xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");  
  8. xmlhttp.send("fname=Bill&lname=Gates");  
方法 描述
setRequestHeader(header,value)

向請求添加 HTTP 頭。

  • header: 規(guī)定頭的名稱
  • value: 規(guī)定頭的值


async參數(shù)設(shè)置

XMLHttpRequest對象如果要用于AJAX的話,其open()方法的async參數(shù)必須設(shè)置為true

通過 AJAX,JavaScript 無需等待服務(wù)器的響應(yīng),而是:

  • 在等待服務(wù)器響應(yīng)時執(zhí)行其他腳本
  • 當(dāng)響應(yīng)就緒后對響應(yīng)進(jìn)行處理

(1). 當(dāng)使用 async=true 時,請規(guī)定在響應(yīng)處于 onreadystatechange 事件中的就緒狀態(tài)時執(zhí)行的函數(shù):

[javascript] view plain copy
  1. xmlhttp.onreadystatechange=function()  
  2.   {  
  3.   if (xmlhttp.readyState==4 && xmlhttp.status==200)  
  4.     {    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;  
  5.     }  
  6.   }  

(2). 當(dāng)您使用 async=false 時,請不要編寫 onreadystatechange 函數(shù) - 把代碼放到 send() 語句后面即可:

[javascript] view plain copy
  1. xmlhttp.open("GET","test1.txt",false);  
  2. xmlhttp.send();  
  3. document.getElementById("myDiv").innerHTML=xmlhttp.responseText;  

服務(wù)器響應(yīng)

使用 XMLHttpRequest 對象的 responseText 或 responseXML 屬性。

屬性 描述
responseText 獲得字符串形式的響應(yīng)數(shù)據(jù)。
responseXML 獲得 XML 形式的響應(yīng)數(shù)據(jù)。


(1). 如果來自服務(wù)器的響應(yīng)并非 XML,請使用 responseText 屬性。

responseText 屬性返回字符串形式的響應(yīng),因此您可以這樣使用:

document.getElementById("myDiv").innerHTML=xmlhttp.responseText;


(2). 如果來自服務(wù)器的響應(yīng)是 XML,而且需要作為 XML 對象進(jìn)行解析,請使用 responseXML 屬性

[javascript] view plain copy
  1. xmlDoc=xmlhttp.responseXML;  
  2. txt="";  
  3. x=xmlDoc.getElementsByTagName("ARTIST");  
  4. for (i=0;i<x.length;i++)  
  5.   {  
  6.   txt=txt + x[i].childNodes[0].nodeValue + "<br />";  
  7.   }  
  8. document.getElementById("myDiv").innerHTML=txt;  
onreadystatechange事件

當(dāng)請求被發(fā)送到服務(wù)器時,我們需要執(zhí)行一些基于響應(yīng)的任務(wù)。

每當(dāng) readyState 改變時,就會觸發(fā) onreadystatechange 事件。readyState 屬性存有 XMLHttpRequest 的狀態(tài)信息。

下面是 XMLHttpRequest 對象的三個重要的屬性:

屬性 描述
onreadystatechange 存儲函數(shù)(或函數(shù)名),每當(dāng) readyState 屬性改變時,就會調(diào)用該函數(shù)。
readyState

存有 XMLHttpRequest 的狀態(tài)。從 0 到 4 發(fā)生變化。

  • 0: 請求未初始化
  • 1: 服務(wù)器連接已建立
  • 2: 請求已接收
  • 3: 請求處理中
  • 4: 請求已完成,且響應(yīng)已就緒
status

200: "OK"

404: 未找到頁面

Ajax()函數(shù)示例:

  • 定義一個函數(shù),用于異步獲取信息
[javascript] view plain copy
  1. function Ajax(){  
  2.     //code  
  3. }  
  • 聲明一個空對象來裝入XMLHttpRequest對象
[javascript] view plain copy
  1. var xmlHttpReq = null;  
  • 給XMLHttpRequest對象賦值
[javascript] view plain copy
  1. if(window.ActiveXObject){  
  2.     xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");  
  3. }else if(window.XMLHttpRequest){  
  4.     xmlHttpReq = new XMLHttpRequest();  
  5. }  

IE5、IE6是以ActiveXObject的方式引入XMLHttpRequest對象的,而其他瀏覽器的XMLHttpRequest對象是window的子對象。

    • 實(shí)例化后,使用open()方法初始化XMLHttpRequest對象,指定HTTP方法和要使用的服務(wù)器URL
[javascript] view plain copy
  1. xmlHttpReq.open("GET","test.php",true);  
  • 因?yàn)橐鲆粋€異步調(diào)用,所以需要注冊一個XMLHttpRequest對象將調(diào)用的回調(diào)事件處理器當(dāng)做它的readystate值改變時調(diào)用。當(dāng)readyState值改變時,會激發(fā)一個readystatechange事件,可以使用onreadystatechange屬性來注冊該回調(diào)事件處理器。
[javascript] view plain copy
  1. xmlHttpReq.onreadystatechange = RequestCallBack;  
  • 使用send()方法發(fā)送請求,因?yàn)檫@個請求使用的是HTTP的“GET”方式,所以可以在不指定參數(shù)或使用null參數(shù)的情況下調(diào)用send()方法
[javascript] view plain copy
  1. xmlHttpReq.send(null);  

當(dāng)請求改變時,XMLHttpRequest對象調(diào)用onreadystatechange屬性注冊的事件處理器,因此在處理該響應(yīng)前,事件處理器首先應(yīng)該檢查readyState的值和HTTP的狀態(tài)。當(dāng)請求完成加載時(readyState==4)并且已經(jīng)響應(yīng)成功(status==200)時,就可以調(diào)用JavaScript函數(shù)來處理該響應(yīng)內(nèi)容。

[javascript] view plain copy
  1. function RequestCallBack(){  
  2.     if (xmlHttpReq.readyState == 4) {  
  3.         if (xmlHttpReq.status == 200) {  
  4.             //將xmlHttpReq.responText的值賦予id為resText的元素  
  5.             document.getElementById('resText').innerHTML = xmlHttpReq.responText;  
  6.         }  
  7.     }  
  8. }  
二、jQuery中的Ajax

jQuery對Ajax操作進(jìn)行了封裝,在jQuery中$.ajax()方法屬于最底層的方法,第2層是load()、$.get()、$.post()方法,第3層是$.getScript()、$.getJSON()方法

1、load()方法    通常用來從WEB服務(wù)器上獲取靜態(tài)的數(shù)據(jù)文件

最常用的Ajax方法,能載入遠(yuǎn)程HTML代碼并插入DOM中

load(url[,data][,callback]);

  • url:String    請求HTML頁面的URL地址
  • data:Object    發(fā)送至服務(wù)器的key/value數(shù)據(jù)
  • callback:Function    請求完成時的回調(diào)函數(shù),無論請求成功或失敗
[javascript] view plain copy
  1. $(function(){  
  2.     $("#send").click(function(){  
  3.         $("#resText").load("test.html");  
  4.     })  
  5. })  
[javascript] view plain copy
  1. <button type="button" id="send">ajax加載</button>  
  2. <div class="comment">已有評論:</div>  
  3. <div id="resText">替換內(nèi)容</div>  

test.html代碼為:

[javascript] view plain copy
  1. <div class="comment">  
  2.     <h6>張三:</h6>  
  3.     <p class="para">沙發(fā)</p>  
  4. </div>  
  5. <div class="comment">  
  6.     <h6>李四:</h6>  
  7.     <p class="para">板凳</p>  
  8. </div>  
  9. <div class="comment">  
  10.     <h6>王五:</h6>  
  11.     <p class="para">地板</p>  
  12. </div>  

篩選載入的HTML文檔

load()方法的URL參數(shù)的語法結(jié)構(gòu)為:“url selector”

[javascript] view plain copy
  1. $("#resText").load("test.html .para");  

load()傳遞方式根據(jù)參數(shù)data自動指定,沒有參數(shù) --> GET,反之為POST   

[javascript] view plain copy
  1. // 無參數(shù)傳遞 GET  
  2. $("#resText").load("test.html",function(){  
  3.     //code  
  4. });  
  5. // 有參數(shù)傳遞 POST  
  6. $("#resText").load("test.html",{name:"rain",age:"22"},function(){  
  7.     //code  
  8. });  

回調(diào)函數(shù):有三個參數(shù),請求返回的內(nèi)容、請求狀態(tài)、XMLHttpRequest對象

[javascript] view plain copy
  1. // 回調(diào)函數(shù)  
  2. $("#resText").load("test.html",function(responseText,textStatus,XMLHttpRequest){  
  3.     //responseText  請求返回的內(nèi)容  
  4.     //textStatus    請求狀態(tài):success、error、notmodified、timeout  
  5.     //XMLHttpRequest    XMLHttpRequest對象  
  6. });  

2、$.get()和$.post()方法    jQuery中的全局函數(shù)

2.1 $.get()    使用GET方式來進(jìn)行異步請求

[javascript] view plain copy
  1. $.get(url[,data][,callback][,type]);  
  • url:String    請求HTML頁面的URL地址
  • data:Object    發(fā)送至服務(wù)器的key/value數(shù)據(jù)會作為QueryString附加到請求URL中
  • callback:Function    載入成功時回調(diào)函數(shù)(只有當(dāng)response的返回狀態(tài)是success才調(diào)用該函數(shù))自動將請求結(jié)果和狀態(tài)傳遞給該方法
  • type:服務(wù)器返回內(nèi)容的格式,包括html、xml、script、json、text、_default
[javascript] view plain copy
  1. $("#send").click(function(){  
  2.     $.get("get1.php",{  
  3.         username:$("#username").val(),  
  4.         content:$("#comment").val()  
  5.     },function(data,textStatus){  
  6.         // data:返回的內(nèi)容  
  7.         // textStatus:請求狀態(tài),success、error、notmodified、timeout  
  8.     })  
  9. })  

數(shù)據(jù)格式:服務(wù)器返回的數(shù)據(jù)格式

(1)HTML片段    較少工作量

[javascript] view plain copy
  1. $.get("get1.php",{  
  2.     username:$("#username").val(),  
  3.     content:$("#comment").val()  
  4. },function(data,textStatus){  
  5.     // data:返回的內(nèi)容  
  6.     // textStatus:請求狀態(tài),success、error、notmodified、timeout  
  7.     $("#resText").html(data);   //將返回的數(shù)據(jù)添加到頁面上  
  8. });  

(2) XML文檔    需要對返回的數(shù)據(jù)處理

方便使用

可以通過attr()、find()、filter()方法對數(shù)據(jù)進(jìn)行處理

[javascript] view plain copy
  1. $("#send").click(function(){  
  2.     $.get("get1.php", {   
  3.         username :  $("#username").val() ,   
  4.         content :  $("#content").val()    
  5.     }, function (data, textStatus){  
  6.         var username = $(data).find("comment").attr("username");  
  7.         var content = $(data).find("comment content").text();  
  8.         var txtHtml = "<div class='comment'><h6>"+username  
  9.                     +":</h6><p class='para'>"+content+"</p></div>";  
  10.         $("#resText").html(txtHtml); // 把返回的數(shù)據(jù)添加到頁面上  
  11.     });  
  12. })  
由于期待服務(wù)器返回的數(shù)據(jù)類型為XML文檔,因此需要在服務(wù)期端設(shè)置Content-Type類型
[javascript] view plain copy
  1. header("Content-Type:text/html; charset=utf-8");  

(3)JSON文件    需要對返回的數(shù)據(jù)處理

JSON相對于XML比較簡潔

[javascript] view plain copy
  1. $("#send").click(function(){  
  2.     $.get("get3.php", {   
  3.         username :  $("#username").val() ,   
  4.         content :  $("#content").val()    
  5.     }, function (data, textStatus){  
  6.         var username = data.username;  
  7.         var content = data.content;  
  8.         var txtHtml = "<div class='comment'><h6>"+username  
  9.                     +":</h6><p class='para'>"+content+"</p></div>";  
  10.         $("#resText").html(txtHtml); // 把返回的數(shù)據(jù)添加到頁面上  
  11.     },"json");  
  12. })  

以上三種方法對比:

HTML返回數(shù)據(jù)最簡單,如果數(shù)據(jù)需要重用使用JSON(性能與文件大小方面有優(yōu)勢),當(dāng)遠(yuǎn)程程序未知時使用XML。

2.2 $.post()    通過 HTTP POST 請求從服務(wù)器上請求數(shù)據(jù)

[javascript] view plain copy
  1. $.post(URL[,data][,callback]);  
  • url:String    請求的URL地址
  • data:Object    發(fā)送至服務(wù)器的key/value數(shù)據(jù)
  • callback:Function    載入成功時的回調(diào)函數(shù)

由于POST和GET方式提交的所有數(shù)據(jù)都可以通過$_REQUEST[]來獲取,因此只需要改變jQuery函數(shù),就可以將程序在GET請求和POST請求之間切換。

當(dāng)load()方法帶有參數(shù)傳遞時,會使用POST方式發(fā)送請求。因此也可以使用load()方法來完成同樣的功能。

$.post()與$.get()方法的區(qū)別:
  • GET請求會將參數(shù)跟在URL后進(jìn)行傳遞,而POST請求則是作為HTTP消息的實(shí)體內(nèi)容發(fā)送給Web服務(wù)器。當(dāng)然,在Ajax請求中,這種區(qū)別對用戶是不可見的。
  • GET方式對傳輸?shù)臄?shù)據(jù)有大小限制(通常不能大于2KB),而使用POST方式傳遞的數(shù)據(jù)量要比GET方式大得多(理論上不受限制)。
  • GET方式請求的數(shù)據(jù)會被瀏覽器緩存起來,因此其他人就可以從瀏覽器的歷史記錄中讀取到這些數(shù)據(jù),例如賬號和密碼等。在某種情況下,GET方式會帶來嚴(yán)重的安全性問題,而POST方式相對來說就可以避免這些問題。
  • GET方式和POST方式傳遞的數(shù)據(jù)在服務(wù)器端的獲取也不相同。在PHP中,GET方式的數(shù)據(jù)可以用$_GET[]獲取,而POST方式可以用$_POST[]獲取。兩種方式都可以用$_REQUEST[]來獲取。

      上面使用load()、$.get()和$.post()方法完成了一些常規(guī)的Ajax程序,如果還需要編寫一些復(fù)雜的Ajax程序,那么就要用到j(luò)Query中的$.ajax()方法。$.ajax()方法不僅能實(shí)現(xiàn)與load()、$.get()和$.post()方法同樣的功能,而且還可以設(shè)定beforeSend(提交前回調(diào)函數(shù))、error(請求失敗后處理)、success(請求成功后處理)以及complete(請求完成后處理)回調(diào)函數(shù),通過這些回調(diào)函數(shù),可以給用戶更多的Ajax提示信息。另外,還有一些參數(shù),可以設(shè)置Ajax請求的超時時間或者頁面的“最后更改”狀態(tài)等。

3、$.getScript()和$.getJSON()方法

3.1 $.getScript()

有時候,在頁面初次加載時就取得所需的全部JavaScript文件是完全沒有必要的。雖然可以在需要哪個JavaScript文件時,動態(tài)地創(chuàng)建<script>標(biāo)簽

[javascript] view plain copy
  1. $(document.createElement("script").attr("src","test.js")).appenChild("head");  
  2. //或  
  3. $("<script type='text/javscript' src='test.js'></script>").appendChild("head");  
上述方法不理想,jQuery又提供了$.getScript()方法
[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.getScript("test.js");  
  4.     })  
  5. })  
有回調(diào)函數(shù)
[javascript] view plain copy
  1. $.getScript("test.js",function(){  
  2.     $(element).click(function(){  
  3.         $(element).animate({backgroundcolor:'pink'},1000)  
  4.         .animate({backgroundcolor:'coral'},1000);  
  5.     })  
  6. });  

3.2 $.getJSON()方法    用于加載JSON文件,用法同$.getScript()方法

[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.getJSON("test.json");  
  4.     })  
  5. })  

上面函數(shù)雖然加載了JSON代碼,但是并沒有告訴JS對返回的數(shù)據(jù)如何處理,所以需要回調(diào)函數(shù)

[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.getJSON("test.json",function(){  
  4.             //data:返回的數(shù)據(jù)  
  5.         });  
  6.     })  
  7. })  

jQuery遍歷方法  -->  $.each()方法    遍歷對象和數(shù)組

$.each(data,callback)    // 為全局函數(shù)   不同于each()方法

  • data:數(shù)組或?qū)ο?
  • callback:回調(diào)函數(shù),有兩個參數(shù)(對象的成員或數(shù)組的索引,對應(yīng)變量或內(nèi)容)

4、$.ajax()方法    jQuery最底層的Ajax實(shí)現(xiàn)

$.ajax(options);

參數(shù)名稱  類型  說明
url String (默認(rèn)為當(dāng)前頁地址)發(fā)送請求的地址
type String

 請求方式(POST/GET)默認(rèn)GE

注意其他HTTP請求方法,例如PUT和DELETE,僅部分瀏覽器支持

timeout Number

 設(shè)置請求超時時間(毫秒)

此設(shè)置將覆蓋$.ajaxSetup()方法的全局設(shè)置

data Object/String

 發(fā)送到服務(wù)器的數(shù)據(jù)。如果已經(jīng)不是字符串,將自動轉(zhuǎn)換為字符串格式。

GET請求中將附加在URL后。防止這種自動轉(zhuǎn)換,可以查看processData選項。

對象必須為key/value格式

    例如:{foo1:"bar1",foo2:"bar2"}轉(zhuǎn)換為&foo1=bar1&foo2=bar2。

如果是數(shù)組,jQuery將自動為不同的值對應(yīng)同一個名稱

    例如:{foo:["bar1","bar2"]}轉(zhuǎn)換為&foo=bar1&foo=bar2

dataType String

預(yù)期服務(wù)器返回的數(shù)據(jù)類型。

如果不指定,jQuery將自動根據(jù)HTTP包MIME信息返回responseXML或responseText,

并作為回調(diào)函數(shù)參數(shù)傳遞。

可用類型,

xml:返回XML文檔,可用jQuery處理

html:返回純文本HTML信息,包含的script標(biāo)簽會在插入DOM是執(zhí)行

script:返回純文本的JavaScript代碼,不會自動緩存結(jié)果。除非設(shè)置cache參數(shù)

            注意在遠(yuǎn)程請求時(不在同一個域下),所有POST請求都將轉(zhuǎn)換為GET請求

json:返回json數(shù)據(jù)

jsonp:jsonp格式,使用jsonp形式調(diào)用參數(shù)時,myurl?callback=?

jQuery:將自動替換后一個“?”為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)

text:返回純文本字符串

beforeSend Function

發(fā)送請求前可以修改XMLHttpRequest對象的函數(shù)例如添加自定義HTTP頭。

在beforeSend中如果返回false可以取消本次Ajax請求。XMLHttpRequest對象是唯一的函數(shù)

function(XMLHttpRequest){

    this;//調(diào)用本次Ajax請求時傳遞的options參數(shù)

}

complete Function

 請求完成后調(diào)用的函數(shù)(請求成功或失敗時均調(diào)用)

參數(shù):XMLHttpRequest對象和一個描述成功請求類型的字符串

function(XMLHttpRequest,textStatus){

    this;//調(diào)用本次Ajax請求時傳遞的options參數(shù)

}

success Function

請求完成后調(diào)用的函數(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請求時傳遞的options參數(shù)

}

error Function

 請求失敗時被調(diào)用的函數(shù)

參數(shù):(1) XMLHttpRequest對象

           (2) 錯誤信息

           (3) 捕獲的錯誤對象(可選)

function(XMLHttpRequest,textStatus,errorThrown){

    //通常情況下textStatus和errorThrown只有其中一個包含信息

    this;//調(diào)用本次Ajax請求時傳遞的options參數(shù)

}

global Boolean

 默認(rèn)為true。表示是否觸發(fā)全局Ajax事件。設(shè)置為false將不會觸發(fā)全局Ajax事件

AjaxStart或AjaxStop可用于控制各種Ajax事件

前面用到的$.load()、$.get()、$.post()、$.getScript()和$.getJSON()這些方法,都是基于$.ajax()方法構(gòu)建的,$.ajax()方法是jQuery最底層的Ajax實(shí)現(xiàn),因此可以用它來代替前面的所有方法。

[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.getScript("test.js");  
  4.     })  
  5. })  

可被替換為

[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.ajax({  
  4.             type:"GET",  
  5.             url:"test.js",  
  6.             dataType:"script"  
  7.         });  
  8.     });  
  9. })  
[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.getJSON("test.json",function(data){  
  4.                 $("#resText").empty();  
  5.                 var html = " ";  
  6.                 $.each(data,function(commentIndex,comment){  
  7.                     html+='<div class="comment"><h6>'+comment['username']  
  8.                          +'</h6><p class="para">'+comment['content']  
  9.                          +'</p></div>'  
  10.                 })  
  11.                 $("resText").html(html);  
  12.             }  
  13.         });  
  14.     });  
  15. })  

可被替換為

[javascript] view plain copy
  1. $(function(){  
  2.     $("#btn").click(function(){  
  3.         $.ajax({  
  4.             type:"GET",  
  5.             url:"test.json",  
  6.             dataType:"json",  
  7.             success:function(data){  
  8.                 $("#resText").empty();  
  9.                 var html = " ";  
  10.                 $.each(data,function(commentIndex,comment){  
  11.                     html+='<div class="comment"><h6>'+comment['username']  
  12.                          +'</h6><p class="para">'+comment['content']  
  13.                          +'</p></div>'  
  14.                 })  
  15.                 $("resText").html(html);  
  1. })
} }); });
三、序列化元素

1.serialize()方法

異步提交表單,并將服務(wù)器返回的數(shù)據(jù)顯示到當(dāng)前頁面中

[javascript] view plain copy
  1. $.get("get1.php",{  
  2.     username:$("#username").val(),  
  3.     content:$("#comment").val()  
  4. },function(data,textStatus){  
  5.     // data:返回的內(nèi)容  
  6.     // textStatus:請求狀態(tài),success、error、notmodified、timeout  
  7.     $("#resText").html(data);   //將返回的數(shù)據(jù)添加到頁面上  
  8. });  

serialize()方法也是作用于一個jQuery對象,它能夠?qū)OM元素內(nèi)容序列化為字符串,用于Ajax請求??蓪⑸鲜龃a簡化為:

[javascript] view plain copy
  1. $.get("get1.php",$("#form1").serialize(),function(data,textStatus){  
  2.     // data:返回的內(nèi)容  
  3.     // textStatus:請求狀態(tài),success、error、notmodified、timeout  
  4.     $("#resText").html(data);   //將返回的數(shù)據(jù)添加到頁面上  
  5. });  

serialize()方法作用于jQuery對象,所以不光只有表單能使用它,其他選擇器選取的元素也都能使用它,如以下jQuery代碼:

[javascript] view plain copy
  1. $(":checkbox,:radio").serialize();  

把復(fù)選框和單選框的值序列化為字符串形式,只會將選中的值序列化。

2.serializeArray()方法

該方法不是返回字符串,而是將DOM元素序列化后,返回JSON格式的數(shù)據(jù)

3.$.param()方法

它是serialize()方法的核心,用來對一個數(shù)組或?qū)ο蟀凑誯ey/value進(jìn)行序列化。

比如將一個普通的對象序列化:

四、jQuery中的全局事件

jQuery簡化Ajax操作不僅體現(xiàn)在調(diào)用Ajax方法和處理響應(yīng)方面,而且還體現(xiàn)在對調(diào)用Ajax方法的過程中的HTTP請求的控制。通過jQuery提供的一些自定義全局函數(shù),能夠?yàn)楦鞣N與Ajax相關(guān)的事件注冊回調(diào)函數(shù)。例如當(dāng)Ajax請求開始時,會觸發(fā)ajaxStart()方法的回調(diào)函數(shù);當(dāng)Ajax請求結(jié)束時,會觸發(fā)ajaxStop()方法的回調(diào)函數(shù)。這些方法都是全局的方法,因此無論創(chuàng)建它們的代碼位于何處,只要有Ajax請求發(fā)生時,就會觸發(fā)它們。

有時,當(dāng)網(wǎng)頁加載過慢時,就需要為網(wǎng)頁添加一個提示信息,常用的提示信息是“加載中…”,代碼如下:

[javascript] view plain copy
  1. <div class="loading">加載中...</div>  
然后通過CSS控制元素隱藏,當(dāng)Ajax請求開始的時候,將此元素顯示,用來提示用戶Ajax請求正在進(jìn)行。當(dāng)Ajax請求結(jié)束后,將此元素隱藏。
[javascript] view plain copy
  1. $("$loading").ajaxStart(function(){  
  2.     $(this).show();  
  3. }).ajaxStop(function(){  
  4.     $(this).hide();  
  5. });  

jQuery的Ajax全局事件中還有幾個方法,也可以在使用Ajax方法的過程中為其帶來方便。


方法名稱  說明
ajaxComplete(callback) Ajax請求完成時執(zhí)行的函數(shù)
ajaxError(callback) Ajax請求發(fā)生錯誤時執(zhí)行的函數(shù),捕捉到的錯誤可以作為最后一個參數(shù)傳遞
ajaxSend(callback) Ajax請求發(fā)送前執(zhí)行的函數(shù)
ajaxSuccess(callback) Ajax請求成功時執(zhí)行的函數(shù)

注意:

1,如果想使某個Ajax請求不受全局方法的影響,那么可以在使用$.ajax(options)方法時,將參數(shù)中的global設(shè)置為false,jQuery代碼如下

[javascript] view plain copy
  1. $.ajax({  
  2.     url:"test.html",  
  3.     global:false  
  4. });  

2,在jQuery1.5版本之后,如果Ajax請求不觸發(fā)全局方法,那么可以設(shè)置:


[javascript] view plain copy
  1. $.ajaxPrefilter(function(options){  
  2.     options.global = true;  
  3. })  

藍(lán)藍(lán)設(shè)計sillybuy.com )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計、 網(wǎng)站建設(shè) 平面設(shè)計服務(wù)




移動端下拉菜單交互

藍(lán)藍(lán)設(shè)計的小編

通常在PC上常出現(xiàn)的下拉菜單,在移動端上都是用什么交互來實(shí)現(xiàn)的?將最近項目里碰到的情況總結(jié)一下。

獲取json數(shù)據(jù)后在 地圖上打點(diǎn),根據(jù) json不斷移動點(diǎn)的位置

seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里

<?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=您申請的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; ?>

效果圖

-----------------------------------------------------------------------更新---------------------------------------------------------

去掉連續(xù)顯示多個點(diǎn),每次只顯示一個點(diǎn)

<?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=您申請的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; ?>

 

涉及setInterval傳參的問題。

發(fā)現(xiàn)用addMarker(jdata.data[i].gpsx,jdata.data[i].gpsy);時程序可正常運(yùn)行,但是將該函數(shù) 放到setInterval中后卻出現(xiàn)了問題,可通過閉包解決。

藍(lán)藍(lán)設(shè)計sillybuy.com )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計、 網(wǎng)站建設(shè) 、平面設(shè)計服務(wù)

日歷

鏈接

個人資料

存檔