本文總結了一些優質的前端面試題(多數源於網絡),初學者閱後也要用心鑽研其中的原理,重要知識須要系統學習,透徹學習,造成本身的知識鏈。萬不可投機取巧,只求面試過關是錯誤的!javascript
面試有幾點需注意:php
1.面試題目: 根據你的等級和職位變化,入門級到專家級:範圍↑、深度↑、方 向↑。css
2.題目類型: 技術視野、項目細節、理論知識題,算法題,開放性題,案例題。html
3.進行追問: 能夠確保問到你開始不懂或面試官開始不懂爲止,這樣能夠大大延 展題目的區分度和深度,知道你的實際能力。由於這種關聯知識是長時期的學 習,絕對不是臨時記得住的。前端
回答問題再棒,面試官(多是你的直接領導面試),會考慮我要不要這我的作個人同事?因此態度很重要。(感受更像是相親)html5
資深的工程師能把absolute和relative弄混,這樣的人不要也罷,由於團隊須要的你這我的具備能夠依靠的才能(靠譜)。java
HTML&CSS:jquery
對Web標準的理解、瀏覽器內核差別、兼容性、hack、CSS基本功:佈局、盒子模型、選擇器優先級及使用、HTML五、CSS三、移動端適應ios
JavaScript: css3
數據類型、面向對象、繼承、閉包、插件、做用域、跨域、原型鏈、模塊化、自定義事件、內存泄漏、事件機制、異步裝載回調、模板引擎、Nodejs、JSON、ajax等。
其餘:
HTTP、安全、正則、優化、重構、響應式、移動端、團隊協做、可維護、SEO、UED、架構、職業生涯
一、DOM結構 —— 兩個節點之間可能存在哪些關係以及如何在節點之間任意移動。
二、DOM操做 ——如何添加、移除、移動、複製、建立和查找節點等。
三、事件 —— 如何使用事件,以及IE和標準DOM事件模型之間存在的差異。
四、XMLHttpRequest —— 這是什麼、怎樣完整地執行一次GET請求、怎樣檢測錯誤。
五、嚴格模式與混雜模式 —— 如何觸發這兩種模式,區分它們有何意義。
六、盒模型 —— 外邊距、內邊距和邊框之間的關係,及IE8如下版本的瀏覽器中的盒模型
七、塊級元素與行內元素 —— 怎麼用CSS控制它們、以及如何合理的使用它們
八、浮動元素——怎麼使用它們、它們有什麼問題以及怎麼解決這些問題。
九、HTML與XHTML——兩者有什麼區別,你以爲應該使用哪個並說出理由。
十、JSON —— 做用、用途、設計結構。
………………
元素選擇器、類選擇器、 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-layout、vertical-align、page-break-after、page-bread-before。
全部元素可繼承:visibility和cursor。
內聯元素可繼承:letter-spacing、word-spacing、white-space、line-height、color、font、font-family、font-size、font-style、font-variant、font-weight、text-decoration、text-transform、direction。
終端塊狀元素可繼承:text-indent和text-align。
列表元素可繼承:list-style、list-style-type、list-style-position、list-style-image。
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)規定了標記語言的規則,這樣瀏覽器才能正確地呈現內容。**).
(1)添加在HTML頁面的元元素<meta>,<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">;
( 2 )將CSS中的固定值修改成相對值;
( 3 )柵格系統(流式網格佈局);
( 4 )CSS3的媒體查詢;
內聯樣式:style=」屬性:屬性值;」
內部樣式:<style>選擇器{屬性:值;}</style>
外部樣式:<link href="css/style.css" rel="stylesheet" type="text/css">
絕對定位和浮動的元素居中:知道定位元素自己的寬高的話,例:寬高是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;
}
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>
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;}能夠說是公式版的東西,能實現效果和兼容性俱佳的對齊效果。
http://www.cnblogs.com/bokin/archive/2012/12/14/2816864.html
-由於瀏覽器的兼容問題,不一樣瀏覽器對有些標籤的默認值是不一樣的,若是沒對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/
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文檔
ID選擇器>類選擇器>標籤選擇器
:before,:after是僞元素選擇器,定義到元素內容以前,以後要配合content: 「 」;一塊兒使用.
解決問題:一、撐起包含浮動元素的父元素的高度
(1)、指定元素高度
(2)、overflow:hidden;
(3)、追加空子元素,clear:both
(4)、div:after{
content:"";
display:block;
clear:both;
}
二、上外邊距溢出問題:
#d2:before{
content:"";
display:table;
}
行內元素:<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>
(1)<!DOCTYPE>聲明位於位於HTML文檔中的第一行,處於 <html> 標籤以前。告知瀏覽器的解析器用什麼文檔標準解析這個文檔。DOCTYPE不存在或格式不正確會致使文檔以混雜(兼容)模式呈現。
(2)嚴格(標準)模式的排版 和JS運做模式都是以該瀏覽器支持的最高標準運行。在混雜(兼容)模式中,頁面以寬鬆的向後兼容的方式顯示,模擬老式瀏覽器的行爲以防止站點沒法工做。
(1)link屬於XHTML標籤,除了加載CSS外,還能用於定義RSS, 定義rel鏈接屬性等做用;而@import是CSS提供的,只能用於加載CSS;
(2)頁面被加載的時,link會同時被加載,而@import引用的CSS會等到頁面被加載完再加載;
(3)import是CSS2.1 提出的,只在IE5以上才能被識別,而link是XHTML標籤,無兼容問題;
(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聲明\新增的結構元素\功能元素
1.用正確的標籤作正確的事情。
2.html語義化讓頁面的內容結構化,結構更清晰,便於對瀏覽器、搜索引擎解析;
3.即便在沒有樣式CSS狀況下也以一種文檔格式顯示,而且是容易閱讀的;
4.搜索引擎的爬蟲也依賴於HTML標記來肯定上下文和各個關鍵字的權重,利於SEO;
5.使閱讀源代碼的人對網站更容易將網站分塊,便於閱讀維護理解。
http://www.javashuo.com/article/p-odwabtmi-ka.html
在用戶沒有與因特網鏈接時,能夠正常訪問站點或應用,在用戶與因特網鏈接時,更新用戶機器上的緩存文件。
原理:HTML5的離線存儲是基於一個新建的.appcache文件的緩存機制(不是存儲技術),經過這個文件上的解析清單離線存儲資源,這些資源就會像cookie同樣被存儲了下來。以後當網絡在處於離線狀態下時,瀏覽器會經過被離線存儲的數據進行頁面展現。
使用:
如何使用:
一、頁面頭部像下面同樣加入一個manifest的屬性;
二、在cache.manifest文件的編寫離線存儲的資源;
CACHE MANIFEST
#v0.11
CACHE:
js/app.js
css/style.css
NETWORK:
resourse/logo.png
FALLBACK:
/ /offline.html
三、在離線狀態時,操做window.applicationCache進行需求實現。
http://www.javashuo.com/article/p-odwabtmi-ka.html
在線的狀況下,瀏覽器發現html頭部有manifest屬性,它會請求manifest文件,若是是第一次訪問app,那麼瀏覽器就會根據manifest文件的內容下載相應的資源而且進行離線存儲。若是已經訪問過app而且資源已經離線存儲了,那麼瀏覽器就會使用離線的資源加載頁面,而後瀏覽器會對比新的manifest文件與舊的manifest文件,若是文件沒有發生改變,就不作任何操做,若是文件改變了,那麼就會從新下載文件中的資源並進行離線存儲。
離線的狀況下,瀏覽器就直接使用離線存儲的資源。
(1)iframe會阻塞主頁面的Onload事件;
(2)搜索引擎的檢索程序沒法解讀這種頁面,不利於SEO;
(3)iframe和主頁面共享鏈接池,而瀏覽器對相同域的鏈接有限制,因此會影響頁面的並行加載。
若是須要使用iframe,最好是經過javascript動態給iframe添加src屬性值。
label標籤來定義表單控制間的關係,當用戶選擇該標籤時,瀏覽器會自動將焦點轉到和標籤相關的表單控件上。
(1)
<label for="Name">Number:</label>
<input type=
「
text
「
name="userName" id="Name"/>
(2)
<label>Date:<input type="text" name="B"/></label>
給不想要提示的 form 或某個 input 設置爲 autocomplete=」off 」。
(自動完成容許瀏覽器預測對字段的輸入。當用戶在字段開始鍵入時,瀏覽器基於以前鍵入過的值,應該顯示出在字段中填寫的選項。)
(1)有兩種, IE 盒子模型、W3C 盒子模型;
(2)盒模型: 內容(content)、填充(padding)、邊界(margin)、 邊框(border);
(3)區 別: IE的content部分把 border 和 padding計算了進去;
|
語法 |
做用 |
目標僞類 |
: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) |
block 塊類型。默認寬度爲父元素寬度,可設置寬高,換行顯示。
none 缺省值。象行內元素類型同樣顯示。
inline 行內元素類型。默認寬度爲內容寬度,不可設置寬高,同行顯示。
inline-block 默認寬度爲內容寬度,能夠設置寬高,同行顯示。
list-item 象塊類型元素同樣顯示,並添加樣式列表標記。
table 此元素會做爲塊級表格來顯示。
inherit 規定應該從父元素繼承 display 屬性的值。
absolute:生成絕對定位的元素,相對於值不爲 static的第一個父元素進行定位。
fixed :(老IE不支持)生成絕對定位的元素,相對於瀏覽器窗口進行定位。
relative:生成相對定位的元素,相對於其正常位置進行定位。
static:默認值。沒有定位,元素出如今正常的流中(忽略 top, bottom, left, right z-index 聲明)。
inherit:規定從父元素繼承 position 屬性的值。
新增各類CSS選擇器 (: not(.input):全部 class 不是「input」的節點)
圓角 (border-radius:8px)
多列布局 (multi-column layout)
陰影和反射 (Shadow\Reflect)
文字特效 (text-shadow、)
文字渲染 (Text-decoration)
線性漸變 (gradient)
旋轉 (transform)
增長了旋轉,縮放,定位,傾斜,動畫,多背景
http://www.javashuo.com/article/p-hptrgtcn-cv.html
box-flex是css3新添加的盒子模型屬性,它的出現打破了咱們常用的浮動佈局,實現垂直等高、水平均分、按比例劃分。可是它有必定的侷限性,在firefox、chrome這瀏覽器下須要使用它們的私有屬性來定義:firefox(-moz)、chrome(-webkit)。
http://www.webhek.com/visibility-collapse
visibility有第三種值,visibility,hidden,collapse。當一個元素的visibility屬性被設置成collapse值後,對於通常的元素,它的表現跟hidden是同樣的。但例外的是,若是這個元素是table相關的元素,例如table行,table group,table列,table column group,它的表現卻跟display: none同樣,也就是說,它們佔用的空間也會釋放。可是各類瀏覽器對collapse值的處理方式不同。
css預處理器也叫動態樣式語言,擁有編程的變量、繼承、運算、函數的特性,它可讓你的CSS更加簡潔、適應性更強、可讀性更佳,更易於代碼的維護等諸多好處,經常使用的有less、sass、stylus。
SASS 和 Compass 指南:http://ruby-china.org/topics/4396
http://www.zhihu.com/question/19886806
一、提升代碼性能
一、儘可能將樣式寫在單獨的css文件裏面,在head元素中引用
二、不使用@import
三、避免使用複雜的選擇器,層級越少越好
四、精簡頁面的樣式文件,去掉不用的樣式
五、利用CSS繼承減小代碼量
四、提升代碼的可維護性
一、命名與備註
二、提取重複樣式
三、統一書寫順序
https://segmentfault.com/q/1010000000713509
瀏覽器先產生一個元素集合,這個集合每每由最後一個部分的索引產生(若是沒有索引就是全部元素的集合)。而後向上匹配,若是不符合上一個部分,就把元素從集合中刪除,直到真個選擇器都匹配完,還在集合中的元素就匹配這個選擇器了。(從右往左)
共用模塊的樣式都抽離出來,做爲單獨的模塊來處理。
height屬性取值百分比,是現對於容器高度的;
對於margin-top、margin-bottom、padding-top、padding-bottom這些豎直方向的內外邊距屬性的百分比取值,參考的實際上是容器的寬度而不是高低。
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的字體尺寸。
canvas:在網頁中實現繪圖,主要繪製各類統計圖表,柱狀圖、餅圖、曲線圖、分佈圖;以及製做遊戲和動畫。
SVG:全稱爲 Scalable Vector Graphics,譯爲可縮放矢量圖形,簡稱矢量圖。是一種用來描述二維矢量圖形的 XML 標記語言。
SVG |
Canvas |
不依賴於分辨率 |
依賴於分辨率 |
使用DOM及事件處理器(DOM專門爲SVG開放接口) |
不能使用DOM及事件處理器 |
不能實現遊戲開發 |
能夠實現遊戲開發 |
實現大型渲染區域的應用(例如百度地圖) |
是以圖片(png |
HTML是一種基本的WEB網頁設計語言,XHTML是一個基於XML的置標語言
最主要的不一樣:XHTML的語法較爲嚴謹,
1.元素必須被正確地嵌套。
2.元素必須被關閉。
3.標籤名必須用小寫字母。
4.XHTML 文檔必須擁有根元素。
還有就是XHTML可兼容各大瀏覽器、手機以及PDA,而且瀏覽器也能快速正確地編譯網頁。
網頁的結構層(structural layer)由 HTML 或 XHTML 之類的標記語言負責建立。搭建文檔的結構。
網頁的表示層(presentation layer) 由 CSS 負責建立。 設置文檔的呈現效果。
網頁的行爲層(behavior layer)Javascript 語言和 DOM 負責建立。去實現文檔的行爲。
使用帶clear屬性的空元素;
使用CSS的overflow屬性;
使用CSS的:after僞元素;
使用鄰接元素處理;
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元素
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";
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的逆操做。
http://blog.jobbole.com/67347/
this是js的一個關鍵字,隨着函數使用場合不一樣,this的值會發生變化。
可是有一個總原則,那就是this指的是調用函數的那個對象。
this通常狀況下:是全局對象Global。 做爲方法調用,那麼this就是指這個對象
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
JSON:JavaScript 對象表示法(JavaScript Object Notation)。
https://segmentfault.com/a/1190000000668072
JSON有兩種結構
json簡單說就是javascript中的對象和數組,因此這兩種結構就是對象和數組兩種結構,經過這兩種結構能夠表示各類複雜的結構
一、對象:對象在js中表示爲「{}」括起來的內容,數據結構爲 {key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key爲對象的屬性,value爲對應的屬性值,因此很容易理解,取值方法爲對象.key 獲取屬性值,這個屬性值的類型能夠是數字、字符串、數組、對象幾種。
二、數組:數組在js中是中括號「[]」括起來的內容,數據結構爲 ["java","javascript","vb",...],取值方式和全部語言中同樣,使用索引獲取,字段值的類型能夠是數字、字符串、數組、對象幾種。
通過對象、數組2種結構就能夠組合成複雜的數據結構了。
JavaScript中有5種簡單數據類型(也稱爲基本數據類型):Undefined、Null、Boolean、Number和String。還有1種複雜數據類型——Object,Object本質上是由一組無序的名值對組成的。
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);
}
}
基於jQuery的Ajax:
<script type="text/javascript" src="jquery.js">
<script type="text/javascript">
$(document).ready(function() {
$.ajax({
type: 'GET',
url:'test.js',
async:true, //async爲true的時候是異步的
dataType,'script'}) //dataType爲script的時候已經幫你把返回結果用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.六、Opera 10.五、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):簡單來講,就是在瀏覽器滾動到某個位置在觸發相關的函數,實現頁面元素的加載或者某些動做的執行。如何實現瀏覽器滾動位置的檢測呢?能夠經過一個定時器來實現,經過比較某一時刻頁面目標節點位置和瀏覽器滾動條高度來判斷是否須要執行函數。
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 );
}
});
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以後才返回數據,而是有新數據時就主動推送給瀏覽器。
(1)GET請求提交的數據在地址欄能看到,POST看不到,get安全性很是低,post安全性較高。
(2)GET請求把請求數據追加在請求URI後面,以?開頭;POST請求把請求數據追加在請求主體中
(3)HTTP協議規定:請求消息起始行總長度不能超過1024字節;請求主體長度沒有限制。GET請求提交的數據或是漢字通常也就幾十個,不超過2kb。post傳送的數據量較大,通常被默認爲不受限制.
(4)語義不一樣:get是從服務器上獲取數據,post是向服務器傳送數據。
JS:document.getElementById(‘idName’);/document.getElementsByTagName(‘標籤名’);
jQuery:$.(‘#idName’);/$.(‘標籤名’);
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:有則刪除,無則添加
基本數據類型:null ,undefined ,number ,boolean ,string,symbol(ES6新增)
引用數據類型:object
http://es6.ruanyifeng.com/#docs/symbol
(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.
有這樣一個
URL
:
http://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}
現有數組對象
[{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"}}
}
閉包就是:外層函數將內層函數封裝受保護的局部變量返回到外部。實現可重用的局部變量,且保護其不受污染。
閉包的特性: 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
(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"];
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 的異常;
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:
當對象的初始化屬性值發生變化時觸發的事件
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;
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
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的一種簡化。
強制轉換:
Numble();Boolean();ParseInt();
隱式轉換:字符串
+
數字,
==
比較
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();
var a=10;
sayHi();
function sayHi(){
var a=a+10;
alert(a);
return a;
}
alert(a);
alert(sayHi()+10);
NaN,10,NaN,NaN;
Push()尾部添加 pop()尾部刪除
Unshift()頭部添加 shift()頭部刪除
http://www.cnblogs.com/fighting_cp/archive/2010/09/20/1831844.html
方法傳遞的參數不一樣:
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
利用事件冒泡的原理,讓本身的所觸發的事件,由他的父元素代替執行!
功能
:
中止事件冒泡
function stopBubble(e) {
//
若是提供了事件對象,則這是一個非
IE
瀏覽器
if ( e && e.stopPropagation ) {
//
所以它支持
W3C
的
stopPropagation()
方法
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;
}
http://www.jb51.net/w3school/js/js_reference.htm
http://www.cnblogs.com/yujon/p/5467576.html
Object
是
JavaScript
中全部對象的父對象
數據封裝類對象:
Object
、
Array
、
Boolean
、
Number
和
String
其餘對象:
Function
、
Arguments
、
Math
、
Date
、
RegExp
、
Error
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關鍵字明確限定做用域,從而避免做用域污染。
每一個對象都會在其內部初始化一個屬性,就是
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()}
function Animal(){
this.species = "
動物
";
}
function Cat(name,color){
this.name = name;
this.color = color;
}
一、構造繼承
function Cat(name,color){
Animal.apply(this, arguments);
this.name = name;
this.color = color;
}
var cat1 = new Cat("
大毛
","
黃色
");
alert(cat1.species); //
動物
二、原型繼承
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
var cat1 = new Cat("
大毛
","
黃色
");
alert(cat1.species); //
動物
三、利用空對象做爲中介
var F = function(){};
F.prototype = Animal.prototype;
Cat.prototype = new F();
Cat.prototype.constructor = Cat;
四、拷貝繼承
.....
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
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]
瀏覽器內核的解析和對比: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- |
|
(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和IE七、IE6分離開來,這樣IE8已經獨立識別。
css
.bb{
background-color:#f1ee18;/*
全部識別
*/
background-color:#00deff\9; /*IE6
、
7
、
8
識別
*/
+background-color:#a200ff;/*IE6
、
7
識別
*/
_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,你們在使用新技術前,能夠在這兩個網站上看看瀏覽器的支持狀況
主要分紅兩部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎。
渲染引擎:負責取得網頁的內容(HTML、XML、圖像等等)、整理訊息(例如加入CSS等),以及計算網頁的顯示方式,而後會輸出至顯示器或打印機。瀏覽器的內核的不一樣對於網頁的語法解釋會有不一樣,因此渲染的效果也不相同。全部網頁瀏覽器、電子郵件客戶端以及其它須要編輯、顯示網絡內容的應用程序都須要內核。
JS引擎:解析和執行javascript來實現網頁的動態效果。
最開始渲染引擎和JS引擎並無區分的很明確,後來JS引擎愈來愈獨立,內核就傾向於只指渲染引擎。
http://www.tuicool.com/articles/EF7Nni
http://blog.csdn.net/u011925826/article/details/17532465
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來建立。