前端各類面試題大全帶詳細答案

一、  列舉幾種後端通信的方法,分別使用的場景。php

跨域請求存在的緣由:因爲瀏覽器的同源策略,即屬於不一樣域的頁面之間不能相互訪問各自的頁面內容。css

跨域的場景:    html

1.域名不一樣 www.yangwei.com 和www.wuyu.com 即爲不一樣的域名)前端

2.二級域名相同,子域名不一樣(www.wuhan.yangwei.com www.shenzheng.yangwei.com 爲子域不一樣)java

3.端口不一樣,協議不一樣  ( http://www.yangwei.com 和https://www.yangwei.com屬於跨域www.yangwei.con:8888和www.yangwei.con:8080)nginx

跨域的方式:(內容較多,需掌握CORS和jsonp,其餘內容也要了解)web

1.前端的方式: possMessage,window.name,document.domain,image.src(得不到數據返回),jsonP(script.src後臺不配合得不到數據返回),style.href(得不到數據返回)redis

一.imge.src,script.src,style.href 不受同源策略的影響能夠加載其餘域的資源,能夠用這個特性,向服務器發送數據。最經常使用的就是使用image.src 向服務器發送前端的錯誤信息。image.src 和style.href 是沒法獲取服務器的數據返回的,script.src 服務器端配合能夠獲得數據返回。算法

二possMessage,window.name,document.domain 是兩個窗口直接相互傳遞數據。chrome

(1)possMessage 是HTML5中新增的,使用限制是 必須得到窗口的window 引用。IE8+支持,firefox,chrome,safair,opera支持

       (2)window.name ,在一個頁面中打開另外一個頁面時,window.name 是共享的,因此能夠經過window.name 來傳遞數據,window.name的限制大小是2M,這個全部瀏覽器都支持,且沒有什麼限制。

3) document.domain 將兩個頁面的document.domain 設置成相同,document.domain 只能設置成父級域名,既能夠訪問,使用限制:這頂級域名必須相同

2.純後端方式: CORS,服務器代理

CORS 是w3c標準的方式,經過在web服務器端設置:響應頭Access-Cntrol-Alow-Origin 來指定哪些域能夠訪問本域的數據,ie8&9(XDomainRequest),10+,chrom4 ,firefox3.5,safair4,opera12支持這種方式。

服務器代理,同源策略只存在瀏覽器端,經過服務器轉發請求能夠達到跨域請求的目的,劣勢:增長服務器的負擔,且訪問速度慢。

3.先後端結合:JsonP

script.src 不受同源策略的限制,因此能夠動態的建立script標籤,將要請求數據的域寫在src 中參數中附帶回調的方法,服務器端返回回調函數的字符串,並帶參數。

如 script.src="http://www.yangwei.com/?id=001&callback=getInfoCallback,服務器端返回 getInfoCallBack("name:yangwei;age:18") 這段代碼會直接執行,在前面定義好getInfoCallBack函數,既能夠得到數據並解析。 這種是最長見的方式。

4.webSocke(瞭解性拓展)

服務端推送websocket和sse場景及應用

應用場景

均可以進行服務端推送,而且都是使用長鏈接來進行.但二者的實現又有一點不一樣,sse仍使用http協議,而且使用相同的連接發送正常的http協議報文.而websocket是使用http協議進行握手,而後再使用同一個連接進行websocket協議的通訊.

websocket能夠進行雙向的通訊,即服務端能夠往客戶端發信息,客戶端也能夠向服務端發信息.而sse是單向的,只能由服務端往客戶端發.

websocket自帶鏈接的保持,即經過ping/pong協議保證鏈接能夠始終維持,sse沒有這個保證,不過能夠參考ping/pong協議,本身週期性地發送信息來一樣地進行處理.好比,5秒往客戶端發一個特別的信息(經過type/name進行區分).其次,由於是基於瀏覽器的使用,sse有一個特性,就是瀏覽器發現一個鏈接斷掉了,就會自動地進行重聯,即從新發送請求.這樣,服務端也不用擔憂鏈接被斷開,不過須要處理新的請求必須和上一次請求的內容相連續,以及新的推送註冊.

由於都是使用http協議進行起始處理,所以在籤權上均可以使用到http協議自己的一些東西,好比header/cookie籤權.在相應的握手階段,經過讀取cookie(session)來保證相應的請求必須是通過受權的,也能夠用於定位使用人.甚至能夠經過這些信息保證單個用戶只能有一個請求,避免重複請求

因爲都是基於瀏覽器使用,所以建議的數據傳輸都是文本型.雖然websocket支持二進制frame傳輸,不過一些都不建議使用.sse只能傳輸文本

無論是websocket仍是sse,在用於通訊時,都建議只用於進行數據的推送,而不是進行完整的應用處理.這裏能夠理解爲,常規的業務處理仍然交給後端的服務來處理.這樣,便可以使用以前的業務開發的優點,又可使用推送的優點.而不是走向另外一個級端,即全部的信息都想經過推送來傳遞.

開發方式

websocket開發首選netty,由於netty對協議的封裝已經作到了徹底的支持.經過 HttpServerCodec做爲握手協議,WebSocketServerProtocolHandler做爲協議處理,而後再加一個本身的handler,就完成了相應的業務處理.同時在性能上,netty在一個ws的請求創建起來以後,會自動地去除httpServerCodec相關的handler,這樣保證後續的處理都是按照ws的協議來進行.

sse開發首選jersey,jersey-media-sse提供了相應的sse支持,而且經過與rest相集成,開發一個sse就跟普通的業務開發相同.

ws和sse在文本支持上都只支持utf-8編碼,所以在處理上須要註冊編碼方式.同時在使用sse時,若是後端第一次進行響應時,相應的編碼不對.chrome會直接報錯,包括utf8都會報錯(這是以前後端開發的一個問題),能夠修正或者增長相應的攔截器,保證後端content-type響應中的charset=UTF-8.

ws和sse均可以經過nginx進行代理轉發.ws的處理只須要設置http版本,以及從新轉發前端的Upgrade和Connection頭便可.而sse,也能夠經過禁用buffer來處理.參考 http://stackoverflow.com/questions/27898622/server-sent-events-stopped-work-after-enabling-ssl-on-proxy

特定實現

爲保證在開發時推送類的和業務類的系統不會耦合在一塊兒,或者同一個應用內有兩種處理模式的功能存在.建議直接在系統層就開發2個不一樣的系統,一個專門用於推送,另外一個用於相應的業務處理.而後業務處理後的數據,須要再交由推送處理,則能夠在後端進行經過消息系統進行中轉,如kafka(持久保證)或redis(內存訂閱)等

由於兩者在ie上的支持都頗有限,所以不建議在ie上進行嘗試

使用sse仍是websocket,取決因而否須要前臺交互,還取決於對後端的支持技術的瞭解程序.好比,瞭解jersey多一點,仍是netty多一點.因爲最近netty進行微服務化底層通訊支持愈來愈流行,我的更傾向於使用websocket.但若是僅僅是一個簡單的推送功能,又不但願修改代碼,那也可使用jersey(畢竟以前的系統就是在上面進行開發的)

須要後端有的時候須要進行定向發送或者是羣發,這種需求ws和sse的實現中都有相應的處理.如ChannelGroup和SseBroadcaster,這樣在後端獲取到一個消息,須要進行路由時就能夠從這裏面拿相應的channel信息.不過,前提是對各個channel上進行了特定的消息綁定,這樣就好區分具體的路由信息.具體路由策略能夠在創建時綁定session,後續經過session來路由.

二、  設計一個幻燈應用,須要列舉選擇的基礎框架、項目的基礎框 架和代碼管理、幻燈數據的存儲和讀取,部分特效的實現,能夠只寫思路,後續面聊。

本題並無找到好的答案解析,本身也沒有好的思路,有比較好想法的同窗能夠分享一下。

三、  請寫出至少20個HTML5標籤

<article><aside><audio><canvas><datalist><command> <details><embed>

<figcaption><figure><footer><header><hgroup><keygen><mark><nav>

<section><time><video><summary>

四、  列舉5種IE  hastlayout的屬性及其值

haslayout 是Windows Internet Explorer渲染引擎的一個內部組成部分。在Internet Explorer中,一個元素要麼本身對自身的內容進行計算大小和組織,要麼依賴於父元素來計算尺寸和組織內容。爲了調節這兩個不一樣的概念,渲染引擎採用 了 hasLayout 的屬性,屬性值能夠爲true或false。當一個元素的 hasLayout 屬性值爲true時,咱們說這個元素有一個佈局(layout)

部分的 IE 顯示的錯誤,均可以經過激發元素的 haslayout 屬性來修正。能夠經過設置 css 尺寸屬性(width/height)等來激發元素的 haslayout,使其「擁有佈局」。以下所示,經過設置如下 css 屬性便可。

* display: inline-block
* height: (任何值除了auto)
* float: (left 或 right)
* position: absolute
* width: (任何值除了auto)
* writing-mode: tb-rl
* zoom: (除 normal 外任意值)

Internet Explorer 7 還有一些額外的屬性(不徹底列表):

* min-height: (任意值)
* max-height: (除 none 外任意值)
* min-width: (任意值)
* max-width: (除 none 外任意值)
* overflow: (除 visible 外任意值)
* overflow-x: (除 visible 外任意值)
* overflow-y: (除 visible 外任意值)
* position: fixed

五、  簡述jpg。Gif。png-8.png-24的區別,分別使用場景

gif、jpg、png格式的圖片在網站製做中的區別

Gif格式特色:
  1.透明性,Gif是一種布爾透明類型,既它能夠是全透明,也能夠是全不透明,可是它並無半透明(alpha透明)。
  2.動畫,Gif這種格式支持動畫。
  3.無損耗性,Gif是一種無損耗的圖像格式,這也意味着你能夠對gif圖片作任何操做也不會使得圖像質量產生損耗。
  4.水平掃描,Gif是使用了一種叫做LZW的算法進行壓縮的,當壓縮gif的過程當中,像素是由上到下水平壓縮的,這也意味着同等條件下,橫向的gif圖片比豎向的gif圖片更加小。例如500*10的圖片比10*500的圖片更加小
  5.間隔漸進顯示,Gif支持可選擇性的間隔漸進顯示
  由以上特色看出只有256種顏色的gif圖片不適合照片,但它適合對顏色要求不高的圖形(好比說圖標,圖表等),它並非最優的選擇,咱們會在後面中看到png是最優的選擇。
Jpeg格式特色:
  1.透明性,它並不支持透明。
  2.動畫,它也不支持動畫。
  3.損耗性,除了一些好比說旋轉(僅僅是90、180、270度旋轉),裁切,從標準類型到先進類型,編輯圖片的原數據以外,全部其它操做對jpeg圖像的處理都會使得它的質量損失。因此咱們在編輯過程通常用png做爲過渡格式。
  4.隔行漸進顯示,它支持隔行漸進顯示(可是ie瀏覽器並不支持這個屬性,可是ie會在整個圖像信息徹底到達的時候顯示)。
  由上能夠看出Jpeg是最適web上面的攝影圖片和數字照相機中。
  Png格式特色:
  1.類型,Png這種圖片格式包括了許多子類,可是在實踐中大體能夠分爲256色的png和全色的png,你完成能夠用256色的png代替gif,用全色的png代替jpeg
  2.透明性,Png是徹底支持alpha透明的(透明,半透明,不透明),儘管有兩個怪異的現象在ie6(下面詳細討論)
  3.動畫,它不支持動畫
  PNG圖片格式如今包含三種類型:
  1.PNG8256色PNG的別名
  2.PNG24全色PNG的別名
  3.PNG32全色PNG的別名
  基本上PNG32就是PNG24,可是附帶了全alpha通道。就是說每一個像素上不只存儲了24位真色彩信息還存儲了8位的alpha通道信息,就如同GIF能存儲透明和不透明信息同樣。當咱們把圖片放到不太搭配的背景上的時候,透明PNG圖片的邊緣會顯示得更加平滑。
  固然,我也知道你的想法,「可是Photoshop也能生成帶透明通道的PNG圖片!」我也知道,它只是表面上這麼說是PNG24,讓我也產生困惑了。
  做爲一個傷感的Fireworks倡導者,我只使用PNG32支持附帶alpha通道的真色彩圖片。無論怎樣,若是你習慣使用Photoshop,你就應該知道,Photoshop在「存儲爲WEB格式」中只提供PNG8和PNG24兩種PNG格式。
  我敢確定你常常會勾選「支持透明」選項,以得到帶有透明度的PNG圖片,可是這樣你就獲取了一張PNG32圖片。——Photoshop只是以爲把PNG32這個名稱給隱藏掉了。奇怪吧?……
  對png8的誤解
  Png8的在ie中的怪異表現:
  半透明的png8在ie6如下的瀏覽器顯示爲全透明。
  Alpha透明的全色PNG(png32)在ie6中會出現背景顏色(一般是灰色)。
  由上面能夠總結:
  (a)全透明的png8能夠在任一瀏覽器正常顯示(就像gif同樣)。半透明的png8在除了ie6及其如下的瀏覽器下錯誤的顯示成全透明,其它瀏覽器都能正常顯示半透明。這個bug並不須要特殊對待,由於在不支持半透明的瀏覽器下只是顯示爲全透明,對用戶體驗影響不大,它反而是透明gif的增強版。
  (b)第二個bug沒有什麼好的方法解決,只能經過影響性能的方法AlphaImageLoader與須要加特殊標籤(VML)。
  所以得出結論就是:請使用PNG8。
  Png8的軟件問題:
  Photoshop只能導出布爾透明的PNG8。

  1.   Fireworks既能導出布爾透明的PNG8,也能導出alpha透明的PNG8.
相關文章
相關標籤/搜索