Web前端筆試面試題匯總(轉自github)


 

前言

本文總結了一些優質的前端面試題(多數源於網絡),初學者閱后也要用心鑽研其中的原理,重要知識需要系統學習,透徹學習,形成自己的知識鏈。萬不可投機取巧,只求面試過關是錯誤的!

面試有幾點需注意:

1.面試題目: 根據你的等級和職位變化,入門級到專家級:范圍↑、深度↑、方     向↑。

2.題目類型: 技術視野、項目細節、理論知識題,算法題,開放性題,案例題。

3.進行追問: 可以確保問到你開始不懂或面試官開始不懂為止,這樣可以大大延     展題目的區分度和深度,知道你的實際能力。因為這種關聯知識是長時期的學         習,絕對不是臨時記得住的。

回答問題再棒,面試官(可能是你的直接領導面試),會考慮我要不要這個人做我的同事?所以態度很重要。(感覺更像是相親)

資深的工程師能把absolute和relative弄混,這樣的人不要也罷,因為團隊需要的你這個人具有可以依靠的才能(靠譜)。

前端開發面試知識點大綱:

HTML&CSS:

    對Web標准的理解、瀏覽器內核差異、兼容性、hack、CSS基本功:布局、盒子模型、選擇器優先級及使用、HTML5、CSS3、移動端適應

JavaScript: 

    數據類型、面向對象、繼承、閉包、插件、作用域、跨域、原型鏈、模塊化、自定義事件、內存泄漏、事件機制、異步裝載回調、模板引擎、Nodejs、JSON、ajax等。

其他:

   HTTP、安全、正則、優化、重構、響應式、移動端、團隊協作、可維護、SEO、UED、架構、職業生涯

前端工程師,必須掌握的知識點:

    1、DOM結構 —— 兩個節點之間可能存在哪些關系以及如何在節點之間任意移動。

    2、DOM操作  ——如何添加、移除、移動、復制、創建和查找節點等。

    3、事件    —— 如何使用事件,以及IE和標准DOM事件模型之間存在的差別。

    4、XMLHttpRequest —— 這是什么、怎樣完整地執行一次GET請求、怎樣檢測錯誤。

    5、嚴格模式與混雜模式 —— 如何觸發這兩種模式,區分它們有何意義。

    6、盒模型 —— 外邊距、內邊距和邊框之間的關系,及IE8以下版本的瀏覽器中的盒模型

    7、塊級元素與行內元素 —— 怎么用CSS控制它們、以及如何合理的使用它們

    8、浮動元素——怎么使用它們、它們有什么問題以及怎么解決這些問題。

    9、HTML與XHTML——二者有什么區別,你覺得應該使用哪一個並說出理由。

    10、JSON  —— 作用、用途、設計結構。

………………

一.HTML&&CSS

1.CSS選擇器有哪些?哪些屬性可以被繼承?

元素選擇器、類選擇器、 ID選擇器、屬性選擇器、后代選擇器、子元素選擇器、相鄰兄弟選擇器、偽類、偽元素......

CSS繼承特性主要是指文本方面的繼承,常用的例如:font-size , color , font-family , font-weight , text-align , text-indent , line-height 等,都是可以繼承的;而關於與盒模型相關的不帶繼承。

具體:

不可繼承的:display、margin、border、padding、background、height、min-height、max-height、width、min-width、max-width、overflow、position、left、right、top、bottom、z-index、float、clear、table-layoutvertical-alignpage-break-after、page-bread-before。

所有元素可繼承:visibility和cursor。

內聯元素可繼承:letter-spacingword-spacingwhite-spaceline-height、color、font、font-family、font-size、font-style、font-variant、font-weighttext-decoration、text-transform、direction。

終端塊狀元素可繼承:text-indent和text-align。

列表元素可繼承:list-style、list-style-type、list-style-position、list-style-image。

 

2.HTML5為什么只需要寫<!DOCTYOE HTML>,作用是什么?

HTML5 不基於 SGML,所以不需要引用 DTD,因此沒有聲明DTD;

作用:<!DOCTYPE>聲明不是 HTML 標簽;它是指示 web 瀏覽器關於頁面使用哪個 HTML 版本進行編寫的指令。(瀏覽器獲知文檔類型);

(**在 HTML 4.01 中,<!DOCTYPE>聲明引用 DTD,因為 HTML 4.01 基於 SGML。

SGML(Standard Generalized Markup Language),即標准通用標記語言;DTD (Document Type Definition)規定了標記語言的規則,這樣瀏覽器才能正確地呈現內容。**).

3.CSS3中如何實現屏幕的自適應?

(1)添加在HTML頁面的元元素<meta>,<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">;

( 2 )將CSS中的固定值修改為相對值;

( 3 )柵格系統(流式網格布局);

( 4 )CSS3的媒體查詢;

 

4.HTML中放入CSS樣式的幾種方式。

內聯樣式:style=”屬性:屬性值;”

內部樣式:<style>選擇器{屬性:值;}</style>

外部樣式:<link href="css/style.css" rel="stylesheet" type="text/css">

5.簡述如何居中div,如何居中一個浮動的元素,如何讓絕對定位的div居中?

絕對定位和浮動的元素居中:知道定位元素本身的寬高的話,例:寬高是300px  position: absolute; left: 50%; top: 50%;  margin:-150px 0 0 -150px;

水平垂直居中:

1 inline-block配合text-align加上table-cell配合vertical-align

.parent{

    display: table-cell;

    vertical-align:middle;

    text-align:center;}

.child{

    display: inline-block;}

2 absolute配合transform

.parent{

    position: relative;}

.child{

    position: absolute;

    left: 50%;

    top: 50%;

    transform: translate(-50%,-50%);}

3.

.parent{

    display: flex;

    justify-content: center;

    align-items: center;}

4. (水平居中)

.div{position: absolute;

  width: 1200px;

  background: none;

  margin: 0 auto;

  top: 0;

  left: 0;

  bottom: 0;

  right: 0;

}

 

 

#####6.利用CSS實現等高布局

i.左側寬度的30%背景色為灰色,右側寬度70%背景色為紅色

ii.左側高度隨着右側高度變化而變化(右側高度不定)

 

利用padding-bottom|margin-bottom正負值相抵;

設置父容器設置超出隱藏(overflow:hidden),這樣子父容器的高度就還是它里面的列沒有設定padding-bottom時的高度,當它里面的任一列高度增加了,則父容器的高度被撐到里面最高那列的高度,其他比這列矮的列會用它們的padding-bottom補償這部分高度差。

<head>

       <meta charset="UTF-8">

       <title>等高布局</title>

       <style type="text/css">

           .container{

              overflow:hidden;

           }

           .left{

              float:left;

              width:30%;

              background-color: #ddd;

              padding-bottom: 2000px;

              margin-bottom: -2000px;

           }

           .right{

              float:left;

              width:70%;

              background-color: #f00;

              padding-bottom: 2000px;

              margin-bottom: -2000px;

           }

       </style>

    </head>

    <body>

       <div class="container">

           <div class="left">lorem</div>

           <div class="right">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veniam tenetur facilis possimus, voluptate fugit nesciunt dignissimos libero enim, eligendi aspernatur nam, officia temporibus iure sunt. Error laudantium nam, quam! Quam. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam dignissimos cupiditate omnis. In possimus sequi rem esse expedita quibusdam, eaque laboriosam quo id quos sapiente inventore, temporibus delectus, neque soluta.</div>

       </div>

    </body>

 

7.Margin屬性應用。

http://www.zhangxinxu.com/wordpress/?p=48

         (1)控制元素周圍空間的間隔,從視覺角度上達到相互隔開的目的。

         (2).頁面上實現css sprite背景定位效果

關於頁面上背景定位效果,可以參見我的文章“IE6下png背景不透明問題的綜合拓展”有關頁面上定位的demo實例頁面

(3).在選項卡等邊框線的處理

下圖顯示的是一種比較常見的選項卡樣式,舊版的迅雷首頁就是這樣子的選項卡。

 

我其實已經在圖上做了點小小的標注,使用margin-top:-1px;解決選項卡下邊框顯示的問題。類似的,如果您要用四個div實現5條1像素的左右邊框,就像表格一樣的效果,就可以使用讓每個div都有左右1像素的邊框,然后margin-right:-1px;或是margin-left:-1px;讓之間的邊框重疊,這樣就實現了四標簽實現5邊框的效果了。

(4).圖片與文字對齊問題

圖片與文字默認是居底對齊了。所以當圖片與文字在一起的時候往往都是不對齊的。尤其圖片較小時就更加明顯了,我看到很多人使用vertical-align:middle;對齊。在火狐下效果是不錯,但是IE下,雖然是效果好了些,但還是不夠。
如果,圖片是個20像素*20像素左右的小圖片,文字也差不多12px大,則使用vertical-align:text-bottom;是不錯的個方法。還有個屢試不爽,兼容性不錯的方法就是使用margin負值了。img標簽是個很不錯的標簽,支持margin四個方向的正的和負的定位。一般img標簽打頭的小圖標與文字對齊的話,img{margin:0 3px -3px 0;}可以說是公式版的東西,能實現效果和兼容性俱佳的對齊效果。

8.position的應用(屬性值以及區別)?

http://www.cnblogs.com/bokin/archive/2012/12/14/2816864.html

 

9.Border屬性。

 

10. 為什么要進行CSS樣式重置。

-因為瀏覽器的兼容問題,不同瀏覽器對有些標簽的默認值是不同的,如果沒對CSS初始化往往會出現瀏覽器之間的頁面顯示差異。

 

-當然,初始化樣式會對SEO有一定的影響,但魚和熊掌不可兼得,但力求影響最小的情況下初始化。

body,h1,h2,h3,h4,h5,h6,dl,dt,dd,ul,ol,li,th,td,p,blockquote,pre,form,fieldset,legend,input,button,

textarea,hr{margin:0;padding:0}

body,button,input,select,textarea{ font:12px/1.5 "宋體",arial, verdana, sans-serif}

h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}

li{list-style:none}

fieldset,img{border:0}

table{border-collapse:collapse;border-spacing:0}

q:before,q:after{content:”}

button,input,select,textarea{font-size:100%}

legend{color:#000}

small{font-size:12px}

hr{border:none;height:1px}

a{text-decoration:none}

a:hover{text-decoration:underline}

.cle:after{content:".";display:block;height:0;clear:both;visibility:hidden}

.cle{ display:inline-block}

.cle{ display:block}

.clear {clear: both;}

豆瓣上的幾種重置模板:https://www.douban.com/note/330400235/

11.a元素target屬性規定在何處打開頁面上所有鏈接,請舉例說明。

         http://www.doc88.com/p-130783716484.html

1._blank      <a href="document.html" target="_blank">my document</a> 

                  瀏覽器會另開一個新窗口顯示document.html文檔   

         2._parent     <a href="document.html" target="_parent">my document</a>      

                  指向父frameset文檔   

         3._self       <a href="document.html" target="_self">my document</a>           

                  把文檔調入當前頁框  

4._top        <a href="document.html" target="_top">my document</a>          

                  去掉所有頁框並用document.html取代frameset文檔

12.選擇器優先級排序(由大到小),寫出示例;(標簽選擇器,ID選擇器,類選擇器)

ID選擇器>類選擇器>標簽選擇器

 

13.樣式中:before,:after的作用?

:before,:after是偽元素選擇器,定義到元素內容之前,之后要配合content: “ ”;一起使用.

解決問題:1、撐起包含浮動元素的父元素的高度

(1)、指定元素高度

                            (2)、overflow:hidden;

                            (3)、追加空子元素,clear:both

                            (4)、div:after{                           

content:"";

                  display:block;

                   clear:both;

               }

                     2、上外邊距溢出問題:

#d2:before{

           content:"";

           display:table;

            }

14. 行內元素有哪些,塊級元素有哪些,空元素(單標簽)有哪些,請舉例說明,每種至少3個?

         行內元素:<a>,<span>,<i>,<em>,<strong>,<label>,<code>,

<img>,<input>,<select>,<textarea>,<button>

塊級元素:<div>,<p>,<h1>...<h6>,<ol>,<ul>,<dl>,<table>,<form>

空元素(單標簽):<br>,<hr>,<img>,<input>,<link>,<meta>

15.Doctype作用? 嚴格模式與混雜模式如何區分?它們有何意義?

(1)<!DOCTYPE>聲明位於位於HTML文檔中的第一行,處於 <html> 標簽之前。告知瀏覽器的解析器用什么文檔標准解析這個文檔。DOCTYPE不存在或格式不正確會導致文檔以混雜(兼容)模式呈現。

(2)嚴格(標准)模式的排版 和JS運作模式都是以該瀏覽器支持的最高標准運行。在混雜(兼容)模式中,頁面以寬松的向后兼容的方式顯示,模擬老式瀏覽器的行為以防止站點無法工作。

16.頁面導入樣式時,使用link和@import有什么區別?

(1)link屬於XHTML標簽,除了加載CSS外,還能用於定義RSS, 定義rel連接屬性等作用;而@import是CSS提供的,只能用於加載CSS;

(2)頁面被加載的時,link會同時被加載,而@import引用的CSS會等到頁面被加載完再加載;

(3)import是CSS2.1 提出的,只在IE5以上才能被識別,而link是XHTML標簽,無兼容問題;

17.html5有哪些新特性、移除了那些元素?如何處理HTML5新標簽的瀏覽器兼容問題?如何區分 HTML 和 HTML5?

(1)HTML5 現在已經不是 SGML 的子集,主要是關於圖像,位置,存儲,多任務等功能的增加:

 ①繪畫 canvas;

 ②用於媒介回放的 video 和 audio 元素;

 ③本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉后數據不丟失;sessionStorage 的數據在瀏覽器關閉后自動刪除;

 ④語意化更好的內容元素,比如 article、footer、header、nav、section;

 ⑤表單控件,calendar、date、time、email、url、search;

 ⑥新的技術webworker, websocket, Geolocation;

(2)移除的元素:

      純表現的元素:basefont,big,center,font, s,strike,tt,u;

      對可用性產生負面影響的元素:frame,frameset,noframes;

(3)支持HTML5新標簽:

     ①IE8/IE7/IE6支持通過document.createElement方法產生的標簽,可以利用這一特性讓這些瀏覽器支持HTML5新標簽,瀏覽器支持新標簽后,還需要添加標簽默認的樣式。

 ②當然也可以直接使用成熟的框架,比如html5shiv;可以把HTML5的新元素轉換成IE6認識的內容。只需要在你的head中調用這段代碼就行:

<!--if lt IE 9]>
         <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  <![endif]-->

 

(4)如何區分HTML5: DOCTYPE聲明\新增的結構元素\功能元素

18.簡述一下你對HTML語義化的理解?

1.用正確的標簽做正確的事情。

2.html語義化讓頁面的內容結構化,結構更清晰,便於對瀏覽器、搜索引擎解析;

3.即使在沒有樣式CSS情況下也以一種文檔格式顯示,並且是容易閱讀的;

4.搜索引擎的爬蟲也依賴於HTML標記來確定上下文和各個關鍵字的權重,利於SEO;

5.使閱讀源代碼的人對網站更容易將網站分塊,便於閱讀維護理解。

19.HTML5的離線儲存怎么使用,工作原理能不能解釋一下?

https://segmentfault.com/a/1190000000732617

在用戶沒有與因特網連接時,可以正常訪問站點或應用,在用戶與因特網連接時,更新用戶機器上的緩存文件。

原理:HTML5的離線存儲是基於一個新建的.appcache文件的緩存機制(不是存儲技術),通過這個文件上的解析清單離線存儲資源,這些資源就會像cookie一樣被存儲了下來。之后當網絡在處於離線狀態下時,瀏覽器會通過被離線存儲的數據進行頁面展示。

使用:

如何使用:

1、頁面頭部像下面一樣加入一個manifest的屬性;

2、在cache.manifest文件的編寫離線存儲的資源;

CACHE MANIFEST

    #v0.11

    CACHE:

    js/app.js

    css/style.css

    NETWORK:

    resourse/logo.png

    FALLBACK:

    / /offline.html

3、在離線狀態時,操作window.applicationCache進行需求實現。

20.瀏覽器是怎么對HTML5的離線儲存資源進行管理和加載的呢?

https://segmentfault.com/a/1190000000732617

在線的情況下,瀏覽器發現html頭部有manifest屬性,它會請求manifest文件,如果是第一次訪問app,那么瀏覽器就會根據manifest文件的內容下載相應的資源並且進行離線存儲。如果已經訪問過app並且資源已經離線存儲了,那么瀏覽器就會使用離線的資源加載頁面,然后瀏覽器會對比新的manifest文件與舊的manifest文件,如果文件沒有發生改變,就不做任何操作,如果文件改變了,那么就會重新下載文件中的資源並進行離線存儲。

離線的情況下,瀏覽器就直接使用離線存儲的資源。

21.請描述一下 cookies,sessionStorage 和 localStorage 的區別?

 

22.iframe有哪些缺點?

(1)iframe會阻塞主頁面的Onload事件;

(2)搜索引擎的檢索程序無法解讀這種頁面,不利於SEO;

(3)iframe和主頁面共享連接池,而瀏覽器對相同域的連接有限制,所以會影響頁面的並行加載。

如果需要使用iframe,最好是通過javascript動態給iframe添加src屬性值。

 

 

 

 

23.label的作用是什么?是怎么用的?

label標簽來定義表單控制間的關系,當用戶選擇該標簽時,瀏覽器會自動將焦點轉到和標簽相關的表單控件上。

(1)

<label for="Name">Number:</label>

<input type=textname="userName" id="Name"/>

(2)

<label>Date:<input type="text" name="B"/></label>

24.HTML5的form如何關閉自動完成功能?

給不想要提示的 form 或某個 input 設置為 autocomplete=”off ”。

(自動完成允許瀏覽器預測對字段的輸入。當用戶在字段開始鍵入時,瀏覽器基於之前鍵入過的值,應該顯示出在字段中填寫的選項。)

25.介紹一下標准的CSS的盒子模型?低版本IE的盒子模型有什么不同的?

(1)有兩種, IE 盒子模型、W3C 盒子模型;

(2)盒模型: 內容(content)、填充(padding)、邊界(margin)、 邊框(border);

(3)區  別: IE的content部分把 border 和 padding計算了進去;

26.CSS3新增偽類有那些?

 

 

語法

作用

目標偽類

 :target

突出顯示活動的html錨元素。

 

元素狀態偽類

:enabled

匹配每個已啟用元素

:disabled

匹配每個被禁用的元素

:checked

匹配每個被選中的input元素(限於radio和 checkbox)

 

 

結構偽類

:first-child

匹配屬於其父元素的首個子元素(td:first-child)

:last-child

匹配屬於其父元素的最后一個子元素

:empty

匹配沒有子元素的每個元素

:only-child

匹配屬於其父元素的唯一子元素

:nth-child(num)

匹配是其父元素中的第 num 個子元素(td:nth-child(2))

否定偽類

:not(selector)

在一組元素中將 滿足 selector 選擇器的元素排除出去

table td:not(:first-child)

27.display有哪些值?說明他們的作用。

  block         塊類型。默認寬度為父元素寬度,可設置寬高,換行顯示。

  none          缺省值。象行內元素類型一樣顯示。

  inline        行內元素類型。默認寬度為內容寬度,不可設置寬高,同行顯示。

  inline-block  默認寬度為內容寬度,可以設置寬高,同行顯示。

  list-item     象塊類型元素一樣顯示,並添加樣式列表標記。

  table         此元素會作為塊級表格來顯示。

  inherit       規定應該從父元素繼承 display 屬性的值。

28.position的值有哪些值?

absolute:生成絕對定位的元素,相對於值不為 static的第一個父元素進行定位。

fixed :(老IE不支持)生成絕對定位的元素,相對於瀏覽器窗口進行定位。

relative:生成相對定位的元素,相對於其正常位置進行定位。

static:默認值。沒有定位,元素出現在正常的流中(忽略 top, bottom, left, right z-index 聲明)。

inherit:規定從父元素繼承 position 屬性的值。

29.CSS3有哪些新特性?

      新增各種CSS選擇器  (: not(.input):所有 class 不是“input”的節點)

  圓角           (border-radius:8px)

  多列布局        (multi-column layout)

  陰影和反射        (Shadow\Reflect)

  文字特效      (text-shadow、)

  文字渲染      (Text-decoration)

  線性漸變      (gradient)

  旋轉          (transform)

  增加了旋轉,縮放,定位,傾斜,動畫,多背景

30.請解釋一下CSS3的Flexbox(彈性盒布局模型),以及適用場景?

https://segmentfault.com/a/1190000003942546

box-flex是css3新添加的盒子模型屬性,它的出現打破了我們經常使用的浮動布局,實現垂直等高、水平均分、按比例划分。但是它有一定的局限性,在firefox、chrome這瀏覽器下需要使用它們的私有屬性來定義:firefox(-moz)、chrome(-webkit)。

31.CSS里的visibility屬性有個collapse屬性值是干嘛用的?在不同瀏覽器下以后什么區別?

http://www.webhek.com/visibility-collapse

visibility有第三種值,visibility,hidden,collapse。當一個元素的visibility屬性被設置成collapse值后,對於一般的元素,它的表現跟hidden是一樣的。但例外的是,如果這個元素是table相關的元素,例如table行,table group,table列,table column group,它的表現卻跟display: none一樣,也就是說,它們占用的空間也會釋放。但是各種瀏覽器對collapse值的處理方式不一樣。

32.使用 CSS 預處理器嗎?喜歡那個?

css預處理器也叫動態樣式語言,擁有編程的變量、繼承、運算、函數的特性,它可以讓你的CSS更加簡潔、適應性更強、可讀性更佳,更易於代碼的維護等諸多好處,常用的有less、sass、stylus。

SASS 和 Compass 指南:http://ruby-china.org/topics/4396

33.CSS優化、提高性能的方法有哪些?

http://www.zhihu.com/question/19886806

1、提高代碼性能

  1、盡量將樣式寫在單獨的css文件里面,在head元素中引用

2、不使用@import

3、避免使用復雜的選擇器,層級越少越好

4、精簡頁面的樣式文件,去掉不用的樣式

5、利用CSS繼承減少代碼量

4、提高代碼的可維護性

 1、命名與備注

      2、提取重復樣式

 3、統一書寫順序

34.瀏覽器是怎樣解析CSS選擇器的?

https://segmentfault.com/q/1010000000713509

瀏覽器先產生一個元素集合,這個集合往往由最后一個部分的索引產生(如果沒有索引就是所有元素的集合)。然后向上匹配,如果不符合上一個部分,就把元素從集合中刪除,直到真個選擇器都匹配完,還在集合中的元素就匹配這個選擇器了。(從右往左)

35.**抽離樣式模塊怎么寫,說出思路,有無實踐經驗?

共用模塊的樣式都抽離出來,作為單獨的模塊來處理。

36.元素豎向的百分比設定是相對於容器的高度嗎?

height屬性取值百分比,是現對於容器高度的;

對於margin-top、margin-bottom、padding-top、padding-bottom這些豎直方向的內外邊距屬性的百分比取值,參考的其實是容器的寬度而不是高低。

37.解釋一下em,rem,px這些尺寸單位的不同。

http://www.jianshu.com/p/60ea15164b82

http://www.mamicode.com/info-detail-655497.html

px像素(Pixel),相對長度單位。像素px是相對於顯示器屏幕分辨率而言的;

em是相對長度單位。相對於當前對象內文本的字體尺寸。如當前對行內文本的字體尺寸未被人為設置,則相對於瀏覽器的默認字體尺寸;(任意瀏覽器的默認字體高都是16px。所有未經調整的瀏覽器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。為了簡化font-size的換算,需要在css中的body選擇器中聲明Font-size=62.5%,這就使em值變為 16px*62.5%=10px, 這樣12px=1.2em, 10px=1em, 也就是說只需要將你的原來的px數值除以10,然后換上em作為單位就行了)。

rem相對於根元素HTML的字體尺寸。

38.簡述canvas,SVG的區別?

canvas:在網頁中實現繪圖,主要繪制各種統計圖表,柱狀圖、餅圖、曲線圖、分布圖;以及制作游戲和動畫。

SVG:全稱為 Scalable Vector Graphics,譯為可縮放矢量圖形,簡稱矢量圖。是一種用來描述二維矢量圖形的 XML 標記語言。

 

SVG

Canvas

不依賴於分辨率

依賴於分辨率

使用DOM及事件處理器(DOM專門為SVG開放接口)

不能使用DOM及事件處理器

不能實現游戲開發

可以實現游戲開發

實現大型渲染區域的應用(例如百度地圖)

是以圖片(png

39.XHTML和HTML有什么區別?

HTML是一種基本的WEB網頁設計語言,XHTML是一個基於XML的置標語言

最主要的不同:XHTML的語法較為嚴謹,

1.元素必須被正確地嵌套。

2.元素必須被關閉。

3.標簽名必須用小寫字母。

4.XHTML 文檔必須擁有根元素。

還有就是XHTML可兼容各大瀏覽器、手機以及PDA,並且瀏覽器也能快速正確地編譯網頁。

40.前端頁面有哪三層構成,分別是什么?作用是什么?

網頁的結構層(structural layer由 HTML 或 XHTML 之類的標記語言負責創建。搭建文檔的結構。

網頁的表示層(presentation layer 由 CSS 負責創建。 設置文檔的呈現效果。

網頁的行為層(behavior layerJavascript 語言和 DOM 負責創建。去實現文檔的行為。

41.CSS清除浮動的幾種方法(至少兩種)

使用帶clear屬性的空元素;

使用CSS的overflow屬性;

使用CSS的:after偽元素;

使用鄰接元素處理;

42.CSS3有哪些新特性?

CSS3實現圓角(border-radius:8px),陰影(box-shadow:10px),對文字加特效(text-shadow、),線性漸變(gradient),旋轉(transform), 多背景 rgba

transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋轉,縮放,定位,傾斜

增加了更多的CSS選擇器:

屬性選擇器:E[foo^="bar"]:匹配foo屬性值以"bar"開始的E元素

                        E[foo$="bar"]:匹配foo屬性值以"bar"結束的E元素

                        E[foo*="bar"]:匹配foo屬性值包含"bar"的E元素

      結構偽類選擇器:

    E:root:匹配E所在文檔的根元素

  E:nth-child(n):匹配元素類型為E且是父元素的第n個子元素

  E:nth-last-child(n):匹配元素類型為E且是父元素的倒數第n個子元素(與上一項順序相反)

  E:nth-of-type(n):匹配父元素的第n個類型為E的子元素

  E:nth-last-of-type(n):匹配父元素的倒數第n個類型為E的子元素(與上一項順序相反)

  E:first-of-type:匹配父元素的第一個類型為E的子元素

  E:last-child:匹配元素類型為E且是父元素的最后一個子元素

  E:last-of-type:匹配父元素的最后一個類型為E的子元素

  E:only-child:匹配元素類型為E且是父元素中唯一的子元素

  E:only-of-type:匹配父元素中唯一子元素是E的子元素

  E:empty:匹配不包含子節點(包括文本)的E元素

 

 

 

 

二.JavaScript

1.JavaScript的typeof返回哪些數據類型?

undefined, string,number,boolean,object,function,symbol

①可以判別原始類型,原始數據類型:

undefined, string,number,boolean,symbol

除了null之外,返回object;

eg:  typeof 1 返回結果:"number" ;typeof {} 返回結果:"object";

②不能判別具體的對象類型,除了function之外

eg:  typeof [1] 返回結果:"object" typeof function(){} 返回結果:"function";

2.split()和join()的區別?

join() 方法用於把數組中的所有元素放入一個字符串。

元素是通過指定的分隔符進行分隔的。

指定分隔符方法join("#");其中#可以是任意;

var a=new Array();

a[0]="XHTML";

a[1]="CSS";

a[2]="JavaScript";

a.join("-->");

"XHTML-->CSS-->JavaScript"

split()方法:用於把一個字符串分割成字符串數組

var str="aaa,bbb,ccc,ddd";

str.split(",");

["aaa", "bbb", "ccc", "ddd"]

split,是把一串字符(根據某個分隔符)分成若干個元素存放在一個數組里。而Join是 把數組中的字符串連成一個長串,可以大體上認為是split的逆操作。

3.談談This對象的理解。

http://blog.jobbole.com/67347/

this是js的一個關鍵字,隨着函數使用場合不同,this的值會發生變化。

但是有一個總原則,那就是this指的是調用函數的那個對象。

this一般情況下:是全局對象Global。 作為方法調用,那么this就是指這個對象

4.JS中null和undefined的區別。

www.ruanyifeng.com/blog/2014/03/undefined

null是一個表示"無"的對象,轉為數值時為0;undefined是一個表示"無"的原始值,轉為數值時為NaN。

null表示"沒有對象",即該處不應該有值。典型用法是:

(1)作為函數的參數,表示該函數的參數不是對象。

(2)作為對象原型鏈的終點。Object.getPrototypeOf(Object.prototype)

// null

undefined表示"缺少值",就是此處應該有一個值,但是還沒有定義。典型用法是:

(1)變量被聲明了,但沒有賦值時,就等於undefined。

(2) 調用函數時,應該提供的參數沒有提供,該參數等於undefined。

(3)對象沒有賦值的屬性,該屬性的值為undefined。

(4)函數沒有返回值時,默認返回undefined。

var i;

i // undefined

function f(x){console.log(x)}f() // undefined

var  o = new Object();

o.p // undefinedvar x = f();

x // undefined

 

5.你對JSON的了解?常見格式。

JSON:JavaScript 對象表示法(JavaScript Object Notation)。

https://segmentfault.com/a/1190000000668072

JSON有兩種結構

json簡單說就是javascript中的對象和數組,所以這兩種結構就是對象和數組兩種結構,通過這兩種結構可以表示各種復雜的結構

1、對象:對象在js中表示為“{}”括起來的內容,數據結構為 {key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,取值方法為對象.key 獲取屬性值,這個屬性值的類型可以是數字、字符串、數組、對象幾種。

2、數組:數組在js中是中括號“[]”括起來的內容,數據結構為 ["java","javascript","vb",...],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是數字、字符串、數組、對象幾種。
經過對象、數組2種結構就可以組合成復雜的數據結構了。

JavaScript中有5種簡單數據類型(也稱為基本數據類型):Undefined、Null、Boolean、Number和String。還有1種復雜數據類型——Object,Object本質上是由一組無序的名值對組成的。

6.異步加載JS的方式有哪些?

http://blog.csdn.net/l522703297/article/details/50754695

一:同步加載

我們平時使用的最多的一種方式。

<script src="http://yourdomain.com/script.js"></script>

<script src="http://yourdomain.com/script.js"></script>

同步模式,又稱阻塞模式,會阻止瀏覽器的后續處理,停止后續的解析,只有當當前加載完成,才能進行下一步操作。所以默認同步執行才是安全的。但這樣如果js中有輸出document內容、修改dom、重定向等行為,就會造成頁面堵塞。所以一般建議把<script>標簽放在<body>結尾處,這樣盡可能減少頁面阻塞。

二:異步加載

異步加載又叫非阻塞加載,瀏覽器在下載執行js的同時,還會繼續進行后續頁面的處理。主要有三種方式。

方法一:也叫Script DOM Element

(function(){

    var scriptEle = document.createElement("script");

    scriptEle.type = "text/javasctipt";

    scriptEle.async = true;

    scriptEle.src = "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js";

    var x = document.getElementsByTagName("head")[0];

    x.insertBefore(scriptEle, x.firstChild);     

 })();

<async>屬性是HTML5中新增的異步支持。此方法被稱為Script DOM Element 方法。Google Analytics Google+ Badge 都使用了這種異步加載代碼

(function(){;

    var ga = document.createElement('script');

    ga.type = 'text/javascript';

    ga.async = true;

    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

    var s = document.getElementsByTagName('script')[0];

    s.parentNode.insertBefore(ga, s);

})();

但是這種加載方式執行完之前會阻止onload事件的觸發,而現在很多頁面的代碼都在onload時還執行額外的渲染工作,所以還是會阻塞部分頁面的初始化處理。

方法二:onload時的異步加載

(function(){

    if(window.attachEvent){

    window.attachEvent("load", asyncLoad);

    }else{

    window.addEventListener("load", asyncLoad);

    }

    var asyncLoad = function(){

    var ga = document.createElement('script');

        ga.type = 'text/javascript';

        ga.async = true;

        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

        var s = document.getElementsByTagName('script')[0];

        s.parentNode.insertBefore(ga, s);

    }

)();

這種方法只是把插入script的方法放在一個函數里面,然后放在window的onload方法里面執行,這樣就解決了阻塞onload事件觸發的問題。

注:DOMContentLoaded與load的區別。前者是在document已經解析完成,頁面中的dom元素可用,但是頁面中的圖片,視頻,音頻等資源未加載完,作用同jQuery中的ready事件;后者的區別在於頁面所有資源全部加載完畢。

方法三:其他方法

由於JavaScript的動態性,還有很多異步加載方法: XHR Injection、 XHR Eval、 Script In Iframe、 Script defer屬性、 document.write(script tag)。

XHR Injection(XHR 注入):通過XMLHttpRequest來獲取javascript,然后創建一個script元素插入到DOM結構中。ajax請求成功后設置script.text為請求成功后返回的responseText。

  //獲取XMLHttpRequest對象,考慮兼容性。

    var getXmlHttp = function(){

        var obj;

        if (window.XMLHttpRequest)

            obj = new XMLHttpRequest();

        else

            obj = new ActiveXObject("Microsoft.XMLHTTP");

        return obj;

    }; 

    //采用Http請求get方式;open()方法的第三個參數表示采用異步(true)還是同步(false)處理

    var xmlHttp = getXmlHttp();

    xmlHttp.open("GET", "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js", true);

    xmlHttp.send();

    xmlHttp.onreadystatechange = function(){

        if (xmlHttp.readyState == 4 && xmlHttp.status == 200){

            var script = document.createElement("script");

            script.text = xmlHttp.responseText;

            document.getElementsByTagName("head")[0].appendChild(script);

        }

    }     

基於jQueryAjax

<script type="text/javascript" src="jquery.js">  

<script type="text/javascript">  

$(document).ready(function() {  

        $.ajax({  

       type: 'GET',  

       url:'test.js',  

       async:true,  //asynctrue的時候是異步的  

                   dataType,'script'})    //dataTypescript的時候已經幫你把返回結果用script類型的dom元素添加到文檔中了,如果跨域,POST會轉換為GET  

});  

</script>  

分析:使用xmlHttpRequest的動態加載技術,說白了就是ajax,其實就是在上述三種方法的基礎上包裝上一層ajax而已,同步異步你自己控制,兼容性如何得看你用哪種方法實現了,我給的例子直接使用了jquery庫,兼容性非常好,而且你不需要寫一堆關於xmlHttpRequest的東西,若你不想用第三方庫,那自己百度個手工實現ajax吧。

 

Script In iframe:在父窗口插入一個iframe元素,然后再iframe中執行加載JS的操作。

    var inJS = function(){alert(2)};

    var iframe = document.createElement("iframe");

    document.body.appendChild(iframe);

    var doc = iframe.contentWindow.document;//獲取iframe中的window要用contentWindow屬性。

    doc.open();

   doc.write("<script>var inJS=function(){};<\/script><body onload='inJS()'></body>");

    doc.close();

HTML5新特性

defer屬性:IE4.0就出現。defer屬聲明腳本中將不會有document.write和dom修改。瀏覽器會並行下載其他有defer屬性的script。而不會阻塞頁面后續處理。注:所有的defer腳本必須保證按順序執行的。

<script type="text/javascript" defer></script>

async屬性:HTML5新屬性。腳本將在下載后盡快執行,作用同defer,但是不能保證腳本按順序執行。他們將在onload事件之前完成。

<script type="text/javascript" defer></script>

Firefox 3.6、Opera 10.5、IE 9和最新的Chrome和Safari都支持async屬性。可以同時使用async和defer,這樣IE 4之后的所有IE都支持異步加載。

沒有async屬性,script將立即獲取(下載)並執行,期間阻塞了瀏覽器的后續處理。如果有async屬性,那么script將被異步下載並執行,同時瀏覽器繼續后續的處理。

總結:對於支持HTML5的瀏覽器,實現JS的異步加載只需要在script元素中加上async屬性,為了兼容老版本的IE還需加上defer屬性;對於不支持HTML5的瀏覽器(IE可以用defer實現),可以采用以上幾種方法實現。原理基本上都是向DOM中寫入script或者通過eval函數執行JS代碼,你可以把它放在匿名函數中執行,也可以在onload中執行,也可以通過XHR注入實現,也可以創建一個iframe元素,然后在iframe中執行插入JS代碼。

三:延遲加載

有些JS代碼在某些情況在需要使用,並不是頁面初始化的時候就要用到。延遲加載就是為了解決這個問題。將JS切分成許多模塊,頁面初始化時只加載需要立即執行的JS,然后其它JS的加載延遲到第一次需要用到的時候再加載。類似圖片的延遲加載。

JS的加載分為兩個部分:下載和執行。異步加載只是解決了下載的問題,但是代碼在下載完成后就會立即執行,在執行過程中瀏覽器處於阻塞狀態,響應不了任何需求。

解決思路:為了解決JS延遲加載的問題,可以利用異步加載緩存起來,但不立即執行,需要的時候在執行。如何進行緩存呢?將JS內容作為Image或者Object對象加載緩存起來,所以不會立即執行,然后在第一次需要的時候在執行。

    1:模擬較長的下載時間:

利用thread讓其sleep一段時間在執行下載操作。

    2:模擬較長的JS代碼執行時間

    var start = Number(new Date());

    while(start + 5000 > Number(new Date())){//執行JS}

這段代碼將使JS執行5秒才完成!

JS延遲加載機制(LazyLoad):簡單來說,就是在瀏覽器滾動到某個位置在觸發相關的函數,實現頁面元素的加載或者某些動作的執行。如何實現瀏覽器滾動位置的檢測呢?可以通過一個定時器來實現,通過比較某一時刻頁面目標節點位置和瀏覽器滾動條高度來判斷是否需要執行函數。

7.Ajax是什么,寫一個簡單的使用方法。

 Asynchronouse Javascript And XML:異步的JS和XML

 AJAX技術的本質:在用戶瀏覽頁面的同時,瀏覽器底層向服務器發出HTTP請求,並處理服務器返回的響應消息。

 AJAX的典型應用:搜索建議、在線股票、在線聊天室、即時的數據驗證、級聯下拉列表

簡單使用方法:保存數據到服務器,成功時顯示信息。

jQuery 代碼:

$.ajax({

   type: "POST",

   url: "some.php",

   data: "name=John&location=Boston",

   success: function(msg){

     alert( "Data Saved: " + msg );

   }

});

8.webSocket是干嘛用的?

http://blog.sina.com.cn/s/blog_acddf95d0101beuj.html

WebSocket協議是一種雙向通信協議,它建立在TCP之上,同http一樣通過TCP來傳輸數據,但是它和http最大的不同有兩點:1.WebSocket是一種雙向通信協議,在建立連接后,WebSocket服務器和Browser/UA都能主動的向對方發送或接收數據,就像Socket一樣,不同的是WebSocket是一種建立在Web基礎上的一種簡單模擬Socket的協議;2.WebSocket需要通過握手連接,類似於TCP它也需要客戶端和服務器端進行握手連接,連接成功后才能相互通信。(之前網站的實時通訊技術都是輪詢,就是特定的時間,瀏覽器向服務器發送請求,缺點很占用帶寬)

    Websocket實現即時服務好處:

1. header:相互溝通的header是很小的,大概只有2Bytes

                   2. server Prsh:服務器的推送,服務器不在被動的接受瀏覽器的request之后才返回數據,而是有新數據時就主動推送給瀏覽器。

 

 

9.Get和Post的區別?數據怎樣獲取?

(1)GET請求提交的數據在地址欄能看到,POST看不到,get安全性非常低,post安全性較高。

(2)GET請求把請求數據追加在請求URI后面,以?開頭;POST請求把請求數據追加在請求主體中

(3)HTTP協議規定:請求消息起始行總長度不能超過1024字節;請求主體長度沒有限制。GET請求提交的數據或是漢字一般也就幾十個,不超過2kb。post傳送的數據量較大,一般被默認為不受限制.

(4)語義不同:get是從服務器上獲取數據,post是向服務器傳送數據。

10.用JS和jQuery怎樣獲得元素節點?

JS:document.getElementById(‘idName’);/document.getElementsByTagName(‘標簽名’);

jQuery:$.(‘#idName’);/$.(‘標簽名’);

 

11.用jQuery如何操作頁面,添加樣式和屬性?

jq.css( name )                     獲取樣式的值,$('div').css('color');

jq.css( name, value )        設置樣式的值,$('div').css('color', 'red');

jq.css( {name:value, name:value} )

jq.addClass( className )                  為選定元素添加一個class

jq.removeClass( className )           為選定元素刪除一個class

jq.hasClass( className )                   判斷選定元素是否有指定class

jq.toggleClass( className )             切換class:有則刪除,無則添加

 

12.JS中的數據類型,嘗試畫一下內存結構

基本數據類型:null ,undefined ,number ,boolean ,string,symbol(ES6新增)

引用數據類型:object

http://es6.ruanyifeng.com/#docs/symbol

 

13.jQuery綁定事件的方法,不少於2種

(1)bind& unbind:為選定元素綁定特定事件的處理函數

         jq.bind( '事件名',  fn )

(2)one:為選定元素綁定一次事件處理函數

         jq.one( '事件名', fn )

 (3)click / dblclick / mouseover / mouseout .... : bind()函數的簡化

         jq.click( fn )   等價於   jq.bind('click', fn)

         注意:DOM所有事件中,只有一部分(23個事件)有簡化版本                 

上述3種方法只能為DOM樹已經存在的元素綁定監聽函數,無法為后創建的元素綁定監聽函數。

(4)delegate( ):子元素委托父元素代理處理自己的事件

         $('父元素').delegate('子元素', '事件名', fn)

                           

(5)live:指定子元素把指定的事件全部委托給document對象——jQuery1.8之后刪除了此方法。

                   $(子元素).live('事件名',  fn)

(6)on :可以實現類似bind / delegate的所有功能

         類似bind的使用方法(把監聽函數綁定在事件源上):

                   $('子元素').on('事件名', fn)

         類似delegate的使用方法(把監聽函數委托在父元素上):

                   $('父元素').on('事件名', '子元素', fn)

                            fn中的this 指的是子元素

 

#####14. 有這樣一個URLhttp://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,請寫一段js程序提取URL中的各個GET參數(參數名和參數個數不確定),將其按key-value形式返回到一個json結構中,如{a:’1’,b:’2’,c:’’,d:’XXX’,e:undefined}

function serilizeUrl(url) {

    var result = {};

    url = url.split("?")[1];

    console.log(url);//a=1&b=2&c=&d=xxx&e

    var map = url.split("&");

    console.log(map);//["a=1", "b=2", "c=", "d=xxx", "e"]

    for(var i=0;i<map.length;i++) {

        result[map[i].split("=")[0]] = map[i].split("=")[1];

    }

    return result;

}

var url='http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e';

console.log(serilizeUrl(url));//Object {a: "1", b: "2", c: "", d: "xxx", e: undefined}

#####15.現有數組對象[{obj:{name:”jhon”}},{obj:{sex:”nan”}}],js實現轉換json格式{obj:{name:”jhon”,sex:”nan”}}.

        var arr=[{obj:{name:"jhon"}},{obj:{sex:"nan"}}];

    //-->{obj:{name:”jhon”,sex:”nan”}}

    var obj1={}

    for(var i=0;i<arr.length;i++){

       for(var k in arr[i].obj){

           obj1[k]=arr[i].obj[k];

       }

    }

    for( var k in arr[0]){

       var jsonObj={};

       jsonObj[k]=obj1;

       console.log(JSON.stringify(jsonObj));//{"obj":{"name":"jhon","sex":"nan"}}

    }

16.什么是閉包,閉包有什么用?請舉例說明.

閉包就是:外層函數將內層函數封裝受保護的局部變量返回到外部。實現可重用的局部變量,且保護其不受污染。

閉包的特性: 1.函數內再嵌套函數;2.內部函數可以引用外層的參數和變量;3.參數和變量不會被垃圾回收機制回收.

function foo() {

       var a = 1;

       function bar() {

           a = a + 1;

           alert(a);

       }

       return bar;

    }

    var closure = foo(); // 這個時候返回的是 bar() 這個函數外加其包上的變量 a;

    console.log(closure);

    var closure2 = foo(); // 這里同樣生成了另外一個閉包(實例)

    console.log(closure2);

    closure(); // 2

    closure2(); // 2 , 綁定了另外一份變量 a

    closure(); // 3

    closure2(); //3

 

17.寫一個數組去重的方法。

         (1) 構建一個新的數組存放結果;for循環中每次從原數組中取出一個元素,用這個元素循環與結果數組對比;若結果數組中沒有該元素,則存到結果數組中.

        Array.prototype.unique1 = function(){

       var res = [this[0]];

       for(var i = 1; i < this.length; i++){

           var repeat = false;

           for(var j = 0; j < res.length; j++){

             if(this[i] === res[j]){

              repeat = true;

              break;

              }

           }

             if(!repeat){

              res.push(this[i]);

             }

        }

       return res;

    }

    var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]

    console.log(arr.unique1());

(2) 先將原數組進行排序;檢查原數組中的第i個元素與結果數組中的最后一個元素是否相同,因為已經排序,所以重復元素會在相鄰位置;如果不相同,則將該元素存入結果數組中.

        Array.prototype.unique2 = function(){

        this.sort(); //先排序

        var res = [this[0]];

        for(var i = 1; i < this.length; i++){

           if(this[i] !== res[res.length - 1]){

            res.push(this[i]);

           }

        }

        return res;

    }

var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0]

console.log(arr.unique2());//[0, 1, "a", "b", "d", "e"]

    這種方法也會有一定的局限性,因為在去重前進行了排序,所以最后返回的去重結果也是排序后的。如果要求不改變數組的順序去重,那這種方法便不可取了

(3).創建一個新的數組存放結果;創建一個空對象;for循環時,每次取出一個元素與對象進行對比,如果這個元素不重復,則把它存放到結果數組中,同時把這個元素的內容作為對象的一個屬性,並賦值為1,存入到第2步建立的對象中。

說明:至於如何對比,就是每次從原數組中取出一個元素,然后到對象中去訪問這個屬性,如果能訪問到值,則說明重復。

                  Array.prototype.unique3 = function(){

        var res = [];

        var json = {};

        for(var i = 0; i < this.length; i++){

           if(!json[this[i]]){

              res.push(this[i]);

              json[this[i]] = 1;

            }

        }

        console.log(json);//Object {34: 1, 112: 1, 你好: 1, str: 1, str1: 1}

        return res;

    }

    var arr = [112,112,34,'你好',112,112,34,'你好','str','str1'];

    console.log(arr.unique3());//[112, 34, "你好", "str", "str1"];

18.如何實現瀏覽器內多個標簽頁之間的通信?

WebSocket、SharedWorker;

也可以調用localStorge、cookies等本地存儲方式;

localStorge另一個瀏覽上下文里被添加、修改或刪除時,它都會觸發一個事件window.onstorage = function(){ localStrorage存儲的內容發生改變 } ,我們通過監聽事件,控制它的值來進行頁面信息通信;

a.html

// location.href [http://xxx/a.html]

// 兩種方法設置 localStorage

localStorage['location.href'] = location.href;

localStorage.setItem('location.href', location.href);

b.html

// location.href [http://xxx/xxx/b.html]

// 兩種方法獲取 localStorage

console.info(localStorage['location.href']);

console.info(localStorage.getItem('location.href'));

// 輸出 http://xxx/a.html

注意quirks:Safari 在無痕模式下設置localstorge值時會拋出 QuotaExceededError 的異常;

19.網頁中的事件總結

http://blog.csdn.net/qx1995318/article/details/51921736

Html事件列表

一般事件:

onClick: 鼠標點擊事件,多用在某個對象控制的范圍內的鼠標點擊

onDblClick: 鼠標雙擊事件

onMouseDown: 鼠標上的按鈕被按下了

onMouseUp: 鼠標按下后,松開時激發的事件

onMouseOver: 當鼠標移動到某對象范圍的上方時觸發的事件

onMouseMove: 鼠標移動時觸發的事件

onMouseOut: 當鼠標離開某對象范圍時觸發的事件

onKeyPress: 當鍵盤上的某個鍵被按下並且釋放時觸發的事件.[注意:頁面內必須有被聚焦的對象]

onKeyDown: 當鍵盤上某個按鍵被按下時觸發的事件[注意:頁面內必須有被聚焦的對象]

onKeyUp: 當鍵盤上某個按鍵被按放開時觸發的事件[注意:頁面內必須有被聚焦的對象]

 

頁面相關事件:

onAbort: 圖片在下載時被用戶中斷

onBeforeUnload: 當前頁面的內容將要被改變時觸發的事件

onError: 捕抓當前頁面因為某種原因而出現的錯誤,如腳本錯誤與外部數據引用的錯誤

onLoad: 頁面內空完成傳送到瀏覽器時觸發的事件,包括外部文件引入完成

onMove: 瀏覽器的窗口被移動時觸發的事件

onResize: 當瀏覽器的窗口大小被改變時觸發的事件

onScroll: 瀏覽器的滾動條位置發生變化時觸發的事件

onStop: 瀏覽器的停止按鈕被按下時觸發的事件或者正在下載的文件被中斷

onUnload: 當前頁面將被改變時觸發的事件

 

表單相關事件:

onBlur: 當前元素失去焦點時觸發的事件 [鼠標與鍵盤的觸發均可]

onChange: 當前元素失去焦點並且元素的內容發生改變而觸發的事件 [鼠標與鍵盤的觸發均可]

onFocus: 當某個元素獲得焦點時觸發的事件

onReset: 當表單中RESET的屬性被激發時觸發的事件

onSubmit: 一個表單被遞交時觸發的事件

 

滾動字幕事件:

onBounce: Marquee內的內容移動至Marquee顯示范圍之外時觸發的事件

onFinish: Marquee元素完成需要顯示的內容后觸發的事件

onStart: Marquee元素開始顯示內容時觸發的事件

 

編輯事件:

onBeforeCopy:當頁面當前的被選擇內容將要復制到瀏覽者系統的剪貼板前觸發的事件

onBeforeCut: 當頁面中的一部分或者全部的內容將被移離當前頁面[剪貼]並移動到瀏覽者的系統剪貼板時觸發的事件

onBeforeEditFocus: 當前元素將要進入編輯狀態

onBeforePaste: 內容將要從瀏覽者的系統剪貼板傳送[粘貼]到頁面中時觸發的事件

onBeforeUpdate: 當瀏覽者粘貼系統剪貼板中的內容時通知目標對象

onContextMenu: 當瀏覽者按下鼠標右鍵出現菜單時或者通過鍵盤的按鍵觸發頁面菜單時觸發的事件 [試試在頁面中的中加入onContentMenu="return false"就可禁止使用鼠標右鍵了]

onCopy: 當頁面當前的被選擇內容被復制后觸發的事件

onCut: 當頁面當前的被選擇內容被剪切時觸發的事件

onDrag: 當某個對象被拖動時觸發的事件 [活動事件]

onDragDrop: 一個外部對象被鼠標拖進當前窗口或者幀

onDragEnd:當鼠標拖動結束時觸發的事件,即鼠標的按鈕被釋放了

onDragEnter: 當對象被鼠標拖動的對象進入其容器范圍內時觸發的事件

onDragLeave: 當對象被鼠標拖動的對象離開其容器范圍內時觸發的事件

onDragOver: 當某被拖動的對象在另一對象容器范圍內拖動時觸發的事件 [活動事件]

onDragStart: 當某對象將被拖動時觸發的事件

onDrop: 在一個拖動過程中,釋放鼠標鍵時觸發的事件

onLoseCapture: 當元素失去鼠標移動所形成的選擇焦點時觸發的事件

onPaste: 當內容被粘貼時觸發的事件

onSelect: 當文本內容被選擇時的事件

onSelectStart:當文本內容選擇將開始發生時觸發的事件

 

數據綁定:

onAfterUpdate : 當數據完成由數據源到對象的傳送時觸發的事件

onCellChange:當數據來源發生變化時

onDataAvailable: 當數據接收完成時觸發事件

onDatasetChanged: 數據在數據源發生變化時觸發的事件

onDatasetComplete: 當來子數據源的全部有效數據讀取完畢時觸發的事件

onErrorUpdate: 當使用onBeforeUpdate事件觸發取消了數據傳送時,代替onAfterUpdate事件

onRowEnter:當前數據源的數據發生變化並且有新的有效數據時觸發的事件

onRowExit:當前數據源的數據將要發生變化時觸發的事件

onRowsDelete: 當前數據記錄將被刪除時觸發的事件

onRowsInserted: 當前數據源將要插入新數據記錄時觸發的事件

 

外部事件:

onAfterPrint: 當文檔被打印后觸發的事件

onBeforePrint: 當文檔即將打印時觸發的事件

onFilterChange: 當某個對象的濾鏡效果發生變化時觸發的事件

onHelp: 當瀏覽者按下F1或者瀏覽器的幫助選擇時觸發的事件

onPropertyChange: 當對象的屬性之一發生變化時觸發的事件

onReadyStateChange: 當對象的初始化屬性值發生變化時觸發的事件

20.查看以下代碼

var a=document.getElementById("d1");

a.onclick=fun1;

a.onclick=fun2;

對象a被綁定的點擊事件將執行的函數(fun1,fun2為函數)是什么?

 

<a href="#" id="d1">1111111111111111</a>

    <script>

    var a=document.getElementById("d1");

    a.onclick=fun1;

    a.onclick=fun2;

    function fun1(){

       a.innerHTML="222222";

       console.log(22222);

    }

    function fun2(){

       a.innerHTML="33333";

       console.log(33333);

    }

    </script>

a對象被點擊后執行的是fun2;

#####21.在javascript中==和===的區別?分別說出以下返回的布爾值

false==’false’;false==0;false===0;0==’’;’’===0;0==’0’;0===’0’;

 

==用於一般比較,===用於嚴格比較,==在比較的時候可以轉換數據類型,===嚴格比較,只要類型不匹配就返回flase。

false==’false’;//false

false==0;//true

false===0;//false

0==’’;//true

’’===0;//false

0==’0’;//true

0===’0’;//false

22.核心DOM與HTML DOM的區別?

http://www.wtoutiao.com/p/1f4LxOv.html

(1)核心DOM:遍歷DOM樹、添加新節點、刪除節點、修改節點,核心DOM適合操作節點,如創建,刪除,查找等。(對象:Document,Node,   ElementNode,TextNode,AttributeNode,CommentNode,NodeList )

(2)HTML DOM:以一種簡便的方法訪問DOM樹,HTML DOM適合操作屬性,如讀取或修改屬性的值。(對象:image,Table,Form,Input,Select...HTML標簽對象化)

HTML DOM是核心DOM的一種簡化。

 

23.列舉三種強制轉換和兩種隱式轉換的方式。

強制轉換:Numble();Boolean();ParseInt();

隱式轉換:字符串+數字,==比較

24.寫一個方法,讓b繼承a的方法。

function a(){

       console.log('aaa');

    }

    a.prototype={

       aa:function(){

           console.log('AAAAA');

       }

    }

    function b(){

       console.log("bbb");

       a.apply(this,arguments);

    }

    // b.prototype=a.prototype;

    Object.setPrototypeOf(b.prototype,a.prototype);

    var bb=new b;

    bb.aa();

#####25.寫出以下代碼依次輸出的結果:__,__,__,__;

var a=10;

sayHi();

function sayHi(){

  var a=a+10;

  alert(a);

  return a;

}

alert(a);

alert(sayHi()+10);

NaN,10,NaN,NaN;

26.簡單區分數組方法pop() push() unshift() shift()。

Push()尾部添加 pop()尾部刪除

Unshift()頭部添加 shift()頭部刪除

27.call和apply的區別?

http://www.cnblogs.com/fighting_cp/archive/2010/09/20/1831844.html

方法傳遞的參數不同:

Object.call(this,obj1,obj2,obj3)

Object.apply(this,arguments)

28.事件委托是什么?

利用事件冒泡的原理,讓自己的所觸發的事件,由他的父元素代替執行!

29.如何阻止事件冒泡和默認事件

功能:停止事件冒泡

function stopBubble(e) {

    // 如果提供了事件對象,則這是一個非IE瀏覽器

    if ( e && e.stopPropagation ) {

        // 因此它支持W3CstopPropagation()方法

        e.stopPropagation();

    }else{

        // 否則,我們需要使用IE的方式來取消事件冒泡

 

        window.event.cancelBubble = true;

    }

}

功能:阻止事件默認行為

function stopDefault( e ) {

   // 阻止默認瀏覽器動作(W3C)

     if ( e && e.preventDefault ) {

         e.preventDefault();

     } else {

        // IE中阻止函數器默認動作的方式

        window.event.returnValue = false;

    }

    return false;

}

30.介紹js有哪些內置對象?

http://www.jb51.net/w3school/js/js_reference.htm

http://www.cnblogs.com/yujon/p/5467576.html

Object JavaScript 中所有對象的父對象

數據封裝類對象:ObjectArrayBooleanNumber String

其他對象:FunctionArgumentsMathDateRegExpError

31.說幾條寫JavaScript的基本規范

http://www.cnblogs.com/luoting/archive/2013/03/09/2938062.html

1.不要在同一行聲明多個變量。

2.使用 ===/!==來比較true/false或者數值

3.使用對象字面量替代new Array這種形式

4.不要使用全局函數。

5.Switch語句必須帶有default分支

6.函數不應該有時候有返回值,有時候沒有返回值。

7.For循環必須使用大括號

8.If語句必須使用大括號

9.for-in循環中的變量 應該使用var關鍵字明確限定作用域,從而避免作用域污染。

32.簡述對JavaScript原型,原型鏈的理解,它們有什么特點?

每個對象都會在其內部初始化一個屬性,就是prototype(原型),當我們訪問一個對象的屬性時,如果這個對象內部不存在這個屬性,那么他就會去prototype里找這個屬性,這個prototype又會有自己的prototype,於是就這樣一直找下去,也就是我們平時所說的原型鏈的概念。

關系:instance.constructor.prototype = instance.__proto__

特點:

JavaScript對象是通過引用來傳遞的,我們創建的每個新對象實體中並沒有一份屬於自己的原型副本。當我們修改原型時,與之相關的對象也會繼承這一改變。

 當我們需要一個屬性的時,Javascript引擎會先看當前對象中是否有這個屬性, 如果沒有的話,就會查找他的Prototype對象是否有這個屬性,如此遞推下去,一直檢索到 Object 內置對象。

    function Func(){}

    Func.prototype.name = "Sean";

    Func.prototype.getInfo = function() {

      return this.name;

    }

    var person = new Func();//現在可以參考var person = Object.create(oldObject);

    console.log(person.getInfo());//它擁有了Func的屬性和方法

    //"Sean"

    console.log(Func.prototype);

    // Func { name="Sean", getInfo=function()}

 

 

 

 

33.JavaScript繼承的幾種實現方式?

function Animal(){

    this.species = "動物";

}

function Cat(name,color){

    this.name = name;

    this.color = color;

}

1、構造繼承

function Cat(name,color){

Animal.apply(this, arguments);

this.name = name;

this.color = color;

}

var cat1 = new Cat("大毛","黃色");

alert(cat1.species); // 動物

2、原型繼承

   Cat.prototype = new Animal();

  Cat.prototype.constructor = Cat;

  var cat1 = new Cat("大毛","黃色");

  alert(cat1.species); // 動物

3、利用空對象作為中介

  var F = function(){};

  F.prototype = Animal.prototype;

  Cat.prototype = new F();

  Cat.prototype.constructor = Cat;

4、拷貝繼承

.....

http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html

http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html

http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html

34.寫一個duplicator方法,使其實現數組復制並添加到該數組后面,eg:[1,2,3,4].duplicator()---->[1,2,3,4,1,2,3,4].

                     Array.prototype.duplicator=function(){

             

              var newArr=this.concat(this);

              return newArr;

           }

           var arr=[1,2,3,4,5,6];

           var doubleArr=arr.duplicator();

           console.log(doubleArr);//[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]

三.其他

1.常見的瀏覽器內核。

瀏覽器內核的解析和對比:http://www.cnblogs.com/fullhouse/archive/2011/12/19/2293455.html

 

瀏覽器內核

瀏覽器

私有屬性前綴

備注

Webkit內核

Safari ,Chrome

-webkit-

Chrome內核:Blink(WebKit的分支)

Gecko內核

Mozilla(常指的是Firefox瀏覽器)

-moz-

 

Presto內核

Opera

-o-

Opera內核原為:Presto,現為:Blink;

Trident內核

IE瀏覽器

-ms-

 

 

2.常見的瀏覽器問題有哪些,如何解決?

(1)png24位的圖片在iE6瀏覽器上出現背景,解決方案是做成png8位.

(2)瀏覽器默認的margin和padding不同。解決方案是加一個全局的*{margin:0;padding:0;}來統一。

(3)IE6雙邊距bug:塊屬性標簽float后,又有橫行的margin情況下,在ie6顯示margin比設置的大.浮動ie產生的雙倍距離 #box{ float:left; width:10px; margin:0 0 0 10px;}

 這種情況之下IE會產生20px的距離,解決方案是在float的標簽樣式控制中加入 ——_display:inline;將其轉化為行內屬性。(_這個符號只有ie6會識別)

  漸進識別的方式,從總體中逐漸排除局部。

  首先,巧妙的使用“\9”這一標記,將IE游覽器從所有情況中分離出來。

  接着,再次使用“+”將IE8和IE7、IE6分離開來,這樣IE8已經獨立識別。

 css

      .bb{

       background-color:#f1ee18;/*所有識別*/

background-color:#00deff\9; /*IE678識別*/

      +background-color:#a200ff;/*IE67識別*/

      _background-color:#1e0bd1;/*IE6識別*/

      }

(4) IE下,可以使用獲取常規屬性的方法來獲取自定義屬性,也可以使用getAttribute()獲取自定義屬性;Firefox下,只能使用getAttribute()獲取自定義屬性.

   解決方法:統一通過getAttribute()獲取自定義屬性.

(5) IE下,even對象有x,y屬性,但是沒有pageX,pageY屬性; Firefox下,event對象有pageX,pageY屬性,但是沒有x,y屬性.

解決方法:(條件注釋)缺點是在IE瀏覽器下可能會增加額外的HTTP請求數。

(6)Chrome 中文界面下默認會將小於 12px 的文本強制按照 12px 顯示, 可通過加入 CSS 屬性 -webkit-text-size-adjust: none; 解決.

超鏈接訪問過后hover樣式就不出現了 被點擊訪問過的超鏈接樣式不在具有hover和active了解決方法是改變CSS屬性的排列順序:

L-V-H-A :  a:link {} a:visited {} a:hover {} a:active {}

(7)設置較小高度標簽(一般小於10px),在IE6,IE7,遨游中高度超出自己設置高度

解決方案:給超出高度的標簽設置overflow:hidden;或者設置行高line-height 小於你設置的高度。

備注:這種情況一般出現在我們設置小圓角背景的標簽里。出現這個問題的原因是IE8之前的瀏覽器都會給標簽一個最小默認的行高的高度。即使你的標簽是空的,這個標簽的高度還是會達到默認的行高。

(8)其他:各種特殊樣式的兼容,比如透明度、圓角、陰影等。特殊樣式每個瀏覽器的代碼區別很大,所以,只能現查資料通過給不同瀏覽器寫不同的代碼來解決。

推薦兩個網站:caniuse.com以及html5test.com,大家在使用新技術前,可以在這兩個網站上看看瀏覽器的支持情況

3.介紹一下你對瀏覽器內核的理解?

主要分成兩部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎。

渲染引擎:負責取得網頁的內容(HTML、XML、圖像等等)、整理訊息(例如加入CSS等),以及計算網頁的顯示方式,然后會輸出至顯示器或打印機。瀏覽器的內核的不同對於網頁的語法解釋會有不同,所以渲染的效果也不相同。所有網頁瀏覽器、電子郵件客戶端以及其它需要編輯、顯示網絡內容的應用程序都需要內核。

JS引擎:解析和執行javascript來實現網頁的動態效果。

最開始渲染引擎和JS引擎並沒有區分的很明確,后來JS引擎越來越獨立,內核就傾向於只指渲染引擎。

4.**webSocket如何兼容低瀏覽器?

http://www.tuicool.com/articles/EF7Nni

http://blog.csdn.net/u011925826/article/details/17532465

 

5. 請簡述對前端框架bootstrap柵格系統的認識

Bootstrap內置了一套響應式、移動設備優先的流式柵格系統,隨着屏幕設備或視口(viewport)尺寸的增加,系統會自動分為最多12列。

我在這里是把Bootstrap中的柵格系統叫做布局。它就是通過一系列的行(row)與列(column)的組合創建頁面布局,然后你的內容就可以放入到你創建好的布局當中。下面就簡單介紹一下Bootstrap柵格系統的工作原理:

1.行(row)必須包含在.container中,以便為其賦予合適的排列(aligment)和內補(padding)。

2.使用行(row)在水平方向創建一組列(column)。

3.你的內容應當放置於列(column)內,而且,只有列(column)可以作為行(row)的直接子元素。

4.類似.row ; .col-xs-4 這些預定義的柵格class可以用來快速創建柵格布局。Bootstrap源碼中定義的mixin也可以用來創建語義化的布局。

5.通過設置padding從而創建列(column)之間的間隔(gutter)。然后通過為第一和最后一樣設置負值的margin從而抵消掉padding的影響。

6.柵格系統中的列是通過指定1到12的值來表示其跨越的范圍。例如,三個等寬的列可以使用三個.col-xs-4來創建。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM