1. 程式人生 > >前端經典面試題---Ajax篇

前端經典面試題---Ajax篇

 原生Ajax(相容)

function ajax(options){
    options = options||{};
    var xhr = window.XMLHttpRequest ? (new XMLHttpRequest()) : (new ActiveXObject("Microsoft.XMLHTTP")) ;
    //onreadystatechange事件放在open()前,確保跨瀏覽器相容性
    xhr.onreadystatechange = function(){
        if(xhr.readyState==4){
            if
(xhr.status>=200&&xhr.status<300){ ... }else{ ... } } } //啟動一個請求以備傳送 xhr.open('get/post','example.php',true); //設定請求頭 xhr.setRequestHeader(...); //傳送資料 xhr.send(null); }

GET和POST的區別,何時使用POST

GET:一般用於資訊獲取,查詢字串引數追加在URL末尾,對所傳送資訊的數量也有限制,一般在2000個字元

//向現有URL末尾追加查詢字串
function addURLParam(url,name,value){
    url += (url.index('?')==-1?'?':'&');
    url += encodeURIComponent(name)+'='+encodeURIComponent(value);
    return url;
}

POST:一般用於向伺服器傳送應該被儲存的資料,對所傳送的資料沒有數量和格式的限制

注:伺服器對POST請求和提交web表單的請求不會一視同仁。

使用XHR來模仿表單提交

//XMLHttpRequest 1級寫法
...
xhr.open('post','postexample.php',true); xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded'); var form = document.getElementById('user-info'); xhr.send(serialize(form)); //serialize見頁末
//XMLHttpRequest 2級寫法
...
    xhr.open('post','postexample.php',true);
    var form = document.getElementById('user-info');
    xhr.send(new FormData(form));

與get請求相比,post請求消耗的資源會更多一些,從效能角度,以傳送相同的資料比較,get的請求速度最多可達到post的兩倍。
GET方式需要使用Request.QueryString來取得變數的值,而POST方式通過Request.Form來獲取變數的值。

然而,在以下情況中,請使用 POST 請求:
- 無法使用快取檔案(更新伺服器上的檔案或資料庫)
- 向伺服器傳送大量資料(POST 沒有資料量限制)
- 傳送包含未知字元的使用者輸入時,POST 比 GET 更穩定也更可靠。

xhr其它的一些方法

超時設定timeout及其事件
重寫XHR響應的MIME型別 overrideMimeType()

進度事件

load可以替代readystatechange

progress 在接收響應期間不斷地觸發,會接收到一個event物件,它有三個屬性:lengthComputable(進度資訊是否可用,布林值)、position(已接收的位元組數)、totalSize(預期接收的總位元組數)。
例項:進度指示器

...
xhr.onprogress = function(event){
    var divS = document.getElementById('status');
    if(event.lengthComputable){
        divS.innerHTML = event.position + '/' + event.totalSize
    }
}
...
    //表單序列化  (瞭解)
    function serialize(form){
        var parts=[],field=null,i,len,j,optLen,option,optValue;  
        for(i=0,len=form.elements.length;i<len;i++){  
            field=form.elements[i];  
            switch(field.type){  
                case "select-one"://單選列表預設處理  
                case "select-multiple"://對多選列表的處理最複雜,逐項判斷和累加  
                    if(field.name.length){  
                        for(j=0,optLen=field.options.length;j<optLen;j++){  
                            option=field.options[j];  
                            if(option.selected){  
                                optValue="";  
                                if(option.hasAttribute){  
                                    optValue=(option.hasAttribute("value")?  
                                    option.value:option.text);  
                                }else{  
                                    optValue=(option.attributes["value"].specified?  
                                    option.value:option.text);  
                                }  
                                parts.push(encodeURIComponent(field.name)+"="+  
                                           encodeURIComponent(optValue));  
                            }  
                        }  
                    }  
                    break;  
                case undefined://預設處理  
                case "file"://預設處理  
                case "submit"://預設處理  
                case "reset"://預設處理  
                case "button"://不處理  
                    break;  
                case "radio"://預設處理  
                case "checkbox":  
                    if(!field.checked){  
                        break;  
                    }  
                default://預設處理,要求必須有name屬性  
                    if(field.name.length){  
                        parts.push(encodeURIComponent(field.name)+"="+  
                                   encodeURIComponent(field.value));  
                    }  
            }  
        }  
        return parts.join("&");     
    }

相關推薦

前端經典試題---Ajax

 原生Ajax(相容) function ajax(options){ options = options||{}; var xhr = window.XMLHttpRequest ? (new XMLHttpRequest(

前端經典試題---CSS

什麼是CSS盒模型? css盒子模型又稱框模型 (Box Model) ,包含了元素內容(content)、內邊距(padding)、邊框(border)、外邊距(margin)幾個要素。 標準模式下,一個塊的總寬度= width + margi

前端高頻試題 CSS

語義 flex布局 ria nth 彈性盒子 direction 重新 結果 space 通過從網上看到的面經,總結的一些高頻的前端CSS面試題,有很多不會,於是找資料,並通過代碼實現,自己提供了一些參考答案。 目錄 1.怎樣會產生浮動? 2.如何清除浮動? 3.盒子模

前端經典試題-代碼

color borde 格式 空格 存在 urn 默認 url convert 1、檢測變量類型。 // 此方法不僅可檢測出6種基本數據類型,還能檢測出Array、Function Object.prototype.toString.call(Array) // [‘Ob

新手小白必知的5道Web前端經典試題

想成功就業web前端工程師,想要能高薪就業,那麼除了好的web前端技能以外,還得有好的面試技巧,如果提前就瞭解更多企業的面試要求及面試題目,那麼可以讓我們的面試成功的機率大大的提高,今天就給大家分享5道經典的web前端面試題,相信可以祝大家一臂之力。  

2018Web前端經典試題合集

javascript:  JavaScript中如何檢測一個變數是一個String型別?請寫出函式實現 typeof(obj) === "string" typeof obj === "string" obj.constructor === String 請用js去除字串

2018前端經典試題

1, html和xml有什麼區別 html是超文字標記語言 xml是可擴充套件標記語言 html語法寬鬆,xml語法嚴謹 html使用固有標記,xml沒有固有標記 html標籤預定義,xml標籤可擴充套件,可定義 html是用來顯示資料的,xml是用來描述和儲

2018年web前端經典試題總結整理

對於很多同學來說,面試就是一個考驗,很多人技術上沒有任何問題,但是就是過補了面試那一關,那麼如何提升自己的面試機率呢?當然是瞭解一些面試題了,因為很多時候,一些我們忽略的小問題可能就是企業比較看重的,所以,今天給大家整理總結了一些面試題。希望可以對大家的面試有一定的幫助,可以讓大家更從容面對招聘者的考驗。

2018最新Web前端經典試題及答案

javascript:  JavaScript中如何檢測一個變數是一個String型別?請寫出函式實現 typeof(obj) === "string" typeof obj === "string" obj.constructor === String 請用js去除字

2018年web前端經典試題總結,你能做對幾個?

對程式設計師小哥哥小姐姐來說,很多時候差的不是技術,卻過不了面試那一關。這時候我們就需要總結分析一下面試題目了,揣摩公司與hr的心理及需求,有時候我們忽略的小問題就是決定能不能拿到offer的重要因素,希望大家都可以找到自己心儀的工作,從容應對面試~ 1、webpack怎麼引入第三方的庫?

web前端開發試題-基礎

最近更新時間:2017年7月19日09:50:06     IT行業發展迅速並且熱火朝天,每年都呈現人才緊缺現象,同時高薪崗位更是數不勝數,但要想過五關斬六將進入大廠,就需要謙虛學習基礎知識,不斷總結經驗。企業的競爭,本質是人才的競爭,優秀的人才進入優秀的企業,是符合社

前端經典試題a++和++a 總結及自我解答(1)

1. 如果 a=1 ;  b = a++ + (a++) + 1 + (++a)  + (a++)  + (++a) + a + (++a) = ?  並且這時候a =? 解答: 先說 a =?  首先求a , 有一個極簡單的方法,個人總結啊:

2018年web前端經典試題及答案

    javascript: JavaScript中如何檢測一個變數是一個String型別?請寫出函式實現方法1、function isString(obj){ return typeof(obj) === "string"? true: false; //

前端經典試題: 從輸入URL到頁面載入發生了什麼?

從輸入URL到頁面載入發生了什麼總體來說分為以下幾個過程:DNS解析TCP連線傳送HTTP請求伺服器處理請求並返回HTTP報文瀏覽器解析渲染頁面連線結束具體過程1.DNS解析DNS解析的過程就是尋找哪臺機器上有你需要資源的過程。當你在瀏覽器中輸入一個地址時,例如www.bai

BAT及各大網際網路公司2014前端筆試試題--JavaScript

function setcookie(name, value, days) { //給cookie增加一個時間變數    var exp = new Date();   exp.setTime(exp.getTime() + days * 24 * 60 * 60 * 100

2018 前端經典試題

三列布局(左右固定;中間自適應)一、流體佈局<!DOCTYPE html> <html lang="en"> <head> <style> .left { float: left; height:

前端開發--試題整理(JS

狀態 state oda 通過 cli 命名空間 script push arguments 1.截取字符串abcdace的acealert(‘abcdace‘.substring(4)); 2.規避javascript多人開發函數重名問題命名空間封閉空間js模塊化mvc(

前端javaScript經典試題

new 可能 spa 設置 沒有 sco test 問題 輸出結果 1.alert(1&&2),alert(1||0) alert(1&&2)的結果是2 只要“&&”前面是false,無論“&&”後

運維經典試題之網路(一)

1、寫出12.23.34.0/29的掩碼 11111111.11111111.11111111.11111000 255.255.255.248 2、簡述衝突域與廣播域的區別 衝突域:基於osi的第一層物理層。 一個站點向另一個站

前端基礎試題之CSS

最近出去面了一次試。去之前信心滿滿,去之後灰頭土臉,因為連最簡單的“css居中方式有多少種”、“說說js資料型別”這種入門問題竟然回答的支支吾吾,也怪不得面試官20分鐘就優雅的把我送了出來。 痛定思痛,總結了一些基礎面試題,望壯士你出門迎敵時,不要像我一樣尷尬…