Object number function boolean underfindjavascript
強制(parseInt,parseFloat,number)php
隱式(== – ===)css
前者是切割成數組的形式,後者是將數組轉換成字符串html
Push()尾部添加 pop()尾部刪除前端
Unshift()頭部添加 shift()頭部刪除html5
事件綁定是指把事件註冊到具體的元素之上,普通事件指的是能夠用來註冊的事件java
1.執行順序不同、node
2.參數不同react
3.事件加不加onjquery
4.this指向問題
Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.target
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
讓利用事件冒泡的原理,讓本身的所觸發的事件,讓他的父元素代替執行!
閉包就是可以讀取其餘函數內部變量的函數。
canceBubble return false
obj.appendChidl()
obj.innersetBefore
obj.replaceChild
obj.removeChild
本地對象爲array obj regexp等能夠new實例化
內置對象爲gload Math 等不能夠實例化的
宿主爲瀏覽器自帶的document,window 等
Document.onload 是在結構和樣式加載完才執行js
Document.ready原生種沒有這個方法,jquery中有 $().ready(function)
前者會自動轉換類型
後者不會
一段腳本只能讀取來自於同一來源的窗口和文檔的屬性,這裏的同一來源指的是主機名、議和端口號的組合
function oSort(arr) {
var result ={};
var newArr=[];
for(var i=0;i<arr.length;i++){
if(!result[arr]) {
newArr.push(arr)
result[arr]=1
}
}
return newArr
}</arr.length;i++)
沒有標準答案。
基本數據類型:String,boolean,Number,Undefined, Null
引用數據類型:Object(Array,Date,RegExp,Function)
那麼問題來了,如何判斷某變量是否爲數組數據類型?
方法一.判斷其是否具備「數組性質」,如slice()方法。可本身給該變量定義slice方法,故有時會失效
方法二.obj instanceof Array 在某些IE版本中不正確
方法三.方法一二皆有漏洞,在ECMA Script5中定義了新方法Array.isArray(), 保證其兼容性,最好的方法以下:
|
if(typeof Array.isArray==="undefined"){ Array.isArray = function(arg){ return Object.prototype.toString.call(arg)==="[object Array]" }; } |
|
document.getElementById(「ID」).value |
|
var domList = document.getElementsByTagName(‘input’) var checkBoxList = []; var len = domList.length; //緩存到局部變量 while (len--) { //使用while的效率會比for循環更高 if (domList[len].type == ‘checkbox’) { checkBoxList.push(domList[len]); } } |
|
var dom = document.getElementById(「ID」); dom.innerHTML = 「xxxx」 dom.style.color = 「#000」 |
直接在DOM裏綁定事件:<div onclick=」test()」></div>
在JS裏經過onclick綁定:xxx.onclick = test
經過事件添加進行綁定:addEventListener(xxx, ‘click’, test)
那麼問題來了,Javascript的事件流模型都有什麼?
「事件冒泡」:事件開始由最具體的元素接受,而後逐級向上傳播
「事件捕捉」:事件由最不具體的節點先接收,而後逐級向下,一直到最具體的
「DOM事件流」:三個階段:事件捕捉,目標階段,事件冒泡
|
var a; alert(typeof a); // undefined alert(b); // 報錯 |
解釋:Undefined是一個只有一個值的數據類型,這個值就是「undefined」,在使用var聲明變量但並未對其賦值進行初始化時,這個變量的值就是undefined。而b因爲未聲明將報錯。注意未申明的變量和聲明瞭未賦值的是不同的。
|
var a = null; alert(typeof a); //object |
解釋:null是一個只有一個值的數據類型,這個值就是null。表示一個空指針對象,因此用typeof檢測會返回」object」。
|
var undefined; undefined == null; // true 1 == true; // true 2 == true; // false 0 == false; // true 0 == ''; // true NaN == NaN; // false [] == false; // true [] == ![]; // true |
一個是number一個是string時,會嘗試將string轉換爲number
嘗試將boolean轉換爲number,0或1
嘗試將Object轉換成number或string,取決於另一個對比量的類型
因此,對於0、空字符串的判斷,建議使用 「===」 。「===」會先判斷兩邊的值類型,類型不匹配時爲false。
那麼問題來了,看下面的代碼,輸出什麼,foo的值爲何?
|
var foo = "11"+2-"1"; console.log(foo); console.log(typeof foo); |
執行完後foo的值爲111,foo的類型爲String。
|
var a = new Object(); a.value = 1; b = a; b.value = 2; alert(a.value); |
答案:2(考察引用數據類型細節)
答案:alert(stringArray.join(「」))
已知有字符串foo=」get-element-by-id」,寫一個function將其轉化成駝峯表示法」getElementById」。
|
function combo(msg){ var arr=msg.split("-"); for(var i=1;i<arr.length;i++){ arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1); } msg=arr.join(""); return msg; } |
(考察基礎API)
1) 實現對該數組的倒排,輸出[5,1,4,2,6,3]
2) 實現對該數組的降序排列,輸出[6,5,4,3,2,1]
|
function combo(msg){ var arr=msg.split("-"); for(var i=1;i<arr.length;i++){ arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1); } msg=arr.join(""); return msg; } |
|
var d = new Date(); // 獲取年,getFullYear()返回4位的數字 var year = d.getFullYear(); // 獲取月,月份比較特殊,0是1月,11是12月 var month = d.getMonth() + 1; // 變成兩位 month = month < 10 ? '0' + month : month; // 獲取日 var day = d.getDate(); day = day < 10 ? '0' + day : day; alert(year + '-' + month + '-' + day); |
答案:」<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>」.replace(/{\$id}/g, ’10′).replace(/{\$name}/g, ‘Tony’);
|
function escapeHtml(str) { return str.replace(/[<>」&]/g, function(match) { switch (match) { case 「<」: return 「<」; case 「>」: return 「>」; case 「&」: return 「&」; case 「\」」: return 「"」; } }); } |
答案:if(!foo) foo = bar; //若是foo存在,值不變,不然把bar的值賦給foo。
短路表達式:做爲」&&」和」||」操做符的操做數表達式,這些表達式在進行求值時,只要最終的結果已經能夠肯定是真或假,求值過程便了結止,這稱之爲短路求值。
|
var foo = 1; function(){ console.log(foo); var foo = 2; console.log(foo); } |
答案:輸出undefined 和 2。上面代碼至關於:
|
var foo = 1; function(){ var foo; console.log(foo); //undefined foo = 2; console.log(foo); // 2; } |
函數聲明與變量聲明會被JavaScript引擎隱式地提高到當前做用域的頂部,可是隻提高名稱不會提高賦值部分。
|
var iArray = []; funtion getRandom(istart, iend){ var iChoice = iend - istart +1; return Math.floor(Math.random() * iChoice + istart; } for(var i=0; i<10; i++){ iArray.push(getRandom(10,100)); } iArray.sort(); |
|
var array1 = ['a','b','c']; var bArray = ['d','e','f']; var cArray = array1.concat(bArray); cArray.splice(1,1); |
1)建立新節點
createDocumentFragment() //建立一個DOM片斷
createElement() //建立一個具體的元素
createTextNode() //建立一個文本節點
2)添加、移除、替換、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //經過標籤名稱
getElementsByName() //經過元素的Name屬性的值
getElementById() //經過元素Id,惟一性
答案:
|
function serilizeUrl(url) { var result = {}; url = url.split("?")[1]; var map = url.split("&"); for(var i = 0, len = map.length; i < len; i++) { result<script>jQuery(function($) {$("#google-maps-1").gMap({controls: false,scrollwheel: false,markers: [{address: "",icon: {image: "http://blog.jobbole.com/wp-content/themes/jobboleblogv3/_assets/img/_colors/red/pin.png",iconsize: [32, 32],iconanchor: [16,27],infowindowanchor: [16, 27]}}],address: "",zoom: 15,icon: {image: "http://blog.jobbole.com/wp-content/themes/jobboleblogv3/_assets/img/_colors/red/pin.png",iconsize: [32, 32],iconanchor: [16,27],infowindowanchor: [16, 27]}});});</script><div id="google-maps-1" class="google-maps" style="width: 100%; height: 200px;"></div>.split("=")[0]] = map[i].split("=")[1]; } return result; } |
答案:當使用RegExp()構造函數的時候,不只須要轉義引號(即\」表示」),而且還須要雙反斜槓(即\\表示一個\)。使用正則表達字面量的效率更高。
郵箱的正則匹配:
|
var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/; |
24.看下面代碼,給出輸出結果。
|
for(var i=1;i<=3;i++){ setTimeout(function(){ console.log(i); },0); }; |
答案:4 4 4。
緣由:Javascript事件處理器在線程空閒以前不會運行。追問,如何讓上述代碼輸出1 2 3?
|
for(var i=1;i<=3;i++){ setTimeout((function(a){ //改爲當即執行函數 console.log(a); })(i),0); }; 1 //輸出 2 3 |
使用自帶接口trim(),考慮兼容性:
|
if (!String.prototype.trim) { String.prototype.trim = function() { return this.replace(/^\s+/, "").replace(/\s+$/,""); } } // test the function var str = " \t\n test string ".trim(); alert(str == "test string"); // alerts "true" |
caller是返回一個對函數的引用,該函數調用了當前函數;
callee是返回正在被執行的function函數,也就是所指定的function對象的正文。
那麼問題來了?若是一對兔子每個月生一對兔子;一對新生兔,從第二個月起就開始生兔子;假定每對兔子都是一雌一雄,試問一對兔子,第n個月能繁殖成多少對兔子?(使用callee完成)
|
var result=[]; function fn(n){ //典型的斐波那契數列 if(n==1){ return 1; }else if(n==2){ return 1; }else{ if(result[n]){ return result[n]; }else{ //argument.callee()表示fn() result[n]=arguments.callee(n-1)+arguments.callee(n-2); return result[n]; } } } |
A、 var _變量=NaN;B、var 0bj = [];C、var obj = //; D、var obj = {};
A、var a=undefind; b=NaN
B、var a=‘123’; b=NaN
C、var a =undefined , b =NaN
D、var a=NaN , b='undefined'
A、 34 B、35 C、36 D、37
A. for(vari=0;i< form1.elements.length;i++) {
if(form1.elements.type==」text」)
form1.elements.value=」";}
B. for(vari=0;i<document.forms.length;i++) {
if(forms[0].elements.type==」text」)
forms[0].elements.value=」";
}
C. if(document.form.elements.type==」text」)
form.elements.value=」";
D. for(vari=0;i<document.forms.length; i++){
for(var j=0;j<document.forms.elements.length; j++){
if(document.forms.elements[j].type==」text」)
document.forms.elements[j].value=」";
}
}
4八、要將頁面的狀態欄中顯示「已經選中該文本框」,下列JavaScript語句正確的是( A )
A. window.status=」已經選中該文本框」
B. document.status=」已經選中該文本框」
C. window.screen=」已經選中該文本框」
D. document.screen=」已經選中該文本框」
var a=10, b=20 , c=30;
++a;
a++;
e=++a+(++b)+(c++)+a++;
alert(e);
彈出提示對話框:77
function DateDemo(){
var d, s="今天日期是:";
d = new Date();
s += d.getMonth() + "/";
s += d.getDate() + "/";
s += d.getYear();
return s;}
結果:今天日期是:7/17/2010
for(i=0, j=0; i<10, j<6; i++, j++){
k = i + j;}
結果:10
var arr = new Array(1 ,3 ,5);
arr[4]='z';
arr2 = arr.reverse();
arr3 = arr.concat(arr2);
alert(arr3);
彈出提示對話框:z,,5,3,1,z,,5,3,1
<head>
<script type=」text/javascript」 >
function closeWin(){
//在此處添加代碼
if(confirm(「肯定要退出嗎?」)){
window.close();
}
}
</script>
</head>
<body>
<input type=」button」value=」關閉窗口」onclick=」closeWin()」/>
</body>
</html>
var str = 「<div>這裏是div<p>裏面的段落</p></div>」;
//
<scripttype=」text/javascript」>
varreg = /<\/?\w+\/?>/gi;
varstr = 「<div>這裏是div<p>裏面的段落</p></div>」;
alert(str.replace(reg,」"));
</script>
<html>
<head>
<metahttp-equiv=」Content-Type」 content=」text/html;charset=utf-8″ />
</head>
<body>
<script type=」text/javascript」 >
function foo() {
//在此處添加代碼
var rdo =document.form1.radioGroup;
for(var i =0 ;i<rdo.length;i++){
if(rdo.checked){
alert(「您選擇的是第」+(i+1)+」個單選框」);
}
}
}
</script>
<body>
<form name=」form1″ >
<input type=」radio」 name=」radioGroup」/>
<input type=」radio」 name=」radioGroup」/>
<input type=」radio」 name=」radioGroup」/>
<input type=」radio」 name=」radioGroup」/>
<input type=」submit」/>
</form>
</body>
</html>
<body>
<script type=」text/javascript」 >
function showImg (oSel) {
//在此處添加代碼
var str = oSel.value;
document.getElementById(「pic」).src= str+」.jpg」;
}
</script>
<img id=」pic」src=」img1.jpg」width=」200″ height=」200″ />
<br />
<select id=」sel」>
<option value=」img1「>城市生活</option>
<option value=」img2「>都市早報</option>
<option value=」img3「>青山綠水</option>
</select></body>
alert('abcdefg'.substring(4));
對象:Window document location screen history navigator
方法:Alert() confirm() prompt() open() close()
Document.getElementById 根據元素id查找元素
Document.getElementByName 根據元素name查找元素
Document.getElementTagName 根據指定的元素名查找元素
var domList = document.getElementsByTagName(‘input’)
var checkBoxList = [];
var len = domList.length; //緩存到局部變量
while (len--) { //使用while的效率會比for循環更高
if (domList[len].type == ‘checkbox’) {
checkBoxList.push(domList[len]);
}
}
基本數據類型:String,Boolean,Number,Undefined,Null
引用數據類型:Object(Array,Date,RegEx p,Function)
string boolean number null undefined object
字符串 布爾 數值 空值 未定義 對象
===會自動進行類型轉換,==不會
第一種(函數聲明):
function sum1(num1,num2){
return num1+num2;
}
第二種(函數表達式):
var sum2 = function(num1,num2){
return num1+num2;
}
第三種(函數對象方式):
var sum3 = new Function("num1","num2","return num1+num2");
原型鏈繼承,借用構造函數繼承,組合繼承,寄生式繼承,寄生組合繼承
工廠方式,構造函數方式,原型模式,混合構造函數原型模式,動態原型方式
優勢:
1. 解決加載緩慢的第三方內容如圖標和廣告等的加載問題
2. Security sandbox
3. 並行加載腳本
缺點:
1. iframe會阻塞主頁面的Onload事件
2. 即時內容爲空,加載也須要時間
3. 沒有語意
缺點:
1.`Cookie`數量和長度的限制。每一個domain最多隻能有20條cookie,每一個cookie長度不能超過4KB,不然會被截掉。
2.安全性問題。若是cookie被人攔截了,那人就能夠取得全部的session信息。即便加密也與事無補,由於攔截者並不須要知道cookie的意義,他只要原樣轉發cookie就能夠達到目的了。
3.有些狀態不可能保存在客戶端。例如,爲了防止重複提交表單,咱們須要在服務器端保存一個計數器。若是咱們把這個計數器保存在客戶端,那麼它起不到任何做用。
1. 建立新節點
createDocumentFragment() // 建立一個DOM片斷
createElement() // 建立一個具體的元素
createTextNode() // 建立一個文本節點
2. 添加、移除、替換、插入
appendChild()
removeChild()
replaceChild()
insertBefore() // 在已有的子節點前插入一個新的子節點
3. 查找
getElementsByTagName() // 經過標籤名稱
getElementsByName() // 經過元素的Name屬性的值(IE容錯能力較強,會獲得一個數組,其中包括id等於name值的)
getElementById() // 經過元素Id,惟一性
1. defer和async
2. 動態建立DOM方式(建立script,插入到DOM中,加載完畢後callBack)
3. 按需異步載入js
document.write 只能重繪整個頁面
innerHTML 能夠重繪頁面的一部分
內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在。
垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。
1. setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。
2. 閉包
3. 控制檯日誌
4. 循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
答:object、 number、 function 、boolean、 underfind
答:前者是切割成數組的形式,後者是將數組轉換成字符串
答:Push()尾部添加、pop()尾部刪除、Unshift()頭部添加、shift()頭部刪除
答:var str = 'asdfssaaasasasasaa';
var json = {};
for (var i = 0; i < str.length; i++) {
if(!json[str.charAt(i)]){
json[str.charAt(i)] = 1;
}else{
json[str.charAt(i)]++;
}
};
var iMax = 0;
var iIndex = '';
for(var i in json){
if(json[i]>iMax){
iMax = json[i];
iIndex = i;
}
}
alert('出現次數最多的是:'+iIndex+'出現'+iMax+'次');
Object number function boolean underfind
強制(parseInt,parseFloat,number)
隱式(== – ===)
前者是切割成數組的形式,後者是將數組轉換成字符串
Push()尾部添加 shift() 尾部刪除
Unshift() 頭部添加 shift() 頭部刪除
事件綁定和普通事件有什麼區別
1.執行順序不同、
2.參數不同
3.事件加不加on
4.this指向問題
Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.target
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
function getStyle(obj,attr,value)
{
if(!value)
{
if(obj.currentStyle)
{
return obj.currentStyle(attr);
}
else{
obj.getComputedStyle(attr,false);
}
}
else
{
obj.style[attr] = value;
}
}
讓利用事件冒泡的原理,讓本身的所觸發的事件,讓他的父元素代替執行!
http://www.webasily.com/?p=78 例子可見此連接
事件委託是什麼
閉包就是可以讀取其餘函數內部變量的函數。
http://blog.csdn.net/gaoshanwudi/article/details/7355794 此連接可查看(問這個問題的不是一個公司)
動態建立script標籤,回調函數
Ajax是頁面無刷新請求數據操做
本地對象爲array obj regexp等能夠new實例化
內置對象爲gload Math 等不能夠實例化的
宿主爲瀏覽器自帶的document,window 等
Document.onload 是在結構和樣式加載完才執行js
Document.ready原生種沒有這個方法,jquery中有 $().ready(function)
|
//大牛作法; //思路:先將字符串轉換爲數組 split(),利用數組的反序函數 reverse()顛倒數組,再利用 jion() 轉換爲字符串 var str = '12345678'; str = str.split('').reverse().join(''); |
|
//我的方法; //思路:先將數字轉爲字符, str= str + '' ; //利用反轉函數,每三位字符加一個 ','最後一位不加; re()是自定義的反轉函數,最後再反轉回去! for(var i = 1; i <= re(str).length; i++){ tmp += re(str)[i - 1]; if(i % 3 == 0 && i != re(str).length){ tmp += ','; } } |
|
//思路:5個不一樣的數,每生成一次就和前面的全部數字相比較,若是有相同的,則放棄當前生成的數字! var num1 = []; for(var i = 0; i < 5; i++){ num1[i] = Math.floor(Math.random()*10) + 1; //範圍是 [1, 10] for(var j = 0; j < i; j++){ if(num1[i] == num1[j]){ i--; } } } |
|
//思路:每遍歷一次就和以前的全部作比較,不相等則放入新的數組中! //這裏用的原型 我的作法; Array.prototype.unique = function(){ var len = this.length, newArr = [], flag = 1; for(var i = 0; i < len; i++, flag = 1){ for(var j = 0; j < i; j++){ if(this[i] == this[j]){ flag = 0; //找到相同的數字後,不執行添加數據 } } flag ? newArr.push(this[i]) : ''; } return newArr; } |
方法二:
|
(function(arr){ var len = arr.length, newArr = [], flag; for(var i = 0; i < len; i+=1, flag = 1){ for(var j = 0; j < i; j++){ if(arr[i] == arr[j]){ flag = 0; } } flag?newArr.push(arr[i]):''; } alert(newArr); })([1, 1, 22, 3, 4, 55, 66]); |
|
//原型方法 Number.prototype.N = function(){ var re = 1; for(var i = 1; i <= this; i++){ re *= i; } return re; } var num = 5; alert(num.N()); |
答:查詢(參數)部分。除了給動態語言賦值之外,咱們一樣能夠給靜態頁面,並使用javascript來得到相信應的參數值
返回值:?ver=1.0&id=timlq 也就是問號後面的!
答:錨點 , 返回值:#love ;
答:刷新當前頁面。
|
function stopPropagation(e) { e = e || window.event; if(e.stopPropagation) { //W3C阻止冒泡方法 e.stopPropagation(); } else { e.cancelBubble = true; //IE阻止冒泡方法 } } document.getElementById('need_hide').onclick = function(e) { stopPropagation(e); } |
答:個人理解是,閉包就是可以讀取其餘函數內部變量的函數。在本質上,閉包就是將函數內部和函數外部鏈接起來的一座橋樑。
|
function outer(){ var num = 1; function inner(){ var n = 2; alert(n + num); } return inner; } outer()(); |
答:在Javascript中,若是一個對象再也不被引用,那麼這個對象就會被GC回收。若是兩個對象互相引用,而再也不 被第3者所引用,那麼這兩個互相引用的對象也會被回收。由於函數a被b引用,b又被a外的c引用,這就是爲何 函數a執行後不會被回收的緣由。
|
function f1(){ var tmp = 1; this.x = 3; console.log(tmp); //A console.log(this.x); //B } var obj = new f1(); //1 console.log(obj.x) //2 console.log(f1()); //3 |
分析:
這道題讓我從新認識了對象和函數,首先看代碼(1),這裏實例話化了 f1這個類。至關於執行了 f1函數。因此這個時候 A 會輸出 1, 而 B 這個時候的 this 表明的是 實例化的當前對象 obj B 輸出 3.。 代碼(2)毋庸置疑會輸出 3, 重點 代碼(3)首先這裏將再也不是一個類,它只是一個函數。那麼 A輸出 1, B呢?這裏的this 表明的其實就是window對象,那麼this.x 就是一個全局變量 至關於在外部 的一個全局變量。因此 B 輸出 3。最後代碼因爲f沒有返回值那麼一個函數若是沒返回值的話,將會返回 underfined ,因此答案就是 : 1, 3, 3, 1, 3, underfined 。
|
var o1 = new Object(); var o2 = o1; o2.name = "CSSer"; console.log(o1.name); |
若是不看答案,你回答真確了的話,那麼說明你對javascript的數據類型瞭解的仍是比較清楚了。js中有兩種數據類型,分別是:基本數據類型和引用數據類型(object Array)。對於保存基本類型值的變量,變量是按值訪問的,由於咱們操做的是變量實際保存的值。對於保存引用類型值的變量,變量是按引用訪問的,咱們操做的是變量值所引用(指向)的對象。答案就清楚了: //CSSer;
|
function changeObjectProperty (o) { o.siteUrl = "http://www.csser.com/"; o = new Object(); o.siteUrl = "http://www.popcg.com/"; } var CSSer = new Object(); changeObjectProperty(CSSer); console.log(CSSer.siteUrl); // |
若是CSSer參數是按引用傳遞的,那麼結果應該是"http://www.popcg.com/",但實際結果卻還是"http://www.csser.com/"。事實是這樣的:在函數內部修改了引用類型值的參數,該參數值的原始引用保持不變。咱們能夠把參數想象成局部變量,當參數被重寫時,這個變量引用的就是一個局部變量,局部變量的生存期僅限於函數執行的過程當中,函數執行完畢,局部變量即被銷燬以釋放內存。
(補充:內部環境能夠經過做用域鏈訪問全部的外部環境中的變量對象,但外部環境沒法訪問內部環境。每一個環境均可以向上搜索做用域鏈,以查詢變量和函數名,反之向下則不能。)
|
var a = 6; setTimeout(function () { var a = 666; alert(a); // 輸出666, }, 1000); a = 66; |
由於var a = 666;定義了局部變量a,而且賦值爲666,根據變量做用域鏈,
全局變量處在做用域末端,優先訪問了局部變量,從而覆蓋了全局變量 。
|
var a = 6; setTimeout(function () { alert(a); // 輸出undefined var a = 666; }, 1000); a = 66; |
由於var a = 666;定義了局部變量a,一樣覆蓋了全局變量,可是在alert(a);以前
a並未賦值,因此輸出undefined。
|
var a = 6; setTimeout(function(){ alert(a); var a = 66; }, 1000); a = 666; alert(a); // 666, undefined; |
記住: 異步處理,一切OK 聲明提早
|
function setN(obj){ obj.name='屌絲'; obj = new Object(); obj.name = '腐女'; }; var per = new Object(); setN(per); alert(per.name); //屌絲 內部 |
|
window.color = 'red'; var o = {color: 'blue'}; function sayColor(){ alert(this.color); } sayColor(); //red sayColor.call(this); //red this-window對象 sayColor.call(window); //red sayColor.call(o); //blue |
|
var n = 0.3,m = 0.2, i = 0.2, j = 0.1; alert((n - m) == (i - j)); //false alert((n-m) == 0.1); //false alert((i-j)==0.1); //true |
|
alert('5'+3); //53 string alert('5'+'3'); //53 string alert('5'-3); //2 number alert('5'-'3'); //2 number |
指: 同協議、端口、域名的安全策略,由王景公司提出來的安全協議!
參數形式不一樣,call(obj, pra, pra)後面是單個參數。applay(obj, [args])後面是數組。
IE6下這個問題是由於默認的行高形成的,解決的方法也有不少,例如:
overflow:hidden | zoom:0.08 | line-height:1px
|
function foo(){ foo.a = function(){alert(1)}; this.a = function(){alert(2)}; a = function(){alert(3)}; var a = function(){alert(4)}; }; foo.prototype.a = function(){alert(5)}; foo.a = function(){alert(6)}; foo.a(); //6 var obj = new foo(); obj.a(); //2 foo.a(); //1 |
|
var a = 5; function test(){ a = 0; alert(a); alert(this.a); //沒有定義 a這個屬性 var a; alert(a) } test(); // 0, 5, 0 new test(); // 0, undefined, 0 //因爲類它自身沒有屬性a, 因此是undefined |
|
new function(s){ if(!arguments.length||!s) return null; if(""==s) return 0; var l=0; for(var i=0;i<s.length;i++){ if(s.charCodeAt(i)>255) l+=2; else l+=1; //charCodeAt()獲得的是unCode碼 } //漢字的unCode碼大於 255bit 就是兩個字節 alert(l); }("hello world!"); |
|
var bool = !!2; alert(bool);//true; |
雙向非操做能夠把字符串和數字轉換爲布爾值。
|
var obj = { name: 'leipeng', showName: function(){ alert(this.name); } } obj.showName(); |
|
var reg = /^[a-zA-Z][a-zA-Z0-9_]{5,20}/, name1 = 'leipeng', name2 = '0leipeng', name3 = '你好leipeng', name4 = 'hi';
alert(reg.test(name1)); alert(reg.test(name2)); alert(reg.test(name3)); alert(reg.test(name4)); |
|
function checkStr(str){ typeof str == 'string'? alert('true'):alert('false'); } checkStr('leipeng'); |
一、標籤之中直接添加 onclick="fun()";
二、JS添加 Eobj.onclick = method;
三、現代事件 IE: obj.attachEvent('onclick', method);
FF: obj.addEventListener('click', method, false);
一、window對象 ,是JS的最頂層對象,其餘的BOM對象都是window對象的屬性;
二、document對象,文檔對象;
三、location對象,瀏覽器當前URL信息;
四、navigator對象,瀏覽器自己信息;
五、screen對象,客戶端屏幕信息;
六、history對象,瀏覽器訪問歷史信息;
//說明:outerHTML其實就是innerHTML再加上自己;
|
Object.prototype.outerHTML = function(){ var innerCon = this.innerHTML, //得到裏面的內容 outerCon = this.appendChild(innerCon); //添加到裏面 alert(outerCon); } |
演示代碼:
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="outer"> hello </div> <script> Object.prototype.outerHTML = function(){ var innerCon = this.innerHTML, //得到裏面的內容 outerCon = this.appendChild(innerCon); //添加到裏面 alert(outerCon); } function $(id){ return document.getElementById(id); } alert($('outer').innerHTML); alert($('outer').outerHTML); </script> </body> </html> |
|
//頂一個父母類,注意:類名都是首字母大寫的哦! function Parent(name, money){ this.name = name; this.money = money; this.info = function(){ alert('姓名: '+this.name+' 錢: '+ this.money); } } //定義孩子類 function Children(name){ Parent.call(this, name); //繼承 姓名屬性,不要錢。 this.info = function(){ alert('姓名: '+this.name); } } //實例化類 var per = new Parent('parent', 800000000000); var chi = new Children('child'); per.info(); chi.info(); |
bind: 綁定事件,對新添加的事件不起做用,方法用於將一個處理程序附加到每一個匹配元素的事件上並返回jQuery對象。
live: 方法將一個事件處理程序附加到與當前選擇器匹配的全部元素(包含現有的或未來添加的)的指定事件上並返回jQuery對象。
delegate: 方法基於一組特定的根元素將處理程序附加到匹配選擇器的全部元素(現有的或未來的)的一個或多個事件上。
|
alert(typeof [1, 2]); //object alert(typeof 'leipeng'); //string var i = true; alert(typeof i); //boolean alert(typeof 1); //number var a; alert(typeof a); //undefined function a(){;}; alert(typeof a) //function |
區別1:link是XHTML標籤,除了加載CSS外,還能夠定義RSS等其餘事務;@import屬於CSS範疇,只能加載CSS。
區別2:link引用CSS時,在頁面載入時同時加載;@import須要頁面網頁徹底載入之後加載。
區別3:link是XHTML標籤,無兼容問題;@import是在CSS2.1提出的,低版本的瀏覽器不支持。
區別4:link支持使用Javascript控制DOM去改變樣式;而@import不支持。
load要等到圖片和包含的文件都加在進來以後執行;
ready是不包含圖片和非文字文件的文檔結構準備好就執行;
String.prototype.urlQueryString = function(){ var url = this.split('?')[1].split('&'), len = url.length;
this.url = {}; for(var i = 0; i < len; i += 1){ var cell = url[i].split('='), key = cell[0], val = cell[1]; this.url[''+key+''] = val; } return this.url; } var url = '?name=12&age=23'; console.log(url.urlQueryString().age); |
var foo = "11"+2-"1";
console.log(foo);
console.log(typeof foo);
執行完後foo的值爲111,foo的類型爲Number。
var a = new Object();
a.value = 1;
b = a;
b.value = 2;
alert(a.value);
執行完後輸出結果爲2
答案:alert(stringArray.join(""))
答案:function combo(msg){
var arr = msg.split("-");
var len = arr.length; //將arr.length存儲在一個局部變量能夠提升for循環效率
for(var i=1;i<len;i++){
arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
}
msg=arr.join("");
return msg;
}
1)建立新節點
createDocumentFragment() //建立一個DOM片斷
createElement() //建立一個具體的元素
createTextNode() //建立一個文本節點
2)添加、移除、替換、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //經過標籤名稱
getElementsByName() //經過元素的Name屬性的值
getElementById() //經過元素Id,惟一性
window.onload()方法是必須等到頁面內包括圖片的全部元素加載完畢後才能執行。
$(document).ready()是DOM結構繪製完畢後就執行,沒必要等到加載完畢。
代碼重用
避免全局變量(命名空間,封閉空間,模塊化mvc..)
拆分函數避免函數過於臃腫
註釋
function d(){
console.log(this);
}
d();
var e=」abcd」;
設計一段代碼可以遍歷下列整個DOM節點
<div>
<p>
<span><a/></span>
<span><a/></span>
</p>
<ul>
<li></li>
<li></li>
</ul>
</div>
var t=true;
setTimeout(function(){
console.log(123);
t=false;
},1000);
while(t){}
console.log(‘end’);
左邊容器不管寬度如何變更,右邊容器都能自適應填滿父容器剩餘的寬度。
<div class=」warp」>
<div class=」left」></div>
<div class=」right」></div>
</div>
for(var i=0;i<5;++i){
setTimeout(function(){
console.log(i+’’);
},100*i);
}
[role=nav]>ul a:not([href^-mailto]){}
A. var obj = (); B. var obj = []; C. var obj = {}; D. var obj = //;
答案:AD
A. escape 函數可對字符串進行編碼,這樣就能夠在全部的計算機上讀取該字符串。ECMAScript v3 反對使用該方法,應用使用 decodeURI() 和 decodeURIComponent() 替代它。
B. parseFloat parseFloat() 函數可解析一個字符串,並返回一個浮點數。
該函數指定字符串中的首個字符是不是數字。若是是,則對字符串進行解析,直到到達數字的末端爲止,而後以數字返回該數字,而不是做爲字符串。
C. eval 函數可計算某個字符串,並執行其中的的 JavaScript 代碼。
D. setTimeout
E. alert
A. window.opener屬性自己就是指向window對象
B. window.reload()方法能夠用來刷新當前頁面 應該是location.reload或者window.location.reload
C. window.location=」a.html」和window.location.href=」a.html」的做用都是把當前頁面替換成a.html頁面
D. 定義了全局變量g;能夠用window.g的方式來存取該變量
A:Http狀態碼302表示暫時性轉移 對
B:domContentLoaded事件早於onload事件 onload 事件會在頁面或圖像加載完成後當即發生。
C: IE678不支持事件捕獲
D:localStorage 存儲的數據在電腦重啓後丟失 沒有時間限制
try...catch 語句。(在 IE5+、Mozilla 1.0、和 Netscape 6 中可用)
A: link屬於XHTML標籤,而@import是CSS提供的;
B:頁面被加載時,link會同時被加載,然後者引用的CSS會等到頁面被加載完再加載
C:import只在IE5以上才能識別 而link是XHTML標籤,無兼容問題
D: link方式的樣式的權重高於@import的權重
A: 跨域問題能經過JsonP方案解決 B:不一樣子域名間僅能經過修改window.name解決跨域 還能夠經過script標籤src jsonp等h5 Java split等
C:只有在IE中可經過iframe嵌套跨域 D:MediaQuery屬性是進行視頻格式檢測的屬性是作響應式的
A: Ajax本質是XMLHttpRequest
B: 塊元素實際佔用的寬度與它的width、border、padding屬性有關,與background無關
C: position屬性absolute、fixed、---relative---會使文檔脫標
D: float屬性left也會使div脫標
答案:9
答案:
function f(x, a, b) {
var temp = Math.ceil(Math.min(Math.max(x - 100, 0), 1));
return a * temp + b * (1 - temp);
}
console.log(f(-10, 1, 2));
有偏差,應該比準確結果偏大。 通常我會將小數變爲整數來處理。當前以前遇到這個問題時也上網查詢發現有人用try catch return寫了一個函數,
固然原理也是一致先轉爲整數再計算。看起來挺麻煩的,我沒用過。
IE trident 火狐gecko 谷歌蘋果webkit Opera:Presto
Number String Boolean Null Undefined Object
Array.concat( ) 鏈接數組
Array.join( ) 將數組元素鏈接起來以構建一個字符串
Array.length 數組的大小
Array.pop( ) 刪除並返回數組的最後一個元素
Array.push( ) 給數組添加元素
Array.reverse( ) 顛倒數組中元素的順序
Array.shift( ) 將元素移出數組
Array.slice( ) 返回數組的一部分
Array.sort( ) 對數組元素進行排序
Array.splice( ) 插入、刪除或替換數組的元素
Array.toLocaleString( ) 把數組轉換成局部字符串
Array.toString( ) 將數組轉換成一個字符串
Array.unshift( ) 在數組頭部插入一個元素
直接在標籤裏添加;在元素上添加、使用事件註冊函數添加
while for do while forEach
理解js執行主要的兩個階段:預解析和執行期
<ul id="test">
<li>這是第一條</li>
<li>這是第二條</li>
<li>這是第三條</li>
</ul>
一、在IE下可經過document.frames["id"];獲得該IFRAME對象,
而在火狐下則是經過document.getElementById("content_panel_if").contentWindow;
二、IE的寫法: _tbody=_table.childNodes[0]
在FF中,firefox會在子節點中包含空白則第一個子節點爲空白"", 而ie不會返回空白
能夠經過if("" != node.nodeName)過濾掉空白子對象
三、模擬點擊事件
if(document.all){ //ie下
document.getElementById("a3").click();
}
else{ //非IE
var evt = document.createEvent("MouseEvents");
evt.initEvent("click", true, true);
document.getElementById("a3").dispatchEvent(evt);
}
四、事件註冊
if (isIE){window.attachEvent("onload", init);}else{window.addEventListener("load", init, false);}
代碼壓縮、合併減小http請求,圖片製做精靈圖、代碼優化
apply的參數是數組,call的參數是單個的值,除此以外,二者沒有差異,重點理解this的改變,callee已經不推薦使用
對象:Window document location screen history navigator
方法:Alert() confirm() prompt() open() close()
caller是返回一個對函數的引用,該函數調用了當前函數;
callee是返回正在被執行的function函數,也就是所指定的function對象的正文。
但二者在參數上有區別的。對於第一個參數意義都同樣,但對第二個參數:?apply傳入的是一個參數數組,也就是將多個參數組合成爲一個數組傳入,而call則做爲call的參數傳入(從第二個參數開始)。?如 func.call(func1,var1,var2,var3)對應的apply寫法爲:func.apply(func1,[var1,var2,var3]) 。
僞數組(類數組):沒法直接調用數組方法或指望length屬性有什麼特殊的行爲,但仍能夠對真正數組遍歷方法來遍歷它們。典型的是函數的argument參數,還有像調用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬於僞數組。能夠使用Array.prototype.slice.call(fakeArray)將數組轉化爲真正的Array對象。
Js基本功
在元素的父節點註冊事件,經過事件冒泡,在父節點捕獲事件
經常使用正則表達式語法要熟悉
A:農場買了一隻羊,第一年是小羊,第二年末生一隻,第三年不生,第四年末再生一隻,第五年死掉。
B:寫出代碼對下列數組去重並從大到小排列{5,2,3,6,8,6,5,4,7,1,9}
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d]{6,20}$
一、在IE下可經過document.frames["id"];獲得該IFRAME對象,
而在火狐下則是經過document.getElementById("content_panel_if").contentWindow;
二、IE的寫法: _tbody=_table.childNodes[0]
在FF中,firefox會在子節點中包含空白則第一個子節點爲空白"", 而ie不會返回空白
能夠經過if("" != node.nodeName)過濾掉空白子對象
三、模擬點擊事件
if(document.all){ //ie下
document.getElementById("a3").click();
}
else{ //非IE
var evt = document.createEvent("MouseEvents");
evt.initEvent("click", true, true);
document.getElementById("a3").dispatchEvent(evt);
}
四、事件註冊
if (isIE){window.attachEvent("onload", init);}else{window.addEventListener("load", init, false);}
面試常常遇到的排序,查找算法要熟悉
簡單理解就是函數的嵌套造成閉包,閉包包括函數自己及其外部做用域
在元素的父節點註冊事件,經過事件冒泡,在父節點捕獲事件
var User = { 對象
count = 1,屬性
getCount:function(){ 方法
return this.count;
}
}
console.log(User.getCount());
var func = User.getCount;
console.log(func());
1 undefined(window);
(function test(){
var a=b=5;
alert(typeof a);
alert(typeof b);
})();
alert(typeof a);
alert(typeof b);
var iNum = 0;
for(var i = 1; i< 10; i++){
if(i % 5 == 0){
continue;
}
iNum++;
}
1) var a;
var b = a * 0;
if (b == b) {
console.log(b * 2 + "2" - 0 + 4);
} else {
console.log(!b * 2 + "2" - 0 + 4);
}
答案:26
2) <script>
var a = 1;
</script>
<script>
var a;
var b = a * 0;
if (b == b) {
console.log(b * 2 + "2" - 0 + 4);
} else {
console.log(!b * 2 + "2" - 0 + 4);
}
</script>
答案:6
3) var t = 10;
function test(t){
var t = t++;
}test(t);
console.log(t);
答案:10
4) var t = 10;
function test(test){
var t = test++;
}test(t);
console.log(t);
答案:10
6) var t = 10;
function test(test){
t = test++;
}test(t);
console.log(t);
答案:10
7) var t = 10;
function test(test){
t = t + test;
console.log(t);
var t = 3;
}test(t);
console.log(t);
答案:NaN 10
8)var a;
var b = a / 0;
if (b == b) {
console.log(b * 2 + "2" - 0 + 4);
} else {
console.log(!b * 2 + "2" - 0 + 4);
}
答案:26
9)<script>
var a = 1;
</script>
<script>
var a;
var b = a / 0;
if (b == b) {
console.log(b * 2 + "2" + 4);
} else {
console.log(!b * 2 + "2" + 4);
}
</script>
答案:Infinity24
<body>
<form id='form1'>
<div id='div1'></div>
<div id='div2'></div>
<div id='div3'></div>
<div id='div4'></div>
<div id='div5'></div>
<div id='div3'>id名重複的元素</div>
</form>
</body>
用程序實現找到html中id名相同的元素?
<button id='btn'>點擊我</button>
var btn = document.getElementById('btn');
var handler = {
id: '_eventHandler',
exec: function(){
alert(this.id);
}
}
btn.addEventListener('click', handler.exec.false);
var obj = {proto: {a:1,b:2}};
function F(){};
F.prototype = obj.proto;
var f = new F();
obj.proto.c = 3;
obj.proto = {a:-1, b:-2};
alert(f.a);
alert(f.c);
delete F.prototype['a'];
alert(f.a);
alert(obj.proto.a);
<ul id='list'>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
</ul>
var items = document.querySelectorAll('#list>li');
for(var i = 0;i < items.length; i++){
setTimeout(function(){
items[i].style.backgroundColor = '#fee';
}, 5);
}
<ul>
<li>Item</li>
<li></li>
<li></li>
<li>Item</li>
<li>Item</li>
</ul>
var items = document.getElementsByTagName('li');
for(var i = 0; i< items.length; i++){
if(items[i].innerHTML == ''){
items[i].parentNode.removeChild(items[i]);
}
}
window.error
try{}catch(){}finally{}
答案:」<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>」.replace(/{\$id}/g,?’10′).replace(/{\$name}/g,?‘Tony’);
addSpace(「hello world」) // -> ‘h e l l o ?w o r l d’
String.prototype.spacify = function(){
return this.split('').join(' ');
};
function DateDemo(){
var d, s="今天日期是:";
d = new Date();
s += d.getMonth() + "/";
s += d.getDate() + "/";
s += d.getYear();
return s;
}
結果:今天日期是:7/17/2010
var d = new Date();
// 獲取年,getFullYear()返回4位的數字
var year = d.getFullYear();
// 獲取月,月份比較特殊,0是1月,11是12月
var month = d.getMonth() + 1;
// 變成兩位
month = month < 10 ? '0' + month : month;
// 獲取日
var day = d.getDate();
day = day < 10 ? '0' + day : day;
alert(year + '-' + month + '-' + day);
答案:alert(stringArray.join(「」))
function combo(msg){
var arr=msg.split("-");
for(var i=1;i<arr.length;i++){
arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
}
msg=arr.join("");
return msg;
}
1)實現對該數組的倒排,輸出[5,1,4,2,6,3]
2)實現對該數組的降序排列,輸出[6,5,4,3,2,1]
function combo(msg){
var arr=msg.split("-");
for(var i=1;i<arr.length;i++){
arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
}
msg=arr.join("");
return msg;
}
var array1 = ['a','b','c'];
var bArray = ['d','e','f'];
var cArray = array1
var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];
function deRepeat(){
var newArr=[];
var obj={};
var index=0;
var l=arr.length;
for(var i=0;i<l;i++){
if(obj[arr[i]]==undefined)
{
obj[arr[i]]=1;
newArr[index++]=arr[i];
}
else if(obj[arr[i]]==1)
}
return newArr;
}
var newArr2=deRepeat(arr);
alert(newArr2); //輸出1,2,3,4,5,6,9,25
var iArray = [];
funtion getRandom(istart, iend){
var iChoice = istart - iend +1;
return Math.floor(Math.random() * iChoice + istart;
}
for(var i=0; i<10; i++){
iArray.push(getRandom(10,100));
}
iArray.sort();
答案:當使用RegExp()構造函數的時候,不只須要轉義引號(即\」表示」),而且還須要雙反斜槓(即\\表示一個\)。使用正則表達字面量的效率更高。?
正則表達式對象3 – 清除空格
寫一個function,清除字符串先後的空格。(兼容全部瀏覽器)
使用自帶接口trim(),考慮兼容性:
if (!String.prototype.trim) {
String.prototype.trim = function() {
return this.replace(/^\s+/, "").replace(/\s+$/,"");
} }
// test the function
var str = " \t\n test string ".trim();
alert(str == "test string"); // alerts "true"
<script lang="JavaScript" type="text/javascript">
function outPut(s) {
document.writeln(s);
}
var a = "lashou";
var b = a;
outPut(b);
a = "拉手";
outPut(a);
outPut(b);
var a_array = [1, 2, 3];
var b_array = a_array;
outPut(b_array);
a_array[3] = 4;
outPut(a_array);
outPut(b_array);
</script>
輸出結果:
答案:lashou 拉手 lashou 1,2,3 1,2,3,4 1,2,3,4
第1題:
function setName(){
name="張三";
}
setName();
console.log(name);
答案:"張三"
//考點:一、變量聲明提高 二、變量搜索機制
var a=1;
function test(){
console.log(a);
var a=1;
}
test();
答案:undefined
var b=2;
function test2(){
window.b=3;
console.log(b);
}
test2();
答案:3
c=5;//聲明一個全局變量c
function test3(){
window.c=3;
console.log(c); //答案:undefined,緣由:因爲此時的c是一個局部變量c,而且沒有被賦值
var c;
console.log(window.c);//答案:3,緣由:這裏的c就是一個全局變量c
}
test3();
var arr = [];
arr[0] = 'a';
arr[1] = 'b';
arr[10] = 'c';
alert(arr.length); //答案:11
console.log(arr[5]); //答案:undefined
var a=1;
console.log(a++); //答案:1
console.log(++a); //答案:3
console.log(null==undefined); //答案:true
console.log("1"==1); //答案:true,由於會將數字1先轉換爲字符串1
console.log("1"===1); //答案:false,由於數據類型不一致
typeof 1; "number"
typeof "hello"; "string"
typeof /[0-9]/; "object"
typeof {}; "object"
typeof null; "object"
typeof undefined; "undefined"
typeof [1,2,3]; "object"
typeof function(){}; //"function"
parseInt(3.14); //3
parseFloat("3asdf"); //3
parseInt("1.23abc456");
parseInt(true);//"true" NaN
//考點:函數聲明提早
function bar() {
return foo;
foo = 10;
function foo() {}
//var foo = 11;
}
alert(typeof bar());//"function"
var foo = 1;
function bar() {
foo = 10;
return;
function foo() {}
}
bar();
alert(foo);//答案:1
console.log(a);//是一個函數
var a = 3;
function a(){}
console.log(a);////3
//考點:對arguments的操做
function foo(a) {
arguments[0] = 2;
alert(a);//答案:2,由於:a、arguments是對實參的訪問,b、經過arguments[i]能夠修改指定實參的值
}
foo(1);
function foo(a) {
alert(arguments.length);//答案:3,由於arguments是對實參的訪問
}
foo(1, 2, 3);
bar();//報錯
var foo = function bar(name) {
console.log("hello"+name);
console.log(bar);
};
//alert(typeof bar);
foo("world");//"hello"
console.log(bar);//undefined
console.log(foo.toString());
bar();//報錯
function test(){
console.log("test函數");
}
setTimeout(function(){
console.log("定時器回調函數");
}, 0)
test();
function foo(){
var name="hello";
}
1. CSS3實現圓角(border-radius),陰影(box-shadow),
2. 對文字加特效(text-shadow、),線性漸變(gradient),旋轉(transform)
3.transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);// 旋轉,縮放,定位,傾斜
4. 增長了更多的CSS選擇器 多背景 rgba
5. 在CSS3中惟一引入的僞元素是 ::selection.
6. 媒體查詢,多欄佈局
7. border-image
新特性:
1. 拖拽釋放(Drag and drop) API
2. 語義化更好的內容標籤(header,nav,footer,aside,article,section)
3. 音頻、視頻API(audio,video)
4. 畫布(Canvas) API
5. 地理(Geolocation) API
6. 本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉後數據不丟失;
7. sessionStorage 的數據在瀏覽器關閉後自動刪除
8. 表單控件,calendar、date、time、email、url、search
9. 新的技術webworker, websocket, Geolocation
移除的元素:
1. 純表現的元素:basefont,big,center,font, s,strike,tt,u;
2. 對可用性產生負面影響的元素:frame,frameset,noframes;
支持HTML5新標籤:
1. IE8/IE7/IE6支持經過 document.createElement 方法產生的標籤,能夠利用這一特性讓這些瀏覽器支持 HTML5 新標籤,瀏覽器支持新標籤後,還須要添加標籤默認的樣式(固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架):
<!--[if lt IE 9]>
<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
如何區分:
DOCTYPE聲明新增的結構元素、功能元素
Cookies:服務器和客戶端均可以訪問;大小隻有4KB左右;有有效期,過時後將會刪除;
本地存儲:只有本地瀏覽器端可訪問數據,服務器不能訪問本地存儲直到故意經過POST或者GET的通道發送到服務器;每一個域5MB;沒有過時數據,它將保留知道用戶從瀏覽器清除或者使用Javascript代碼移除
調用 localstorge、cookies 等本地存儲方式
文件合併
文件最小化/文件壓縮
使用CDN託管
緩存的使用
它是關於網頁製做的過程當中讓不一樣的設備有不一樣的尺寸和不一樣的功能。響應式設計是讓全部的人能在這些設備上讓網站運行正常
答:HTML5文檔類型:<!doctype html>
HTML5使用的編碼<meta charset=」UTF-8」>
答:Canvas 元素用於在網頁上繪製圖形,該元素標籤強大之處在於能夠直接在 HTML 上進行圖形操做。
答:Media API、Text Track API、Application Cache API、User Interaction、Data Transfer API、Command API、Constraint Validation API、History API
p:first-of-type 選擇屬於其父元素的首個 <p> 元素的每一個 <p> 元素。
p:last-of-type 選擇屬於其父元素的最後 <p> 元素的每一個 <p> 元素。
p:only-of-type 選擇屬於其父元素惟一的 <p> 元素的每一個 <p> 元素。
p:only-child 選擇屬於其父元素的惟一子元素的每一個 <p> 元素。
p:nth-child(2) 選擇屬於其父元素的第二個子元素的每一個 <p> 元素。
:enabled、:disabled 控制表單控件的禁用狀態。
:checked,單選框或複選框被選中。
css屬性的熟練程度和實踐經驗
動畫相關屬性的熟悉程度
HTML5 如今已經不是 SGML 的子集,主要是關於圖像,位置,存儲,地理定位等功能的增長。
* 繪畫 canvas 元素
用於媒介回放的 video 和 audio 元素
本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉後數據不丟失;
sessionStorage 的數據在瀏覽器關閉後自動刪除
語意化更好的內容元素,好比 article、footer、header、nav、section
表單控件,calendar、date、time、email、url、search
CSS3實現圓角,陰影,對文字加特效,增長了更多的CSS選擇器 多背景 rgba
新的技術webworker, websockt, Geolocation
移除的元素
純表現的元素:basefont,big,center,font, s,strike,tt,u;
對可用性產生負面影響的元素:frame,frameset,noframes;
* 是IE8/IE7/IE6支持經過document.createElement方法產生的標籤,
能夠利用這一特性讓這些瀏覽器支持HTML5新標籤,
瀏覽器支持新標籤後,還須要添加標籤默認的樣式:
* 固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
<!--[if lt IE 9]>
<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
* 首先劃分紅頭部、body、腳部;。。。。。
* 實現效果圖是最基本的工做,精確到2px;
與設計師,產品經理的溝通和項目的參與
作好的頁面結構,頁面重構和用戶體驗
處理hack,兼容、寫出優美的代碼格式
針對服務器的優化、擁抱 HTML5。
漸進加強 progressive enhancement:針對低版本瀏覽器進行構建頁面,保證最基本的功能,而後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
優雅降級 graceful degradation:一開始就構建完整的功能,而後再針對低版本瀏覽器進行兼容。
區別:優雅降級是從複雜的現狀開始,並試圖減小用戶體驗的供給,而漸進加強則是從一個很是基礎的,可以起做用的版本開始,並不斷擴充,以適應將來環境的須要。降級(功能衰減)意味着往回看;而漸進加強則意味着朝前看,同時保證其根基處於安全地帶。
「優雅降級」觀點
「優雅降級」觀點認爲應該針對那些最高級、最完善的瀏覽器來設計網站。而將那些被認爲「過期」或有功能缺失的瀏覽器下的測試工做安排在開發週期的最後階段,並把測試對象限定爲主流瀏覽器(如 IE、Mozilla 等)的前一個版本。
在這種設計範例下,舊版的瀏覽器被認爲僅能提供「簡陋卻無妨 (poor, but passable)」 的瀏覽體驗。你能夠作一些小的調整來適應某個特定的瀏覽器。但因爲它們並不是咱們所關注的焦點,所以除了修復較大的錯誤以外,其它的差別將被直接忽略。
「漸進加強」觀點
「漸進加強」觀點則認爲應關注於內容自己。
內容是咱們創建網站的誘因。有的網站展現它,有的則收集它,有的尋求,有的操做,還有的網站甚至會包含以上的種種,但相同點是它們全都涉及到內容。這使得「漸進加強」成爲一種更爲合理的設計範例。這也是它當即被 Yahoo! 所採納並用以構建其「分級式瀏覽器支持 (Graded Browser Support)」策略的緣由所在。
那麼問題了。如今產品經理看到IE6,7,8網頁效果相對高版本現代瀏覽器少了不少圓角,陰影(CSS3),要求兼容(使用圖片背景,放棄CSS3),你會如何說服他?
CDN緩存更方便
突破瀏覽器併發限制
節約cookie帶寬
節約主域名的鏈接數,優化頁面響應速度
防止沒必要要的安全問題
(無標準答案)網頁標準和標準制定機構都是爲了能讓web發展的更‘健康’,開發者遵循統一的標準,下降開發難度,開發成本,SEO也會更好作,也不會由於濫用代碼致使各類BUG、安全問題,最終提升網站易用性。
sessionStorage用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問而且當會話結束後數據也隨之銷燬。所以sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲。而localStorage用於持久化的本地存儲,除非主動刪除數據,不然數據是永遠不會過時的。
web storage和cookie的區別
Web Storage的概念和cookie類似,區別是它是爲了更大容量存儲設計的。Cookie的大小是受限的,而且每次你請求一個新的頁面的時候Cookie都會被髮送過去,這樣無形中浪費了帶寬,另外cookie還須要指定做用域,不能夠跨域調用。
除此以外,Web Storage擁有setItem,getItem,removeItem,clear等方法,不像cookie須要前端開發者本身封裝setCookie,getCookie。可是Cookie也是不能夠或缺的:Cookie的做用是與服務器進行交互,做爲HTTP規範的一部分而存在 ,而Web Storage僅僅是爲了在本地「存儲」數據而生。
知道。css的content屬性專門應用在 before/after 僞元素上,用來插入生成內容。最多見的應用是利用僞類清除浮動。
//一種常見利用僞類清除浮動的代碼
.clearfix:after {
content:"."; //這裏利用到了content屬性
display:block;
height:0;
visibility:hidden;
clear:both; }
.clearfix {
*zoom:1;
}
after僞元素經過 content 在元素的後面生成了內容爲一個點的塊級素,再利用clear:both清除浮動。
那麼問題繼續還有,知道css計數器(序列數字字符自動遞增)嗎?如何經過css content屬性實現css計數器?
答案:css計數器是經過設置counter-reset 、counter-increment 兩個屬性 、及 counter()/counters()一個方法配合after / before 僞類實現。
HTML 5 包含嵌入音頻文件的標準方式,支持的格式包括 MP三、Wav 和 Ogg:
<audio controls>
<source src="jamshed.mp3" type="audio/mpeg">
Your browser does'nt support audio embedding feature.
</audio>
和音頻同樣,HTML5 定義了嵌入視頻的標準方法,支持的格式包括:MP四、WebM 和 Ogg:
<video width="450" height="340" controls>
<source src="jamshed.mp4" type="video/mp4">
Your browser does'nt support video embedding feature.
</video>
Datalist datetime output keygen date month week time number range emailurl
p:first-of-type 選擇屬於其父元素的首個 <p> 元素的每一個 <p> 元素。
p:last-of-type 選擇屬於其父元素的最後 <p> 元素的每一個 <p> 元素。
p:only-of-type 選擇屬於其父元素惟一的 <p> 元素的每一個 <p> 元素。
p:only-child 選擇屬於其父元素的惟一子元素的每一個 <p> 元素。
p:nth-child(2) 選擇屬於其父元素的第二個子元素的每一個 <p> 元素。
:enabled、:disabled 控制表單控件的禁用狀態。
:checked,單選框或複選框被選中。
(HTML5中新增長的不少標籤(如:<article>、<nav>、<header>和<footer>等)
就是基於語義化設計原則)
< div id="header">
< h1>標題< /h1>
< h2>專一Web前端技術< /h2>
< /div>
語義 HTML 具備如下特性:
文字包裹在元素中,用以反映內容。例如:
段落包含在 <p> 元素中。
順序表包含在<ol>元素中。
從其餘來源引用的大型文字塊包含在<blockquote>元素中。
HTML 元素不能用做語義用途之外的其餘目的。例如:
<h1>包含標題,但並不是用於放大文本。
<blockquote>包含大段引述,但並不是用於文本縮進。
空白段落元素 ( <p></p> ) 並不是用於跳行。
文本並不直接包含任何樣式信息。例如:
不使用 <font> 或 <center> 等格式標記。
類或 ID 中不引用顏色或位置。
sessionStorage和localStorage的存儲空間更大;
sessionStorage和localStorage有更多豐富易用的接口;
sessionStorage和localStorage各自獨立的存儲空間;
* HTML5 如今已經不是 SGML 的子集,主要是關於圖像,位置,存儲,多任務等功能的增長。
* 繪畫 canvas
用於媒介回放的 video 和 audio 元素
本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉後數據不丟失;
sessionStorage 的數據在瀏覽器關閉後自動刪除
語意化更好的內容元素,好比 article、footer、header、nav、section
表單控件,calendar、date、time、email、url、search
新的技術webworker, websockt, Geolocation
* 移除的元素
純表現的元素:basefont,big,center,font, s,strike,tt,u;
對可用性產生負面影響的元素:frame,frameset,noframes;
支持HTML5新標籤:
* IE8/IE7/IE6支持經過document.createElement方法產生的標籤,
能夠利用這一特性讓這些瀏覽器支持HTML5新標籤,
瀏覽器支持新標籤後,還須要添加標籤默認的樣式:
* 固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
<!--[if lt IE 9]>
<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
用正確的標籤作正確的事情!
html語義化就是讓頁面的內容結構化,便於對瀏覽器、搜索引擎解析;
在沒有樣式CCS狀況下也以一種文檔格式顯示,而且是容易閱讀的。
搜索引擎的爬蟲依賴於標記來肯定上下文和各個關鍵字的權重,利於 SEO。
使閱讀源代碼的人對網站更容易將網站分塊,便於閱讀維護理解。
localStorage 長期存儲數據,瀏覽器關閉後數據不丟失;
sessionStorage 數據在瀏覽器關閉後自動刪除。
|
<DOCYPE html> |
|
HTML5: nav, footer, header, section, hgroup, video, time, canvas, audio... CSS3: RGBA, opacity, text-shadow, box-shadow, border-radius, border-image, border-color, transform...; |
在我看來,語義化就是好比說一個段落, 那麼咱們就應該用 <p>標籤來修飾,標題就應該用 <h?>標籤等。符合文檔語義的標籤。
知識面寬度,多多益善
Zepto相對jQuery更加輕量,主要用在移動端,jQuery也有對應的jQuerymobile移動端框架
Ajax並不算是一種新的技術,全稱是asychronous javascript and xml,能夠說是已有技術的組合,主要用來實現客戶端與服務器端的異步通訊效果,實現頁面的局部刷新,早期的瀏覽器並不能原生支持ajax,能夠使用隱藏幀(iframe)方式變相實現異步效果,後來的瀏覽器提供了對ajax的原生支持
使用ajax原生方式發送請求主要經過XMLHttpRequest(標準瀏覽器)、ActiveXObject(IE瀏覽器)對象實現異步通訊效果
基本步驟:
var xhr =null;//建立對象
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open(「方式」,」地址」,」標誌位」);//初始化請求
xhr.setRequestHeader(「」,」」);//設置http頭信息
xhr.onreadystatechange =function(){}//指定回調函數
xhr.send();//發送請求
js框架(jQuery/EXTJS等)提供的ajax API對原生的ajax進行了封裝,熟悉了基礎理論,再學習別的框架就會駕輕就熟,好多都是換湯不換藥的內容
同步:阻塞的
-張三叫李四去吃飯,李四一直忙得不停,張三一直等着,直到李四忙完兩我的一塊去吃飯
=瀏覽器向服務器請求數據,服務器比較忙,瀏覽器一直等着(頁面白屏),直到服務器返回數據,瀏覽器才能顯示頁面
異步:非阻塞的
-張三叫李四去吃飯,李四在忙,張三說了一聲而後本身就去吃飯了,李四忙完後本身去吃
=瀏覽器向服務器請求數據,服務器比較忙,瀏覽器能夠自如的幹原來的事情(顯示頁面),服務器返回數據的時候通知瀏覽器一聲,瀏覽器把返回的數據再渲染到頁面,局部更新
理解跨域的概念:協議、域名、端口都相同才同域,不然都是跨域
出於安全考慮,服務器不容許ajax跨域獲取數據,可是能夠跨域獲取文件內容,因此基於這一點,能夠動態建立script標籤,使用標籤的src屬性訪問js文件的形式獲取js腳本,而且這個js腳本中的內容是函數調用,該函數調用的參數是服務器返回的數據,爲了獲取這裏的參數數據,須要事先在頁面中定義回調函數,在回調函數中處理服務器返回的數據,這就是解決跨域問題的主流解決方案
對於ajax請求傳遞的參數,若是是get請求方式,參數若是傳遞中文,在有些瀏覽器會亂碼,不一樣的瀏覽器對參數編碼的處理方式不一樣,因此對於get請求的參數須要使用 encodeURIComponent函數對參數進行編碼處理,後臺開發語言都有相應的解碼api。對於post請求不須要進行編碼
1. 建立XMLHttpRequest對象,也就是建立一個異步調用對象
2. 建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息
3. 設置響應HTTP請求狀態變化的函數
4. 發送HTTP請求
5. 獲取異步調用返回的數據
6. 使用JavaScript和DOM實現局部刷新
1. 異步加載的方案: 動態插入 script 標籤
2. 經過 ajax 去獲取 js 代碼,而後經過 eval 執行
3. script 標籤上添加 defer 或者 async 屬性
4. 建立並插入 iframe,讓它異步執行 js
同源策略是客戶端腳本(尤爲是Javascript)的重要的安全度量標準。它最先出自Netscape Navigator2.0,其目的是防止某個文檔或腳本從多個不一樣源裝載。所謂同源指的是:協議,域名,端口相同,同源策略是一種安全協議,指一段腳本只能讀取來自同一來源的窗口和文檔的屬性。
GET:通常用於信息獲取,使用URL傳遞參數,對所發送信息的數量也有限制,通常在2000個字符,有的瀏覽器是8000個字符
POST:通常用於修改服務器上的資源,對所發送的信息沒有限制
在如下狀況中,請使用 POST 請求:
1. 沒法使用緩存文件(更新服務器上的文件或數據庫)
2. 向服務器發送大量數據(POST 沒有數據量限制)
3. 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
1. 經過異步模式,提高了用戶體驗
2. 優化了瀏覽器和服務器之間的傳輸,減小沒必要要的數據往返,減小了帶寬佔用
3. Ajax在客戶端運行,承擔了一部分原本由服務器承擔的工做,減小了大用戶量下的服務器負載。
Ajax能夠實現異步通訊效果,實現頁面局部刷新,帶來更好的用戶體驗;按需獲取數據,節約帶寬資源;
一、ajax不支持瀏覽器back按鈕。
二、安全問題 AJAX暴露了與服務器交互的細節。
三、對搜索引擎的支持比較弱。
四、破壞了程序的異常機制。
get通常用來進行查詢操做,url地址有長度限制,請求的參數都暴露在url地址當中,若是傳遞中文參數,須要本身進行編碼操做,安全性較低。
post請求方式主要用來提交數據,沒有數據長度的限制,提交的數據內容存在於http請求體中,數據不會暴漏在url地址中。
Jsonp並非一種數據格式,而json是一種數據格式,jsonp是用來解決跨域獲取數據的一種解決方案,具體是經過動態建立script標籤,而後經過標籤的src屬性獲取js文件中的js腳本,該腳本的內容是一個函數調用,參數就是服務器返回的數據,爲了處理這些返回的數據,須要事先在頁面定義好回調函數,本質上使用的並非ajax技術
Ajax是全稱是asynchronous JavaScript andXML,即異步JavaScript和xml,用於在Web頁面中實現異步數據交互,實現頁面局部刷新。
優勢:能夠使得頁面不重載所有內容的狀況下加載局部內容,下降數據傳輸量,避免用戶不斷刷新或者跳轉頁面,提升用戶體驗
缺點:對搜索引擎不友好;要實現ajax下的先後退功能成本較大;可能形成請求數的增長跨域問題限制;
JSON是一種輕量級的數據交換格式,ECMA的一個子集
優勢:輕量級、易於人的閱讀和編寫,便於機器(JavaScript)解析,支持複合數據類型(數組、對象、字符串、數字)
200 - 請求成功
301 - 資源(網頁等)被永久轉移到其它URL
404 - 請求的資源(網頁等)不存在
500 - 內部服務器錯誤
分爲4個步驟:
1. 當發送一個 URL 請求時,無論這個 URL 是 Web 頁面的 URL 仍是 Web 頁面上每一個資源的 URL,瀏覽器都會開啓一個線程來處理這個請求,同時在遠程 DNS 服務器上啓動一個 DNS 查詢。這能使瀏覽器得到請求對應的 IP 地址。
2. 瀏覽器與遠程 Web 服務器經過 TCP 三次握手協商來創建一個 TCP/IP 鏈接。該握手包括一個同步報文,一個同步-應答報文和一個應答報文,這三個報文在 瀏覽器和服務器之間傳遞。該握手首先由客戶端嘗試創建起通訊,然後服務器應答並接受客戶端的請求,最後由客戶端發出該請求已經被接受的報文。
3. 一旦 TCP/IP 鏈接創建,瀏覽器會經過該鏈接向遠程服務器發送 HTTP 的 GET 請求。遠程服務器找到資源並使用 HTTP 響應返回該資源,值爲 200 的 HTTP 響應狀態表示一個正確的響應。
4. 此時,Web 服務器提供資源服務,客戶端開始下載資源。
get通常用來進行查詢操做,url地址有長度限制,請求的參數都暴露在url地址當中,若是傳遞中文參數,須要本身進行編碼操做,安全性較低。
post請求方式主要用來提交數據,沒有數據長度的限制,提交的數據內容存在於http請求體中,數據不會暴漏在url地址中。
使用eval()或者JSON.parse() 鑑於安全性考慮,推薦使用JSON.parse()更靠譜,對數據的安全性更好。
本地對象爲獨立於宿主環境的ECMAScript提供的對象,包括ArrayObjectRegExp等能夠new實例化的對象
內置對象爲Gload,Math 等不能夠實例化的(他們也是本地對象,內置對象是本地對象的一個子集)
宿主對象爲全部的非本地對象,全部的BOM和DOM對象都是宿主對象,如瀏覽器自帶的document,window 等對象
確保用戶在不一樣地區能用最快的速度打開網站,其中某個域名崩潰用戶也能經過其餘鬱悶訪問網站,而且不一樣的資源放到不一樣的服務器上有利於減輕單臺服務器的壓力。
一、壓縮css、js文件
二、合併js、css文件,減小http請求
三、外部js、css文件放在最底下
四、減小dom操做,儘量用變量替代沒必要要的dom操做
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
403 Forbidden //服務器收到請求,可是拒絕提供服務
404 Not Found //請求資源不存在,輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
jQuery能夠給一個對象同時綁定多個事件,低層實現方式是使用addEventListner或attachEvent兼容不一樣的瀏覽器實現事件的綁定,這樣能夠給同一個對象註冊多個事件。
Webkit是瀏覽器引擎,包括html渲染和js解析功能,手機瀏覽器的主流內核,與之相對應的引擎有Gecko(Mozilla Firefox 等使用)和Trident(也稱MSHTML,IE 使用)。
對於瀏覽器的調試工具要熟練使用,主要是頁面結構分析,後臺請求信息查看,js調試工具使用,熟練使用這些工具能夠快速提升解決問題的效率
瞭解BDD行爲驅動開發與TDD測試驅動開發已經單元測試相關概念,
四、 前端templating(Mustache, underscore, handlebars)是幹嗎的, 怎麼用?
Web 模板引擎是爲了使用戶界面與業務數據(內容)分離而產生的,
Mustache 是一個 logic-less (輕邏輯)模板解析引擎,它的優點在於能夠應用在 Javascript、PHP、Python、Perl 等多種編程語言中。
Underscore封裝了經常使用的JavaScript對象操做方法,用於提升開發效率。
Handlebars 是 JavaScript 一個語義模板庫,經過對view和data的分離來快速構建Web模板。
沒有用過的話說出它是幹什麼的便可
學習技術不只要會用,還有熟悉它的實現機制,這樣在開發中遇到問題時才能更好的解決
原生js的熟練度,實踐經驗,實現思路
IE與標準瀏覽器判斷,IE不一樣版本的判斷,userAgent var ie = /*@cc_on !@*/false;
對兩種事件模型的理解
|
// 方法一: Object.prototype.clone = function(){ var o = this.constructor === Array ? [] : {}; for(var e in this){ o[e] = typeof this[e] === "object" ? this[e].clone() : this[e]; } return o; } //方法二: /** * 克隆一個對象 * @param Obj * @returns */ function clone(Obj) { var buf; if (Obj instanceof Array) { buf = [];//建立一個空的數組 var i = Obj.length; while (i--) { buf[i] = clone(Obj[i]); } return buf; }else if (Obj instanceof Object){ buf = {};//建立一個空對象 for (var k in Obj) { //爲這個對象添加新的屬性 buf[k] = clone(Obj[k]); } return buf; }else{ //普通變量直接賦值 return Obj; } } |
|
var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4]; function deRepeat(){ var newArr=[]; var obj={}; var index=0; var l=arr.length; for(var i=0;i<l;i++){ if(obj[arr[i]]==undefined) { obj[arr[i]]=1; newArr[index++]=arr[i]; } else if(obj[arr[i]]==1) continue; } return newArr; } var newArr2=deRepeat(arr); alert(newArr2); //輸出1,2,3,4,5,6,9,25 |
|
function Dog() { this.wow = function() { alert(’Wow’); } this.yelp = function() { this.wow(); } } |
小芒和小賢同樣,原來也是一條可愛的小狗,但是忽然有一天瘋了(MadDog),一看到人就會每隔半秒叫一聲(wow)地不停叫喚(yelp)。請根據描述,按示例的形式用代碼來實。(繼承,原型,setInterval)
|
function MadDog() { this.yelp = function() { var self = this; setInterval(function() { self.wow(); }, 500); } } MadDog.prototype = new Dog(); //for test var dog = new Dog(); dog.yelp(); var madDog = new MadDog(); madDog.yelp(); |
|
<ul id=」test」> <li>這是第一條</li> <li>這是第二條</li> <li>這是第三條</li> </ul> |
|
// 方法一: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++) { lis[i].index=i; lis[i].onclick=function(){ alert(this.index); }; } //方法二: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++){ lis[i].index=i; lis[i].onclick=(function(a){ return function() { alert(a); } })(i); } |
/*** @param selector {String} 傳入的CSS選擇器。* @return {Array}*/
|
var query = function(selector) { var reg = /^(#)?(\.)?(\w+)$/img; var regResult = reg.exec(selector); var result = []; //若是是id選擇器 if(regResult[1]) { if(regResult[3]) { if(typeof document.querySelector === "function") { result.push(document.querySelector(regResult[3])); }else { result.push(document.getElementById(regResult[3])); } } } //若是是class選擇器 else if(regResult[2]) { if(regResult[3]) { if(typeof document.getElementsByClassName === 'function') { var doms = document.getElementsByClassName(regResult[3]); if(doms) { result = converToArray(doms); } } //若是不支持getElementsByClassName函數 else { var allDoms = document.getElementsByTagName("*") ; for(var i = 0, len = allDoms.length; i < len; i++) { if(allDoms[i].className.search(new RegExp(regResult[2])) > -1) { result.push(allDoms[i]); } } } } } //若是是標籤選擇器 else if(regResult[3]) { var doms = document.getElementsByTagName(regResult[3].toLowerCase()); if(doms) { result = converToArray(doms); } } return result; } function converToArray(nodes){ var array = null; try{ array = Array.prototype.slice.call(nodes,0);//針對非IE瀏覽器 }catch(ex){ array = new Array(); for( var i = 0 ,len = nodes.length; i < len ; i++ ) { array.push(nodes[i]) } } return array; } |
|
if(window.addEventListener){ var addListener = function(el,type,listener,useCapture){ el.addEventListener(type,listener,useCapture); }; } else if(document.all){ addListener = function(el,type,listener){ el.attachEvent("on"+type,function(){ listener.apply(el); }); } } |
改進以下:
function addEvent(elem, type, handler){ if(elem.addEventListener){ elem.addEventListener(type, handler, false); }else if(elem.attachEvent){ elem['temp' + type + handler] = handler; elem[type + handler] = function(){ elem['temp' + type + handler].apply(elem); }; elem.attachEvent('on' + type, elem[type + handler]); }else{ elem['on' + type] = handler; } } |
addSpace(「hello world」) // -> ‘h e l l o w o r l d’
|
String.prototype.spacify = function(){ return this.split('').join(' '); }; |
接着上述問題答案提問,1)直接在對象的原型上添加方法是否安全?尤爲是在Object對象上。(這個我沒能答出?但願知道的說一下。) 2)函數聲明與函數表達式的區別?
答案:在js中,解析器在向執行環境中加載數據時,對函數聲明和函數表達式並不是是一視同仁的,解析器會率先讀取函數聲明,並使其在執行任何代碼以前可用(能夠訪問),至於函數表達式,則必須等到解析器執行到它所在的代碼行,纔會真正被解析執行。
可行的方法一:
function log(msg) { console.log(msg); } log("hello world!") // hello world! |
若是要傳入多個參數呢?顯然上面的方法不能知足要求,因此更好的方法是:
function log(){ console.log.apply(console, arguments); }; |
到此,追問apply和call方法的異同。
對於apply和call二者在做用上是相同的,便是調用一個對象的一個方法,以另外一個對象替換當前對象。將一個函數的對象上下文從初始的上下文改變爲由 thisObj 指定的新對象。
但二者在參數上有區別的。對於第一個參數意義都同樣,但對第二個參數: apply傳入的是一個參數數組,也就是將多個參數組合成爲一個數組傳入,而call則做爲call的參數傳入(從第二個參數開始)。 如 func.call(func1,var1,var2,var3)對應的apply寫法爲:func.apply(func1,[var1,var2,var3]) 。
僞數組(類數組):沒法直接調用數組方法或指望length屬性有什麼特殊的行爲,但仍能夠對真正數組遍歷方法來遍歷它們。典型的是函數的argument參數,還有像調用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬於僞數組。能夠使用Array.prototype.slice.call(fakeArray)將數組轉化爲真正的Array對象。
假設接第八題題幹,咱們要給每一個log方法添加一個」(app)」前綴,好比’hello world!’ ->’(app)hello world!’。方法以下:
function log(){ var args = Array.prototype.slice.call(arguments); //爲了使用unshift數組方法,將argument轉化爲真正的數組 args.unshift('(app)'); console.log.apply(console, args); }; |
var User = { count: 1, getCount: function() { return this.count; } }; console.log(User.getCount()); // what? var func = User.getCount; console.log(func()); // what? |
問兩處console輸出什麼?爲何?
答案是1和undefined。
func是在winodw的上下文中被執行的,因此會訪問不到count屬性。
繼續追問,那麼如何確保Uesr老是能訪問到func的上下文,即正確返回1。正確的方法是使用Function.prototype.bind。兼容各個瀏覽器完整代碼以下:
Function.prototype.bind = Function.prototype.bind || function(context){ var self = this; return function(){ return self.apply(context, arguments); }; } var func = User.getCount.bind(User); console.log(func()); |
window.onload()方法是必須等到頁面內包括圖片的全部元素加載完畢後才能執行。
$(document).ready()是DOM結構繪製完畢後就執行,沒必要等到加載完畢。
/* * 傳遞函數給whenReady() * 當文檔解析完畢且爲操做準備就緒時,函數做爲document的方法調用 */ var whenReady = (function() { //這個函數返回whenReady()函數 var funcs = []; //當得到事件時,要運行的函數 var ready = false; //當觸發事件處理程序時,切換爲true //當文檔就緒時,調用事件處理程序 function handler(e) { if(ready) return; //確保事件處理程序只完整運行一次 //若是發生onreadystatechange事件,但其狀態不是complete的話,那麼文檔還沒有準備好 if(e.type === 'onreadystatechange' && document.readyState !== 'complete') { return; } //運行全部註冊函數 //注意每次都要計算funcs.length //以防這些函數的調用可能會致使註冊更多的函數 for(var i=0; i<funcs.length; i++) { funcs[i].call(document); } //事件處理函數完整執行,切換ready狀態, 並移除全部函數 ready = true; funcs = null; } //爲接收到的任何事件註冊處理程序 if(document.addEventListener) { document.addEventListener('DOMContentLoaded', handler, false); document.addEventListener('readystatechange', handler, false); //IE9+ window.addEventListener('load', handler, false); }else if(document.attachEvent) { document.attachEvent('onreadystatechange', handler); window.attachEvent('onload', handler); } //返回whenReady()函數 return function whenReady(fn) { if(ready) { fn.call(document); } else { funcs.push(fn); } } })(); |
若是上述代碼十分難懂,下面這個簡化版:
function ready(fn){ if(document.addEventListener) {//標準瀏覽器 document.addEventListener('DOMContentLoaded', function() { //註銷事件, 避免反覆觸發 document.removeEventListener('DOMContentLoaded',arguments.callee, false); fn();//執行函數 }, false); }else if(document.attachEvent) {//IE document.attachEvent('onreadystatechange', function() { if(document.readyState == 'complete') { document.detachEvent('onreadystatechange', arguments.callee); fn();//函數執行 } }); } }; |
回答出概念便可,下面是幾個要點
1. 給須要拖拽的節點綁定mousedown, mousemove, mouseup事件
2. mousedown事件觸發後,開始拖拽
3. mousemove時,須要經過event.clientX和clientY獲取拖拽位置,並實時更新位置
4. mouseup時,拖拽結束
5. 須要注意瀏覽器邊界的狀況
function setcookie(name,value,days){ //給cookie增長一個時間變量 var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); //設置過時時間爲days天 document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); } function getCookie(name){ var result = ""; var myCookie = ""+document.cookie+";"; var searchName = "+name+"="; var startOfCookie = myCookie.indexOf(searchName); var endOfCookie; if(satrtOfCookie != -1){ startOfcookie += searchName.length; endOfCookie = myCookie.indexOf(";",startOfCookie); result = (myCookie.substring(startOfCookie,endOfCookie)); } return result; } (function(){ var oTips = document.getElementById('tips');//假設tips的id爲tips var page = { check: function(){//檢查tips的cookie是否存在而且容許顯示 var tips = getCookie('tips'); if(!tips || tips == 'show') return true;//tips的cookie不存在 if(tips == "never_show_again") return false; }, hideTip: function(bNever){ if(bNever) setcookie('tips', 'never_show_again', 365); oTips.style.display = "none";//隱藏 }, showTip: function(){ oTips.style.display = "inline";//顯示,假設tips爲行級元素 }, init: function(){ var _this = this; if(this.check()){ _this.showTip(); setcookie('tips', 'show', 1); } oTips.onclick = function(){ _this.hideTip(true); }; } }; page.init(); })(); |
//define (function(window){ function fn(str){ this.str=str; }
fn.prototype.format = function(){ var arg = ______; return this.str.replace(_____,function(a,b){ return arg[b]||""; }); } window.fn = fn; })(window);
//use (function(){ var t = new fn('<p><a href="{0}">{1}</a><span>{2}</span></p>'); console.log(t.format('http://www.alibaba.com','Alibaba','Welcome')); })(); |
答案:訪函數的做用是使用format函數將函數的參數替換掉{0}這樣的內容,返回一個格式化後的結果:
第一個空是:arguments
第二個空是:/\{(\d+)\}/ig
理解變量和函數的訪問範圍和生命週期,全局做用域與局部做用域的區別,JavaScript中沒有塊做用域,函數的嵌套造成不一樣層次的做用域,嵌套的層次造成鏈式形式,經過做用域鏈查找屬性的規則須要深刻理解。
理解不一樣形式的函數調用方式下的this指向,理解事件函數、定時函數中的this指向,函數的調用形式決定了this的指向。
它的功能是把對應的字符串解析成JS代碼並運行;應該避免使用eval,不安全,很是耗性能(2個步驟,一次解析成js語句,一次執行)
[1].在IE中,事件對象是做爲一個全局變量來保存和維護的.全部的瀏覽器事件,無論是用戶觸發的,仍是其餘事件,都會更新window.event對象.因此在代碼中,只要調用window.event就能夠獲取事件對象, 再event.srcElement就能夠取得觸發事件的元素進行進一步處理.
[2].在FireFox中,事件對象卻不是全局對象,通常狀況下,是現場發生,現場使用,FireFox把事件對象自動傳給事件處理程序.
關於事件的兼容性處理要熟練掌握,事件對象具體哪些屬性存在兼容性問題,IE與標準事件模型事件冒泡與事件捕獲的支持要理解
簡單的理解是函數的嵌套造成閉包,閉包包括函數自己已經它的外部做用域
使用閉包能夠造成獨立的空間,延長變量的生命週期,報存中間狀態值
意思是使用嚴格模式,使用嚴格模式,一些不規範的語法將再也不支持
Instanceof constructor
一、建立一個空對象,而且 this 變量引用該對象,同時還繼承了該函數的原型。
二、屬性和方法被加入到 this 引用的對象中。
三、新建立的對象由 this 所引用,而且最後隱式的返回 this 。
主要考察原生js的實踐經驗
HasOwnProperty
輕量級數據交互格式,能夠造成複雜的嵌套格式,解析很是方便
方案一:<script>標籤的async="async"屬性(詳細參見:script標籤的async屬性)
方案二:<script>標籤的defer="defer"屬性
方案三:動態建立<script>標籤
方案四:AJAX eval(使用AJAX獲得腳本內容,而後經過eval_r(xmlhttp.responseText)來運行腳本)
方案五:iframe方式
理解模塊化開發模式:瀏覽器端requirejs,seajs;服務器端nodejs;ES6模塊化;fis、webpack等前端總體模塊化解決方案;grunt、gulp等前端工做流的使用
理解這兩種規範的差別,主要經過requirejs與seajs的對比,理解模塊的定義與引用方式的差別以及這兩種規範的設計原則
核心是js的加載模塊,經過正則匹配模塊以及模塊的依賴關係,保證文件加載的前後順序,根據文件的路徑對加載過的文件作了緩存
核心是實現js的加載模塊,維護js的依賴關係,控制好文件加載的前後順序
ES6新的語法糖,類,模塊化等新特性
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '('+this.x+', '+this.y+')';
}
}
方案一:<script>標籤的async="async"屬性(詳細參見:script標籤的async屬性)
方案二:<script>標籤的defer="defer"屬性
方案三:動態建立<script>標籤
方案四:AJAX eval(使用AJAX獲得腳本內容,而後經過eval_r(xmlhttp.responseText)來運行腳本)
方案五:iframe方式
document.write是重寫整個document, 寫入內容是字符串的html
innerHTML是HTMLElement的屬性,是一個元素的內部html內容
(1)建立新節點
createDocumentFragment() //建立一個DOM片斷
createElement_x() //建立一個具體的元素
createTextNode() //建立一個文本節點
(2)添加、移除、替換、插入
appendChild()
removeChild()
replaceChild()
insertBefore()
(3)查找
getElementsByTagName() //經過標籤名稱
getElementsByName() //經過元素的Name屬性的值
getElementById() //經過元素Id,惟一性
apply的參數是數組形式,call的參數是單個的值,除此以外在使用上沒有差異,重點理解這兩個函數調用的this改變
Array.concat( ) 鏈接數組
Array.join( ) 將數組元素鏈接起來以構建一個字符串
Array.length 數組的大小
Array.pop( ) 刪除並返回數組的最後一個元素
Array.push( ) 給數組添加元素
Array.reverse( ) 顛倒數組中元素的順序
Array.shift( ) 將元素移出數組
Array.slice( ) 返回數組的一部分
Array.sort( ) 對數組元素進行排序
Array.splice( ) 插入、刪除或替換數組的元素
Array.toLocaleString( ) 把數組轉換成局部字符串
Array.toString( ) 將數組轉換成一個字符串
Array.unshift( ) 在數組頭部插入一個元素
Object.hasOwnProperty( ) 檢查屬性是否被繼承
Object.isPrototypeOf( ) 一個對象是不是另外一個對象的原型
Object.propertyIsEnumerable( ) 是否能夠經過for/in循環看到屬性
Object.toLocaleString( ) 返回對象的本地字符串表示
Object.toString( ) 定義一個對象的字符串表示
Object.valueOf( ) 指定對象的原始值
嚴格來說js中並無類的概念,不過js中的函數能夠做爲構造函數來使用,經過new來實例化,其實函數自己也是一個對象。
理解JavaScript的預解析機制,js的運行主要分兩個階段:js的預解析和運行,預解析階段全部的變量聲明和函數定義都會提早,可是變量的賦值不會提早
使用 DocumentFragment 優化屢次 append
經過模板元素 clone ,替代 createElement
使用一次 innerHTML 賦值代替構建 dom 元素
使用 firstChild 和 nextSibling 代替 childNodes 遍歷 dom 元素
使用 Array 作爲 StringBuffer ,代替字符串拼接的操做
將循環控制量保存到局部變量
順序無關的遍歷時,用 while 替代 for
將條件分支,按可能性順序從高到低排列
在同一條件子的多( >2 )條件分支時,使用 switch 優於 if
使用三目運算符替代條件分支
須要不斷執行的時候,優先考慮使用 setInterval
閉包,循環
1. 工廠模式
2. 構造函數模式
3. 原型模式
4. 混合構造函數和原型模式
5. 動態原型模式
6. 寄生構造函數模式
7. 穩妥構造函數模式
1. 原型鏈繼承
2. 借用構造函數繼承
3. 組合繼承(原型+借用構造)
4. 原型式繼承
5. 寄生式繼承
6. 寄生組合式繼承
1. 它的功能是把對應的字符串解析成JS代碼並運行
2. 應該避免使用eval,不安全,很是耗性能(2次,一次解析成js語句,一次執行)
1. 原型對象也是普通的對象,是對象一個自帶隱式的 __proto__ 屬性,原型也有可能有本身的原型,若是一個原型對象的原型不爲 null 的話,咱們就稱之爲原型鏈
2. 原型鏈是由一些用來繼承和共享屬性的對象組成的(有限的)對象鏈
1. 咱們在網頁中的某個操做(有的操做對應多個事件)。例如:當咱們點擊一個按鈕就會產生一個事件。是能夠被 JavaScript 偵測到的行爲
2. 事件處理機制:IE是事件冒泡、firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件
3. ev.stopPropagation();
注意舊ie的方法:ev.cancelBubble = true;
他們是動態的樣式語言,是CSS預處理器,CSS上的一種抽象層。他們是一種特殊的語法/語言而編譯成CSS。
變量符不同,less是@,而Sass是$;
Sass支持條件語句,能夠使用if{}else{},for{}循環等等。而Less不支持;
Sass是基於Ruby的,是在服務端處理的,而Less是須要引入less.js來處理Less代碼輸出Css到瀏覽器
相同點:兩個方法產生的做用是徹底同樣的
不一樣點:方法傳遞的參數不一樣
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
apply()接收兩個參數,一個是函數運行的做用域(this),另外一個是參數數組。
call()方法第一個參數與apply()方法相同,但傳遞給函數的參數必須列舉出來。
閉包用的多的兩個做用:讀取函數內部的變量值;讓這些變量值始終保存着(在內存中)。
同時須要注意的是:閉包慎用,不濫用,不亂用,因爲函數內部的變量都被保存在內存中,會致使內存消耗大。
在JavaScript中,this一般指向的是咱們正在執行的函數自己,或者是,指向該函數所屬的對象。
全局的this → 指向的是Window
函數中的this → 指向的是函數所在的對象
對象中的this → 指向其自己
join()用於把數組中的全部元素拼接起來放入一個字符串。所帶的參數爲分割字符串的分隔符,默認是以逗號分開。歸屬於Array
split()即把字符串分離開,以數組方式存儲。歸屬於Stringstring
slice() 方法可從已有的數組中返回選定的元素。該方法並不會修改數組,而是返回一個子數組。若是想刪除數組中的一段元素,應該使用方法 Array.splice()
splice() 方法向/從數組中添加/刪除項目,而後返回被刪除的項目。返回的是含有被刪除的元素的數組。
讓利用事件冒泡的原理,讓本身的所觸發的事件,讓他的父元素代替執行!
阻止瀏覽器的默認行爲
window.event?window.event.returnValue=false:e.preventDefault();
中止事件冒泡
window.event?window.event.cancelBubble=true:e.stopPropagation();
原生JavaScript中,return false;只阻止默認行爲,不阻止冒泡,jQuery中的return false;既阻止默認行爲,又阻止冒泡
obj.appendChidl()
obj.removeChild()
obj.replaceChild()
obj.innersetBefore()
(1)實現js文件的異步加載,避免網頁失去響應;
(2)管理模塊之間的依賴性,便於代碼的編寫和維護。
遞歸便是程序在執行過程當中不斷調用自身的編程技巧,固然也必需要有一個明確的結束條件,否則就會陷入死循環。
/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
一、儘可能減小 HTTP 請求
二、使用瀏覽器緩存
三、使用壓縮組件
四、圖片、JS的預載入
五、將腳本放在底部
六、將樣式文件放在頁面頂部
七、使用外部的JS和CSS
八、精簡代碼
Undefined、null、關鍵字false、NaN、零、空字符串
第一個是重複執行每500毫秒執行一次,後面一個只執行一次。
會出現亂碼,加charset=」GB2312」;
Trident (['traɪd(ə)nt])--IE,Gecko (['gekəʊ])--Firefox, Presto (['prestəʊ])--opera,webkit—谷歌和Safari
瀏覽器內核又能夠分紅兩部分:渲染引擎和 JS 引擎。它負責取得網頁的內容(HTML、XML、圖像等等)、整理訊息(例如加入 CSS 等),以及計算網頁的顯示方式,而後會輸出至顯示器或打印機。JS 引擎則是解析 Javascript 語言,執行 javascript 語言來實現網頁的動態效果。
* 原型對象也是普通的對象,是對象一個自帶隱式的 __proto__ 屬性,原型也有可能有本身的原型,若是一個原型對象的原型不爲null的話,咱們就稱之爲原型鏈。
* 原型鏈是由一些用來繼承和共享屬性的對象組成的(有限的)對象鏈。
* JavaScript的數據對象有那些屬性值?
writable:這個屬性的值是否能夠改。
configurable:這個屬性的配置是否能夠刪除,修改。
enumerable:這個屬性是否能在for…in循環中遍歷出來或在Object.keys中列舉出來。
value:屬性值。
* 當咱們須要一個屬性的時,Javascript引擎會先看當前對象中是否有這個屬性, 若是沒有的話,就會查找他的Prototype對象是否有這個屬性。
function clone(proto) {
function Dummy() { }
Dummy.prototype = proto;
Dummy.prototype.constructor = Dummy;
return new Dummy(); //等價於Object.create(Person);
}
function object(old) {
function F() {};
F.prototype = old;
return new F();
}
var newObj = object(oldObject);
`// event(事件)工具集,來源:https://github.com/markyun
markyun.Event = {
// 頁面加載完成後
readyEvent : function(fn) {
if (fn==null) {
fn=document;
}
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = fn;
} else {
window.onload = function() {
oldonload();
fn();
};
}
},
// 視能力分別使用dom0||dom2||IE方式 來綁定事件
// 參數: 操做的元素,事件名稱 ,事件處理程序
addEvent : function(element, type, handler) {
if (element.addEventListener) {
//事件類型、須要執行的函數、是否捕捉
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent('on' + type, function() {
handler.call(element);
});
} else {
element['on' + type] = handler;
}
},
// 移除事件
removeEvent : function(element, type, handler) {
if (element.removeEnentListener) {
element.removeEnentListener(type, handler, false);
} else if (element.datachEvent) {
element.detachEvent('on' + type, handler);
} else {
element['on' + type] = null;
}
},
// 阻止事件 (主要是事件冒泡,由於IE不支持事件捕獲)
stopPropagation : function(ev) {
if (ev.stopPropagation) {
ev.stopPropagation();
} else {
ev.cancelBubble = true;
}
},
// 取消事件的默認行爲
preventDefault : function(event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
// 獲取事件目標
getTarget : function(event) {
return event.target || event.srcElement;
},
// 獲取event對象的引用,取到事件的全部信息,確保隨時能使用event;
getEvent : function(e) {
var ev = e || window.event;
if (!ev) {
var c = this.getEvent.caller;
while (c) {
ev = c.arguments[0];
if (ev && Event == ev.constructor) {
break;
}
c = c.caller;
}
}
return ev;
}
};
1. 咱們在網頁中的某個操做(有的操做對應多個事件)。例如:當咱們點擊一個按鈕就會產生一個事件。是能夠被 JavaScript 偵測到的行爲。
2. 事件處理機制:IE是事件冒泡、火狐是 事件捕獲;
3. ev.stopPropagation();
執行say667()後,say667()閉包內部變量會存在,而閉包內部函數的內部變量不會存在.使得Javascript的垃圾回收機制GC不會收回say667()所佔用的資源,由於say667()的內部函數的執行須要依賴say667()中的變量。這是對閉包做用的很是直白的描述.
function say667() {
// Local variable that ends up within closure
var num = 666;
var sayAlert = function() { alert(num); }
num++;
return sayAlert;
}
var sayAlert = say667();
sayAlert()//執行結果應該彈出的667
使用instanceof (待完善)
if(a instanceof Person){
alert('yes');
}
一、建立一個空對象,而且 this 變量引用該對象,同時還繼承了該函數的原型。
二、屬性和方法被加入到 this 引用的對象中。
三、新建立的對象由 this 所引用,而且最後隱式的返回 this 。
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它是基於JavaScript的一個子集。數據格式簡單, 易於讀寫, 佔用帶寬小
{'age':'12', 'name':'back'}
defer和async、動態建立DOM方式(用得最多)、按需異步載入js
當即執行函數,不暴露私有成員
var module1 = (function(){
var _count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();
(1) defer,只支持IE
(2) async:
(3) 建立script,插入到DOM中,加載完畢後callBack
documen.write和 innerHTML的區別
document.write只能重繪整個頁面
innerHTML能夠重繪頁面的一部分
(function(x){
delete x;
alert(x);
})(1+5);
函數參數沒法delete刪除,delete只能刪除經過for in訪問的屬性。
固然,刪除失敗也不會報錯,因此代碼運行會彈出「1」。
例子中用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,因此運行結果爲:alert(4);
注意:js 中的函數實際上是對象,函數名是對 Function 對象的引用。
function add(a,b){
alert(a+b);
}
function sub(a,b){
alert(a-b);
}
add.call(sub,3,1);
*jQuery是一個js庫,主要提供的功能是選擇器,屬性修改和事件綁定等等。
*jQuery UI則是在jQuery的基礎上,利用jQuery的擴展性,設計的插件。
提供了一些經常使用的界面元素,諸如對話框、拖動行爲、改變大小行爲等等
jQuery中沒有提供這個功能,因此你須要先編寫兩個jQuery的擴展:
$.fn.stringifyArray = function(array) {
return JSON.stringify(array)
}
$.fn.parseArray = function(array) {
return JSON.parse(array)
}
而後調用:
$("").stringifyArray(array)
其餘部分
(HTTP、正則、優化、重構、響應式、移動端、團隊協做、SEO、UED、職業生涯)
*基於Class的選擇性的性能相對於Id選擇器開銷很大,由於需遍歷全部DOM元素。
*頻繁操做的DOM,先緩存起來再操做。用Jquery的鏈式調用更好。
好比:var str=$("a").attr("href");
*for (var i = size; i < arr.length; i++) {}
for 循環每一次循環都查找了數組 (arr) 的.length 屬性,在開始循環的時候設置一個變量來存儲這個數字,可讓循環跑得更快:
for (var i = size, length = arr.length; i < length; i++) {}
(1) 減小http請求次數:CSS Sprites, JS、CSS源碼壓縮、圖片大小控制合適;網頁Gzip,CDN託管,data緩存 ,圖片服務器。
(2) 前端模板 JS+數據,減小因爲HTML標籤致使的帶寬浪費,前端用變量保存AJAX請求結果,每次操做本地變量,不用請求,減小請求次數
(3) 用innerHTML代替DOM操做,減小DOM操做次數,優化javascript性能。
(4) 當須要設置的樣式不少時設置className而不是直接操做style。
(5) 少用全局變量、緩存DOM節點查找的結果。減小IO讀取操做。
(6) 避免使用CSS Expression(css表達式)又稱Dynamic properties(動態屬性)。
(7) 圖片預加載,將樣式表放在頂部,將腳本放在底部 加上時間戳。
(8) 避免在頁面的主體佈局中使用table,table要等其中的內容徹底下載以後纔會顯示出來,顯示比div+css佈局慢。
100-199 用於指定客戶端應相應的某些動做。
200-299 用於表示請求成功。
300-399 用於已經移動的文件而且常被包含在定位頭信息中指定新的地址信息。
400-499 用於指出客戶端的錯誤。
400 語義有誤,當前請求沒法被服務器理解。
401 當前請求須要用戶驗證
403 服務器已經理解請求,可是拒絕執行它。
500-599 用於支持服務器錯誤。
503 – 服務不可用
要熟悉先後端的通訊流程,最好把動態網站的背後細節也介紹一遍
考察學習知識的態度,是否僅僅是停留在使用層面,要知其然知其因此然
this執行init構造函數自身,其實就是jQuery實例對象,返回this是爲了實現jQuery的鏈式操做
$.parseJSON('{"name":"John"}');
遞歸賦值
Jquery.extend用來擴展jQuery對象自己;jquery.fn.extend用來擴展jQuery實例
能夠同時綁定多個事件,低層實現原理是使用addEventListner與attachEvent兼容處理作事件註冊
jQuery是操做dom的框架,jQueryUI是基於jQuery作的一個UI組件庫
jQuery主要用於pc端,固然有對應的jQuerymobile用於移動端,zepto比jQuery更加小巧,主要用於移動端
優先使用ID選擇器
在class前使用tag(標籤名)
給選擇器一個上下文
慎用 .live()方法(應該說盡可能不要使用)
使用data()方法存儲臨時變量
點透主要是因爲兩個div重合,例如:一個div調用show(),一個div調用hide();這個時候當點擊上面的div的時候就會影響到下面的那個div;
解決辦法主要有2種:
1.github上有一個叫作fastclick的庫,它也能規避移動設備上click事件的延遲響應,https://github.com/ftlabs/fastclick
將它用script標籤引入頁面(該庫支持AMD,因而你也能夠按照AMD規範,用諸如require.js的模塊加載器引入),而且在dom ready時初始化在body上,
2.根據分析,若是不引入其它類庫,也不想本身按照上述fastclcik的思路再開發一套東西,須要1.一個優先於下面的「divClickUnder」捕獲的事件;2.而且經過這個事件阻止掉默認行爲(下面的「divClickUnder」對click事件的捕獲,在ios的safari,click的捕獲被認爲和滾屏、點擊輸入框彈起鍵盤等同樣,是一種瀏覽器默認行爲,便可以被event.preventDefault()阻止的行爲)。
知識面的寬度,流行框架要多多熟悉
Underscore的熟悉程度
在表達式中轉換數據<p>姓名爲 {{ lastName | uppercase }}</p>
currency,是什麼過濾器——格式化數字爲貨幣格式,單位是$符。
移動端的點擊事件的有延遲,時間是多久,爲何會有? 怎麼解決這個延時?(click 有 300ms 延遲,爲了實現safari的雙擊事件的設計,瀏覽器要知道你是否是要雙擊操做。)
*(優勢)由於Node是基於事件驅動和無阻塞的,因此很是適合處理併發請求,
所以構建在Node上的代理服務器相比其餘技術實現(如Ruby)的服務器表現要好得多。
此外,與Node代理服務器交互的客戶端代碼是由javascript語言編寫的,
所以客戶端和服務器端都用同一種語言編寫,這是很是美妙的事情。
*(缺點)Node是一個相對新的開源項目,因此不太穩定,它老是一直在變,
並且缺乏足夠多的第三方庫支持。看起來,就像是Ruby/Rails當年的樣子。
至少給出本身的思路(url-hash,能夠使用已有的一些框架history.js等)
1)、實時應用:如在線聊天,實時通知推送等等(如socket.io)
2)、分佈式應用:經過高效的並行I/O使用已有的數據
3)、工具類應用:海量的工具,小到前端壓縮部署(如grunt),大到桌面圖形界面應用程序
4)、遊戲類應用:遊戲領域對實時和併發有很高的要求(如網易的pomelo框架)
5)、利用穩定接口提高Web渲染能力
6)、先後端編程語言環境統一:前端開發人員能夠很是快速地切入到服務器端的開發(如著名的純Javascript全棧式MEAN架構)
Nodejs相關概念的理解程度
流行的MVC架構模式
熟悉先後端通訊相關知識
優勢:
1. 由於Node是基於事件驅動和無阻塞的,因此很是適合處理併發請求,所以構建在Node上的代理服務器相比其餘技術實現(如Ruby)的服務器表現要好得多。
2. 與Node代理服務器交互的客戶端代碼是由javascript語言編寫的,所以客戶端和服務器端都用同一種語言編寫,這是很是美妙的事情。
缺點:
1. Node是一個相對新的開源項目,因此不太穩定,它老是一直在變。
2. 缺乏足夠多的第三方庫支持。看起來,就像是Ruby/Rails當年的樣子(第三方庫如今已經很豐富了,因此這個缺點能夠說不存在了)。
使用率較高的框架有jQuery、YUI、Prototype、Dojo、Ext.js、Mootools等。尤爲是jQuery,超過91%。
輕量級框架有Modernizr、underscore.js、backbone.js、Raphael.js等。(理解這些框架的功能、性能、設計原理)
前端開發工具:Sublime Text 、Eclipse、Notepad、Firebug、HttpWatch、Yslow。
開發過的插件:城市選擇插件,汽車型號選擇插件、幻燈片插件。彈出層。(寫過開源程序,加載器,js引擎更好)
Formatting Context:指頁面中的一個渲染區域,而且擁有一套渲染規則,他決定了其子元素如何定位,以及與其餘元素的相互關係和做用。
網站重構:應用web標準進行設計(第2版)
html5 websoket
WebSocket經過Flash
XHR長時間鏈接
XHR Multipart Streaming
不可見的Iframe
<script>標籤的長時間鏈接(可跨域)
加班就像借錢,原則應當是------救急不救窮
先期團隊必須肯定好全局樣式(globe.css),編碼模式(utf-8) 等
編寫習慣必須一致(例如都是採用繼承式的寫法,單樣式都寫成一行);
標註樣式編寫人,各模塊都及時標註(標註關鍵樣式調用的地方);
頁面進行標註(例如 頁面 模塊 開始和結束);
CSS跟HTML 分文件夾並行存放,命名都得統一(例如style.css)
JS 分文件夾存放 命民以該JS 功能爲準英文翻譯;
圖片採用整合的 images.png png8 格式文件使用 儘可能整合在一塊兒使用方便未來的管理
內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在。
垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。
setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。
閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
Node.js、Mongodb、npm、MVVM、MEAN、react、angularjs
由於我想去阿里,因此我針對阿里的說
最羨慕就是在雙十一購物節,350.19億元,每分鐘支付79萬筆。海量數據,竟然無一漏單、無一故障。太厲害了。
融入本身的設計理念,注重用戶體驗,選擇合適的技術
壓縮、合併,減小請求,代碼層析優化。。。
知識面寬度,最好熟悉一些後臺語言,好比php,展示出本身的技術兩點
考慮問題的深刻,不只僅停留在完成任務上,要精益求精
表現出對前端的認同與興趣,關注相關技術前沿
A.fget();B.file_open();C.fopen();D.open_file();
A.任何文件夾均可以刪除 B.空文件夾能夠刪除
C.有權限的任何文件夾均可以刪除 D.有權限的空文件夾能夠刪除
一、empty函數
用途:檢測變量是否爲空
判斷:若是 var 是非空或非零的值,則 empty() 返回 FALSE。換句話說,""、0、"0"、NULL、FALSE、array()、var $var; 以及沒有任何屬性的對象都將被認爲是空的,若是 var 爲空,則返回 TRUE。注意:empty() 只檢測變量,檢測任何非變量的東西都將致使解析錯誤。換句話說,後邊的語句將不會起做用;
二、isset函數
用途:檢測變量是否設置
判斷:檢測變量是否設置,而且不是 NULL。若是已經使用 unset() 釋放了一個變量以後,它將再也不是 isset()。若使用 isset() 測試一個被設置成 NULL 的變量,將返回 FALSE。同時要注意的是一個NULL 字節("\0")並不等同於 PHP 的 NULL 常數。
1.減小css,js文件數量及大小(減小重複性代碼,代碼重複利用),壓縮CSS和Js代碼
2.圖片的大小
3.把css樣式表放置頂部,把js放置頁面底部
4.減小http請求數
5.使用外部 Js 和 CSS
熟悉相關設計規範,本身總結的一些經驗
團隊協做,我的能力。實踐經驗
考察解決問題的能力
前端是最貼近用戶的程序員,比後端、數據庫、產品經理、運營、安全都近。
一、實現界面交互
二、提高用戶體驗
三、有了Node.js,前端能夠實現服務端的一些事情
前端是最貼近用戶的程序員,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好,
參與項目,快速高質量完成實現效果圖,精確到1px;
與團隊成員,UI設計,產品經理的溝通;
作好的頁面結構,頁面重構和用戶體驗;
處理hack,兼容、寫出優美的代碼格式;
針對服務器的優化、擁抱最新前端技術。
其它相關的加分項:
1. 都使用和了解過哪些編輯器?都使用和了解過哪些平常工具?
2. 都知道有哪些瀏覽器內核?開發過的項目都兼容哪些瀏覽器?
3. 瀑布流佈局或者流式佈局是否有了解
4. HTML5都有哪些新的API?
5. 都用過什麼代碼調試工具?
6. 是否有接觸過或者瞭解太重構。
7.你遇到過比較難的技術問題是?你是如何解決的?
IE: trident內核
Firefox:gecko內核
Safari:webkit內核
Opera:之前是presto內核,Opera現已改用Google Chrome的Blink內核
Chrome:Blink(基於webkit,Google與Opera Software共同開發)
<!DOCTYPE> 聲明位於文檔中的最前面的位置,處於 <html> 標籤以前。此標籤可告知瀏覽器文檔使用哪一種 HTML 或 XHTML 規範。(重點:告訴瀏覽器按照何種規範解析頁面)
從IE6開始,引入了Standards模式,標準模式中,瀏覽器嘗試給符合標準的文檔在規範上的正確處理達到在指定瀏覽器中的程度。
在IE6以前CSS還不夠成熟,因此IE5等以前的瀏覽器對CSS的支持不好, IE6將對CSS提供更好的支持,然而這時的問題就來了,由於有不少頁面是基於舊的佈局方式寫的,而若是IE6 支持CSS則將令這些頁面顯示不正常,如何在即保證不破壞現有頁面,又提供新的渲染機制呢?
在寫程序時咱們也會常常遇到這樣的問題,如何保證原來的接口不變,又提供更強大的功能,尤爲是新功能不兼容舊功能時。遇到這種問題時的一個常見作法是增長參數和分支,即當某個參數爲真時,咱們就使用新功能,而若是這個參數 不爲真時,就使用舊功能,這樣就能不破壞原有的程序,又提供新功能。IE6也是相似這樣作的,它將DTD當成了這個「參數」,由於之前的頁面你們都不會去寫DTD,因此IE6就假定 若是寫了DTD,就意味着這個頁面將採用對CSS支持更好的佈局,而若是沒有,則採用兼容以前的佈局方式。這就是Quirks模式(怪癖模式,詭異模式,怪異模式)。
區別:
整體會有佈局、樣式解析和腳本執行三個方面的區別。
盒模型:在W3C標準中,若是設置一個元素的寬度和高度,指的是元素內容的寬度和高度,而在Quirks 模式下,IE的寬度和高度還包含了padding和border。
設置行內元素的高寬:在Standards模式下,給<span>等行內元素設置wdith和height都不會生效,而在quirks模式下,則會生效。
設置百分比的高度:在standards模式下,一個元素的高度是由其包含的內容來決定的,若是父元素沒有設置百分比的高度,子元素設置一個百分比的高度是無效的用margin:0 auto設置水平居中:使用margin:0 auto在standards模式下能夠使元素水平居中,但在quirks模式下卻會失效。
(還有不少,答出什麼不重要,關鍵是看他答出的這些是否是本身經驗遇到的,仍是說都是看文章看的,甚至徹底不知道。)
改版的時候更方便 只要改css文件。
頁面加載速度更快、結構化清晰、頁面顯示簡潔。
表現與結構相分離。
易於優化(seo)搜索引擎更友好,排名更容易靠前。
a:alt(alt text):爲不能顯示圖像、窗體或applets的用戶代理(UA),alt屬性用來指定替換文字。替換文字的語言由lang屬性指定。(在IE瀏覽器下會在沒有title時把alt當成 tool tip顯示)
title(tool tip):該屬性爲設置該屬性的元素提供建議性的信息。
strong:粗體強調標籤,強調,表示內容的重要性
em:斜體強調標籤,更強烈強調,表示內容的強調點
漸進加強 progressive enhancement:針對低版本瀏覽器進行構建頁面,保證最基本的功能,而後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
優雅降級 graceful degradation:一開始就構建完整的功能,而後再針對低版本瀏覽器進行兼容。
區別:優雅降級是從複雜的現狀開始,並試圖減小用戶體驗的供給,而漸進加強則是從一個很是基礎的,可以起做用的版本開始,並不斷擴充,以適應將來環境的須要。降級(功能衰減)意味着往回看;而漸進加強則意味着朝前看,同時保證其根基處於安全地帶。
「優雅降級」觀點
「優雅降級」觀點認爲應該針對那些最高級、最完善的瀏覽器來設計網站。而將那些被認爲「過期」或有功能缺失的瀏覽器下的測試工做安排在開發週期的最後階段,並把測試對象限定爲主流瀏覽器(如 IE、Mozilla 等)的前一個版本。
在這種設計範例下,舊版的瀏覽器被認爲僅能提供「簡陋卻無妨 (poor, but passable)」 的瀏覽體驗。你能夠作一些小的調整來適應某個特定的瀏覽器。但因爲它們並不是咱們所關注的焦點,所以除了修復較大的錯誤以外,其它的差別將被直接忽略。
「漸進加強」觀點
「漸進加強」觀點則認爲應關注於內容自己。
內容是咱們創建網站的誘因。有的網站展現它,有的則收集它,有的尋求,有的操做,還有的網站甚至會包含以上的種種,但相同點是它們全都涉及到內容。這使得「漸進加強」成爲一種更爲合理的設計範例。這也是它當即被 Yahoo! 所採納並用以構建其「分級式瀏覽器支持 (Graded Browser Support)」策略的緣由所在。
那麼問題來了。如今產品經理看到IE6,7,8網頁效果相對高版本現代瀏覽器少了不少圓角,陰影(CSS3),要求兼容(使用圖片背景,放棄CSS3),你會如何說服他?
CDN緩存更方便
突破瀏覽器併發限制
節約cookie帶寬
節約主域名的鏈接數,優化頁面響應速度
防止沒必要要的安全問題
網頁標準和標準制定機構都是爲了能讓web發展的更‘健康’,開發者遵循統一的標準,下降開發難度,開發成本,SEO也會更好作,也不會由於濫用代碼致使各類BUG、安全問題,最終提升網站易用性。
sessionStorage用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問而且當會話結束後數據也隨之銷燬。所以sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲。而localStorage用於持久化的本地存儲,除非主動刪除數據,不然數據是永遠不會過時的。
web storage和cookie的區別
Web Storage的概念和cookie類似,區別是它是爲了更大容量存儲設計的。Cookie的大小是受限的,而且每次你請求一個新的頁面的時候Cookie都會被髮送過去,這樣無形中浪費了帶寬,另外cookie還須要指定做用域,不能夠跨域調用。
除此以外,Web Storage擁有setItem,getItem,removeItem,clear等方法,不像cookie須要前端開發者本身封裝setCookie,getCookie。可是Cookie也是不能夠或缺的:Cookie的做用是與服務器進行交互,做爲HTTP規範的一部分而存在 ,而Web Storage僅僅是爲了在本地「存儲」數據而生。
src用於替換當前元素,href用於在當前文檔和引用資源之間確立聯繫。
src是source的縮寫,指向外部資源的位置,指向的內容將會嵌入到文檔中當前標籤所在位置;在請求src資源時會將其指向的資源下載並應用到文檔內,例如js腳本,img圖片和frame等元素。
<script src =」js.js」></script>
當瀏覽器解析到該元素時,會暫停其餘資源的下載和處理,直到將該資源加載、編譯、執行完畢,圖片和框架等元素也如此,相似於將所指向資源嵌入當前標籤內。這也是爲何將js腳本放在底部而不是頭部。
href是Hypertext Reference的縮寫,指向網絡資源所在位置,創建和當前元素(錨點)或當前文檔(連接)之間的連接,若是咱們在文檔中添加
<link href=」common.css」 rel=」stylesheet」/>
那麼瀏覽器會識別該文檔爲css文件,就會並行下載資源而且不會中止對當前文檔的處理。這也是爲何建議使用link方式來加載css,而不是使用@import方式。
png-8,png-24,jpeg,gif,svg。
可是上面的那些都不是面試官想要的最後答案。面試官但願聽到是Webp。(是否有關注新技術,新鮮事物)
科普一下Webp:WebP格式,谷歌(google)開發的一種旨在加快圖片加載速度的圖片格式。圖片壓縮體積大約只有JPEG的2/3,並能節省大量的服務器帶寬資源和數據空間。Facebook Ebay等知名網站已經開始測試並使用WebP格式。
在質量相同的狀況下,WebP格式圖像的體積要比JPEG格式圖像小40%
微格式(Microformats)是一種讓機器可讀的語義化XHTML詞彙的集合,是結構化數據的開放標準。是爲特殊應用而制定的特殊格式。
優勢:將智能數據添加到網頁上,讓網站內容在搜索引擎結果界面能夠顯示額外的提示。(應用範例:豆瓣,有興趣自行google)
答案:dns緩存,cdn緩存,瀏覽器緩存,服務器緩存。
圖片懶加載,在頁面上的未可視區域能夠添加一個滾動條事件,判斷圖片位置與瀏覽器頂端的距離與頁面的距離,若是前者小於後者,優先加載。
若是爲幻燈片、相冊等,能夠使用圖片預加載技術,將當前展現圖片的前一張和後一張優先下載。
若是圖片爲css圖片,能夠使用CSSsprite,SVGsprite,Iconfont、Base64等技術。
若是圖片過大,能夠使用特殊編碼的圖片,加載時會先加載一張壓縮的特別厲害的縮略圖,以提升用戶體驗。
若是圖片展現區域小於圖片的真實大小,則因在服務器端根據業務須要先行進行圖片壓縮,圖片壓縮後大小與展現一致。
去掉或樣式丟失的時候能讓頁面呈現清晰的結構:
html自己是沒有表現的,咱們看到例如<h1>是粗體,字體大小2em,加粗;<strong>是加粗的,不要認爲這是html的表現,這些其實html默認的css樣式在起做用,因此去掉或樣式丟失的時候能讓頁面呈現清晰的結構不是語義化的HTML結構的優勢,可是瀏覽器都有有默認樣式,默認樣式的目的也是爲了更好的表達html的語義,能夠說瀏覽器的默認樣式和語義化的HTML結構是不可分割的。
屏幕閱讀器(若是訪客有視障)會徹底根據你的標記來「讀」你的網頁.
例如,若是你使用的含語義的標記,屏幕閱讀器就會「逐個拼出」你的單詞,而不是試着去對它完整發音.
PDA、手機等設備可能沒法像普通電腦的瀏覽器同樣來渲染網頁(一般是由於這些設備對CSS的支持較弱)
使用語義標記能夠確保這些設備以一種有意義的方式來渲染網頁.理想狀況下,觀看設備的任務是符合設備自己的條件來渲染網頁.
語義標記爲設備提供了所需的相關信息,就省去了你本身去考慮全部可能的顯示狀況(包括現有的或者未來新的設備).例如,一部手機能夠選擇使一段標記了標題的文字以粗體顯示.而掌上電腦可能會以比較大的字體來顯示.不管哪一種方式一旦你對文本標記爲標題,您就能夠確信讀取設備將根據其自身的條件來合適地顯示頁面.
搜索引擎的爬蟲也依賴於標記來肯定上下文和各個關鍵字的權重
過去你可能尚未考慮搜索引擎的爬蟲也是網站的「訪客」,但如今它們他們其實是極其寶貴的用戶.沒有他們的話,搜索引擎將沒法索引你的網站,而後通常用戶將很難過來訪問.
你的頁面是否對爬蟲容易理解很是重要,由於爬蟲很大程度上會忽略用於表現的標記,而只注重語義標記.
所以,若是頁面文件的標題被標記,而不是,那麼這個頁面在搜索結果的位置可能會比較靠後.除了提高易用性外,語義標記有利於正確使用CSS和JavaScript,由於其自己提供了許多「鉤鉤」來應用頁面的樣式與行爲.
SEO主要仍是靠你網站的內容和外部連接的。
便於團隊開發和維護
W3C給咱們定了一個很好的標準,在團隊中你們都遵循這個標準,能夠減小不少差別化的東西,方便開發和維護,提升開發效率,甚至實現模塊化開發。
瞭解搜索引擎如何抓取網頁和如何索引網頁
你須要知道一些搜索引擎的基本工做原理,各個搜索引擎之間的區別,搜索機器人(SE robot 或叫 web crawler)如何進行工做,搜索引擎如何對搜索結果進行排序等等。
Meta標籤優化
主要包括主題(Title),網站描述(Description),和關鍵詞(Keywords)。還有一些其它的隱藏文字好比Author(做者),Category(目錄),Language(編碼語種)等。
如何選取關鍵詞並在網頁中放置關鍵詞
搜索就得用關鍵詞。關鍵詞分析和選擇是SEO最重要的工做之一。首先要給網站肯定主關鍵詞(通常在5個上下),而後針對這些關鍵詞進行優化,包括關鍵詞密度(Density),相關度(Relavancy),突出性(Prominency)等等。
瞭解主要的搜索引擎
雖然搜索引擎有不少,可是對網站流量起決定做用的就那麼幾個。好比英文的主要有Google,Yahoo,Bing等;中文的有百度,搜狗,有道等。不一樣的搜索引擎對頁面的抓取和索引、排序的規則都不同。還要了解各搜索門戶和搜索引擎之間的關係,好比AOL網頁搜索用的是Google的搜索技術,MSN用的是Bing的技術。
主要的互聯網目錄
Open Directory自身不是搜索引擎,而是一個大型的網站目錄,他和搜索引擎的主要區別是網站內容的收集方式不一樣。目錄是人工編輯的,主要收錄網站主頁;搜索引擎是自動收集的,除了主頁外還抓取大量的內容頁面。
按點擊付費的搜索引擎
搜索引擎也須要生存,隨着互聯網商務的愈來愈成熟,收費的搜索引擎也開始大行其道。最典型的有Overture和百度,固然也包括Google的廣告項目Google Adwords。愈來愈多的人經過搜索引擎的點擊廣告來定位商業網站,這裏面也大有優化和排名的學問,你得學會用最少的廣告投入得到最多的點擊。
搜索引擎登陸
網站作完了之後,別躺在那裏等着客人從天而降。要讓別人找到你,最簡單的辦法就是將網站提交(submit)到搜索引擎。若是你的是商業網站,主要的搜索引擎和目錄都會要求你付費來得到收錄(好比Yahoo要299美圓),可是好消息是(至少到目前爲止)最大的搜索引擎Google目前仍是免費,並且它主宰着60%以上的搜索市場。
連接交換和連接普遍度(Link Popularity)
網頁內容都是以超文本(Hypertext)的方式來互相連接的,網站之間也是如此。除了搜索引擎之外,人們也天天經過不一樣網站之間的連接來Surfing(「衝浪」)。其它網站到你的網站的連接越多,你也就會得到更多的訪問量。更重要的是,你的網站的外部連接數越多,會被搜索引擎認爲它的重要性越大,從而給你更高的排名。
合理的標籤使用
外部樣式表,引入一個外部css文件
內部樣式表,將css代碼放在 <head> 標籤內部
內聯樣式,將css樣式直接定義在 HTML 元素內部
派生選擇器(用HTML標籤申明)
id選擇器(用DOM的ID申明)
類選擇器(用一個樣式類名申明)
屬性選擇器(用DOM的屬性申明,屬於CSS2,IE6不支持,不經常使用,不知道就算了)
除了前3種基本選擇器,還有一些擴展選擇器,包括
後代選擇器(利用空格間隔,好比div .a{ })
羣組選擇器(利用逗號間隔,好比p,div,#a{ })
那麼問題來了,CSS選擇器的優先級是怎麼樣定義的?
基本原則:
通常而言,選擇器越特殊,它的優先級越高。也就是選擇器指向的越準確,它的優先級就越高。
複雜的計算方法:
用1表示派生選擇器的優先級
用10表示類選擇器的優先級
用100標示ID選擇器的優先級
div.test1 .span var 優先級 1+10 +10 +1
span#xxx .songs li 優先級1+100 + 10 + 1
#xxx li 優先級 100 +1
那麼問題來了,看下列代碼,<p>標籤內的文字是什麼顏色的?
<style>
.classA{ color:blue;}
.classB{ color:red;}
</style>
<body>
<p class='classB classA'> 123 </p>
</body>
答案:red。與樣式定義在文件中的前後順序有關,便是後面的覆蓋前面的,與在<p class=’classB classA’>中的前後關係無關。
最基本的:
設置display屬性爲none,或者設置visibility屬性爲hidden
技巧性:
設置寬高爲0,設置透明度爲0,設置z-index位置在-1000
答案:被點擊訪問過的超連接樣式不在具備hover和active了,解決方法是改變CSS屬性的排列順序: L-V-H-A(link,visited,hover,active)
答案:針對不一樣的瀏覽器寫不一樣的CSS code的過程,就是CSS hack。
示例以下:
1 2 3 4 5 6 7 8 9 10 11 12 |
#test { width:300px; height:300px; /*firefox*/ background-color:red\9; /*all ie*/ background-color:yellow; /*ie8*/ +background-color:pink; /*ie7*/ _background-color:orange; /*ie6*/ } :root #test { background-color:purple\9; } /*ie9*/ @media all and (min-width:0px){ #test {background-color:black;} } /*opera*/ @media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} } /*chrome and safari*/ |
答案:知道是要用css3。使用animation動畫實現一個簡單的幻燈片效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/**HTML**/ div.ani /**css**/ .ani{ width:480px; height:320px; margin:50px auto; overflow: hidden; box-shadow:0 0 5px rgba(0,0,0,1); background-size: cover; background-position: center; -webkit-animation-name: "loops"; -webkit-animation-duration: 20s; -webkit-animation-iteration-count: infinite; } @-webkit-keyframes "loops" { 0% { background:url(http://d.h、d3.jpg) no-repeat; } 25% { background:url(http://b.hiphotos.baidu.com/image/w%3D400/sig、f76094b364d72bceba1cc7cd98c109dd0.jpg) no-repeat; } 50% { background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=937dace2552c11dfded1be、58e七、bb5b912.jpg) no-repeat; } 75% { background:url(http://g.hiphotos.baidu.com/image/w%3D400/sign=7d37500b8544095d61f0972cdda3cc7cd99e4b.jpg) no-repeat; } 100% { background:url(http://c.hiphotos.baidu.com/image/2b21192138ad1.jpg) no-repeat; } } |
塊級元素(block)特性:
老是獨佔一行,表現爲另起一行開始,並且其後的元素也必須另起一行顯示;
寬度(width)、高度(height)、內邊距(padding)和外邊距(margin)均可控制;
內聯元素(inline)特性:
和相鄰的內聯元素在同一行;
寬度(width)、高度(height)、內邊距的top/bottom(padding-top/padding-bottom)和外邊距的top/bottom(margin-top/margin-bottom)都不可改變
(也就是padding和margin的left和right是能夠設置的),就是裏面文字或圖片的大小。
那麼問題來了,瀏覽器還有默認的天生inline-block元素(擁有內在尺寸,可設置高寬,但不會自動換行),有哪些?
答案:<input> 、<img> 、<button> 、<texterea> 、<label>。
外邊距重疊就是margin-collapse。
在CSS當中,相鄰的兩個盒子(多是兄弟關係也多是祖先關係)的外邊距能夠結合成一個單獨的外邊距。這種合併外邊距的方式被稱爲摺疊,而且於是所結合成的外邊距稱爲摺疊外邊距。
摺疊結果遵循下列計算規則:
兩個相鄰的外邊距都是正數時,摺疊結果是它們二者之間較大的值。
兩個相鄰的外邊距都是負數時,摺疊結果是二者絕對值的較大值。
兩個外邊距一正一負時,摺疊結果是二者的相加的和。
rgba()和opacity都能實現透明效果,但最大的不一樣是opacity做用於元素,以及元素內的全部內容的透明度,
而rgba()只做用於元素的顏色或其背景色。(設置rgba透明的元素的子元素不會繼承透明效果!)
垂直方向:line-height
水平方向:letter-spacing
那麼問題來了,關於letter-spacing的妙用知道有哪些麼?
答案:能夠用於消除inline-block元素間的換行符空格間隙問題。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// 方法一:已知元素的高寬 #div1{
width:200px; height:200px; position: absolute; //父元素須要相對定位 top: 50%; left: 50%; margin-top:-100px ; //二分之一的height,width margin-left: -100px; }
//方法二:未知元素的高寬
#div1{ width: 200px; height: 200px; background-color: #6699FF;
margin:auto; position: absolute; //父元素須要相對定位 left: 0; top: 0; right: 0; bottom: 0; } |
那麼問題來了,如何垂直居中一個<img>?(用更簡便的方法。)
1 2 3 4 5 6 |
#container //<img>的容器設置以下 { display:table-cell; text-align:center; vertical-align:middle; } |
px和em都是長度單位,區別是,px的值是固定的,指定是多少就是多少,計算比較容易。em得值不是固定的,而且em會繼承父級元素的字體大小。
瀏覽器的默認字體高都是16px。因此未經調整的瀏覽器都符合: 1em=16px。那麼12px=0.75em, 10px=0.625em。
重置樣式很是多,凡是一個前端開發人員確定有一個經常使用的重置CSS文件並知道如何使用它們。他們是盲目的在作仍是知道爲何這麼作呢?緣由是不一樣的瀏覽器對一些元素有不一樣的默認樣式,若是你不處理,在不一樣的瀏覽器下會存在必要的風險,或者更有戲劇性的性發生。
你可能會用Normalize來代替你的重置樣式文件。它沒有重置全部的樣式風格,但僅提供了一套合理的默認樣式值。既能讓衆多瀏覽器達到一致和合理,但又不擾亂其餘的東西(如粗體的標題)。
在這一方面,沒法作每個復位重置。它也確實有些超過一個重置,它處理了你永遠都不用考慮的怪癖,像HTML的audio元素不一致或line-height不一致。
他們是CSS預處理器。他是CSS上的一種抽象層。他們是一種特殊的語法/語言編譯成CSS。
例如Less是一種動態樣式語言. 將CSS賦予了動態語言的特性,如變量,繼承,運算, 函數. LESS 既能夠在客戶端上運行 (支持IE 6+, Webkit, Firefox),也可一在服務端運行 (藉助 Node.js)。
爲何要使用它們?
結構清晰,便於擴展。
能夠方便地屏蔽瀏覽器私有語法差別。這個不用多說,封裝對瀏覽器語法差別的重複處理,減小無心義的機械勞動。
能夠輕鬆實現多重繼承。
徹底兼容 CSS 代碼,能夠方便地應用到老項目中。LESS 只是在 CSS 語法上作了擴展,因此老的 CSS 代碼也能夠與 LESS 代碼一同編譯。
display : 隱藏對應的元素但不擠佔該元素原來的空間。
visibility: 隱藏對應的元素而且擠佔該元素原來的空間。
便是,使用CSS display:none屬性後,HTML元素(對象)的寬度、高度等各類屬性值都將「丟失」;而使用visibility:hidden屬性後,HTML元素(對象)僅僅是在視覺上看不見(徹底透明),而它所佔據的空間位置仍然存在。
Link屬於html標籤,而@import是CSS中提供的
在頁面加載的時候,link會同時被加載,而@import引用的CSS會在頁面加載完成後纔會加載引用的CSS
@import只有在ie5以上才能夠被識別,而link是html標籤,不存在瀏覽器兼容性問題
Link引入樣式的權重大於@import的引用(@import是將引用的樣式導入到當前的頁面中)
CSS的盒子模型有兩種:IE盒子模型、標準的W3C盒子模型模型
盒模型:內容、內邊距、外邊距(通常不計入盒子實際寬度)、邊框
因爲瀏覽器兼容的問題,不一樣的瀏覽器對標籤的默認樣式值不一樣,若不初始化會形成不一樣瀏覽器之間的顯示差別
可是初始化CSS會對搜索引擎優化形成小影響
BFC(塊級格式化上下文),一個建立了新的BFC的盒子是獨立佈局的,盒子內元素的佈局不會影響盒子外面的元素。在同一個BFC中的兩個相鄰的盒子在垂直方向發生margin重疊的問題
BFC是指瀏覽器中建立了一個獨立的渲染區域,該區域內全部元素的佈局不會影響到區域外元素的佈局,這個渲染區域只對塊級元素起做用
當頁面樣式加載失敗的時候可以讓頁面呈現出清晰的結構
有利於seo優化,利於被搜索引擎收錄(更便於搜索引擎的爬蟲程序來識別)
便於項目的開發及維護,使html代碼更具備可讀性,便於其餘設備解析。
<!DOCTYPE>用於告知瀏覽器該以何種模式來渲染文檔
嚴格模式下:頁面排版及JS解析是以該瀏覽器支持的最高標準來執行
混雜模式:不嚴格按照標準執行,主要用來兼容舊的瀏覽器,向後兼容
1. 全部的標記都必需要有一個相應的結束標記
2. 全部標籤的元素和屬性的名字都必須使用小寫
3. 全部的 XML 標記都必須合理嵌套
4. 全部的屬性必須用引號 "" 括起來
5. 把全部 < 和 & 特殊符號用編碼表示
6. 給全部屬性賦一個值
7. 不要在註釋內容中使用 "--"
8. 圖片必須有說明文字
1.雙邊距BUG float引發的 使用display
2.3像素問題 使用float引發的 使用dislpay:inline -3px
3.超連接hover 點擊後失效 使用正確的書寫順序 link visited hover active
4.Ie z-index問題 給父級添加position:relative
5.Png 透明 使用js代碼 改
6.Min-height 最小高度 !Important 解決’
7.select 在ie6下遮蓋 使用iframe嵌套
8.爲何沒有辦法定義1px左右的寬度容器(IE6默認的行高形成的,使用over:hidden,zoom:0.08 line-height:1px)
9.IE5-8不支持opacity,解決辦法:
.opacity {
opacity: 0.4
filter: alpha(opacity=60); /* for IE5-7 */
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; /* for IE 8*/
}
10. IE6不支持PNG透明背景,解決辦法: IE6下使用gif圖片
答:標籤閉合、標籤小寫、不亂嵌套、提升搜索機器人搜索概率、使用外 鏈css和js腳本、結構行爲表現的分離、文件下載與頁面速度更快、內容能被更多的用戶所訪問、內容能被更普遍的設備所訪問、更少的代碼和組件,容易維 護、改版方便,不須要變更頁面內容、提供打印版本而不須要複製內容、提升網站易用性。
答:塊級元素:div p h1 h2 h3 h4 form ul
行內元素: a b br i span input select
Css盒模型:內容,border ,margin,padding
答:結構層 Html 表示層 CSS 行爲層 js。
(1)、<!DOCTYPE> 聲明位於文檔中的最前面,處於 <html> 標籤以前。告知瀏覽器的解析器,用什麼文檔類型 規範來解析這個文檔。
(2)、嚴格模式的排版和 JS 運做模式是 以該瀏覽器支持的最高標準運行。
(3)、在混雜模式中,頁面以寬鬆的向後兼容的方式顯示。模擬老式瀏覽器的行爲以防止站點沒法工做。
(4)、DOCTYPE不存在或格式不正確會致使文檔以混雜模式呈現。
(1)CSS規範規定,每一個元素都有display屬性,肯定該元素的類型,每一個元素都有默認的display值,好比div默認display屬性值爲「block」,成爲「塊級」元素;span默認display屬性值爲「inline」,是「行內」元素。
(2)行內元素有:a b span img input select strong(強調的語氣) 塊級元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
(3)知名的空元素:
<br><hr><img><input><link><meta>不爲人知的是: <area><base><col><command>
<embed><keygen><param><source><track><wbr>
(1)兩種, IE 盒子模型、標準 W3C 盒子模型;IE 的content部分包含了 border 和 pading;
(2)盒模型: 內容(content)、填充(padding)、邊界(margin)、 邊框(border).
* 1.id選擇器( # myid)
2.類選擇器(.myclassname)
3.標籤選擇器(div, h1, p)
4.相鄰選擇器(h1 + p)
5.子選擇器(ul < li)
6.後代選擇器(li a)
7.通配符選擇器( * )
8.屬性選擇器(a[rel = "external"])
9.僞類選擇器(a: hover, li: nth - child)
* 可繼承: font-size font-family color, UL LI DL DD DT;
* 不可繼承 :border padding margin width height ;
* 優先級就近原則,樣式定義最近者爲準;
* 載入樣式以最後載入的定位爲準;
優先級爲:
!important > id > class > tag
important 比 內聯優先級高
CSS3新增僞類舉例:
p:first-of-type 選擇屬於其父元素的首個 <p> 元素的每一個 <p> 元素。
p:last-of-type 選擇屬於其父元素的最後 <p> 元素的每一個 <p> 元素。
p:only-of-type 選擇屬於其父元素惟一的 <p> 元素的每一個 <p> 元素。
p:only-child 選擇屬於其父元素的惟一子元素的每一個 <p> 元素。
p:nth-child(2) 選擇屬於其父元素的第二個子元素的每一個 <p> 元素。
:enabled、:disabled 控制表單控件的禁用狀態。
:checked,單選框或複選框被選中。
給div設置一個寬度,而後添加margin:0 auto屬性
div{
width:200px;
margin:0 auto;
}
居中一個浮動元素
肯定容器的寬高 寬500 高 300 的層
設置層的外邊距
.div {
Width:500px ; height:300px;//高度能夠不設
Margin: -150px 0 0 -250px;
position:relative;相對定位
//方便看效果
left:50%;
top:50%;
}
* IE瀏覽器的內核Trident、 Mozilla的Gecko、google的WebKit、Opera內核Presto;
* png24爲的圖片在iE6瀏覽器上出現背景,解決方案是作成PNG8.
* 瀏覽器默認的margin和padding不一樣。解決方案是加一個全局的*{margin:0;padding:0;}來統一。
* IE6雙邊距bug:塊屬性標籤float後,又有橫行的margin狀況下,在ie6顯示margin比設置的大。
浮動ie產生的雙倍距離 #box{ float:left; width:10px; margin:0 0 0 100px;}
這種狀況之下IE會產生20px的距離,解決方案是在float的標籤樣式控制中加入 ——_display:inline;將其轉化爲行內屬性。(_這個符號只有ie6會識別)
漸進識別的方式,從整體中逐漸排除局部。
首先,巧妙的使用「\9」這一標記,將IE遊覽器從全部狀況中分離出來。
接着,再次使用「+」將IE8和IE七、IE6分離開來,這樣IE8已經獨立識別。
css
.bb{
background-color:#f1ee18;/*全部識別*/
.background-color:#00deff\9; /*IE六、七、8識別*/
+background-color:#a200ff;/*IE六、7識別*/
_background-color:#1e0bd1;/*IE6識別*/
}
* IE下,能夠使用獲取常規屬性的方法來獲取自定義屬性,
也能夠使用getAttribute()獲取自定義屬性;
Firefox下,只能使用getAttribute()獲取自定義屬性.
解決方法:統一經過getAttribute()獲取自定義屬性.
* IE下,even對象有x,y屬性,可是沒有pageX,pageY屬性;
Firefox下,event對象有pageX,pageY屬性,可是沒有x,y屬性.
* (條件註釋)缺點是在IE瀏覽器下可能會增長額外的HTTP請求數。
* 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 {}
1. block 象塊類型元素同樣顯示。
none 缺省值。向行內元素類型同樣顯示。
inline-block 象行內元素同樣顯示,但其內容象塊類型元素同樣顯示。
list-item 象塊類型元素同樣顯示,並添加樣式列表標記。
2. position的值
*absolute
生成絕對定位的元素,相對於 static 定位之外的第一個父元素進行定位。
*fixed (老IE不支持)
生成絕對定位的元素,相對於瀏覽器窗口進行定位。
* relative
生成相對定位的元素,相對於其正常位置進行定位。
* static 默認值。沒有定位,元素出如今正常的流中
*(忽略 top, bottom, left, right z-index 聲明)。
* inherit 規定從父元素繼承 position 屬性的值。
標籤閉合、標籤小寫、不亂嵌套、提升搜索機器人搜索概率、使用外 鏈css和js腳本、結構行爲表現的分離、文件下載與頁面速度更快、內容能被更多的用戶所訪問、內容能被更普遍的設備所訪問、更少的代碼和組件,容易維 護、改版方便,不須要變更頁面內容、提供打印版本而不須要複製內容、提升網站易用性;
選擇器{屬性1:值1;屬性2:值2;……}
盒子模型 渲染模式的不一樣
使用 window.top.document.compatMode 可顯示爲何模式
最基本的:
設置display屬性爲none,或者設置visibility屬性爲hidden
技巧性:
設置寬高爲0,設置透明度爲0,設置z-index位置在-1000
答案:被點擊訪問過的超連接樣式不在具備hover和active了,解決方法是改變CSS屬性的排列順序: L-V-H-A(link,visited,hover,active)
答案:針對不一樣的瀏覽器寫不一樣的CSS code的過程,就是CSS hack。
示例以下:
#test {
width:300px;
height:300px;
background-color:blue; /*firefox*/
background-color:red\9; /*all ie*/
background-color:yellow\0; /*ie8*/
+background-color:pink; /*ie7*/
_background-color:orange; /*ie6*/ }
:root #test { background-color:purple\9; } /*ie9*/
@media all and (min-width:0px){ #test {background-color:black\0;} } /*opera*/
@media screen and (-webkit-min-device-pixel-ratio:0){ #test {background-color:gray;} } /*chrome and safari*/
答案:知道是要用css3。使用animation動畫實現一個簡單的幻燈片效果。
/**HTML**/
div.ani
/**css**/
.ani{
width:480px;
height:320px;
margin:50px auto;
overflow: hidden;
box-shadow:0 0 5px rgba(0,0,0,1);
background-size: cover;
background-position: center;
-webkit-animation-name: "loops";
-webkit-animation-duration: 20s;
-webkit-animation-iteration-count: infinite;
}
@-webkit-keyframes "loops" {
0% { background:url(http://d.hiphotos.baidu.com/image/w%3D400/sign=c01e6adca964034f0fcdc3069fc27980/e824b899a9014c08e5e38ca4087b02087af4f4d3.jpg) no-repeat;
}
25% {
background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=edee1572e9f81a4c2632edc9e72b6029/30adcbef76094b364d72bceba1cc7cd98c109dd0.jpg) no-repeat;
}
50% {
background:url(http://b.hiphotos.baidu.com/image/w%3D400/sign=937dace2552c11dfded1be2353266255/d8f9d72a6059252d258e7605369b033b5bb5b912.jpg) no-repeat;
}
75% {
background:url(http://g.hiphotos.baidu.com/image/w%3D400/sign=7d37500b8544ebf86d71653fe9f9d736/0df431adcbef76095d61f0972cdda3cc7cd99e4b.jpg) no-repeat;
}
100% {
background:url(http://c.hiphotos.baidu.com/image/w%3D400/sign=cfb239ceb0fb43161a1f7b7a10a54642/3b87e950352ac65ce2e73f76f9f2b21192138ad1.jpg) no-repeat;
}
}
塊級元素(block)特性:
內聯元素(inline)特性:
那麼問題來了,瀏覽器還有默認的天生inline-block元素(擁有內在尺寸,可設置高寬,但不會自動換行),有哪些?
答案:<input> 、<img> 、<button> 、<textarea> 、<label>
答案:
外邊距重疊就是margin-collapse。
在CSS當中,相鄰的兩個盒子(多是兄弟關係也多是祖先關係)的外邊距能夠結合成一個單獨的外邊距。這種合併外邊距的方式被稱爲摺疊,而且於是所結合成的外邊距稱爲摺疊外邊距。
摺疊結果遵循下列計算規則:
rgba()和opacity都能實現透明效果,但最大的不一樣是opacity做用於元素,以及元素內的全部內容的透明度,
而rgba()只做用於元素的顏色或其背景色。(設置rgba透明的元素的子元素不會繼承透明效果!)
垂直方向:line-height
水平方向:letter-spacing
那麼問題來了,關於letter-spacing的妙用知道有哪些麼?
答案:能夠用於消除inline-block元素間的換行符空格間隙問題。
// 方法一:已知元素的高寬
#div1{
background-color:#6699FF;
width:200px;
height:200px;
position: absolute; //父元素須要相對定位
top: 50%;
left: 50%;
margin-top:-100px ; //二分之一的height,width
margin-left: -100px;
}
//方法二:未知元素的高寬
#div1{
width: 200px;
height: 200px;
background-color: #6699FF;
margin:auto;
position: absolute; //父元素須要相對定位
left: 0;
top: 0;
right: 0;
bottom: 0;
}
那麼問題來了,如何垂直居中一個<img>?(用更簡便的方法。)
#container //<img>的容器設置以下
{
display:table-cell;
text-align:center;
vertical-align:middle;
}
normalize.css
嗎?你瞭解他們的不一樣之處? 重置樣式很是多,凡是一個前端開發人員確定有一個經常使用的重置CSS文件並知道如何使用它們。他們是盲目的在作仍是知道爲何這麼作呢?緣由是不一樣的瀏覽器對一些元素有不一樣的默認樣式,若是你不處理,在不一樣的瀏覽器下會存在必要的風險,或者更有戲劇性的性發生。
你可能會用Normalize來代替你的重置樣式文件。它沒有重置全部的樣式風格,但僅提供了一套合理的默認樣式值。既能讓衆多瀏覽器達到一致和合理,但又不擾亂其餘的東西(如粗體的標題)。
在這一方面,沒法作每個復位重置。它也確實有些超過一個重置,它處理了你永遠都不用考慮的怪癖,像HTML的audio
元素不一致或line-height
不一致。
display:block行內元素轉換爲塊級元素
display:inline塊級元素轉換爲行內元素
display:inline-block轉爲內聯元素
可繼承: font-size font-family color, ul li dl dd dt;
不可繼承 :border padding margin width height ;
!important > id > class > 標籤
!important 比 內聯優先級高
*優先級就近原則,樣式定義最近者爲準;
*以最後載入的樣式爲準;
後者有語義,前者則無。
1.內聯元素(inline element)
a – 錨點
abbr – 縮寫
acronym – 首字
b – 粗體(不推薦)
big – 大字體
br – 換行
em – 強調
font – 字體設定(不推薦)
i – 斜體
img – 圖片
input – 輸入框
label – 表格標籤
s – 中劃線(不推薦)
select – 項目選擇
small – 小字體文本
span – 經常使用內聯容器,定義文本內區塊
strike – 中劃線
strong – 粗體強調
sub – 下標
sup – 上標
textarea – 多行文本輸入框
tt – 電傳文本
u – 下劃線
var – 定義變量
二、塊級元素
address – 地址
blockquote – 塊引用
center – 舉中對齊塊
dir – 目錄列表
div – 經常使用塊級容易,也是css layout的主要標籤
dl – 定義列表
fieldset – form控制組
form – 交互表單
h1 – 大標題
h2 – 副標題
h3 – 3級標題
h4 – 4級標題
h5 – 5級標題
h6 – 6級標題
hr – 水平分隔線
isindex – input prompt
menu – 菜單列表
noframes – frames可選內容,(對於不支持frame的瀏覽器顯示此區塊內容)
noscript – )可選腳本內容(對於不支持script的瀏覽器顯示此內容)
ol – 排序表單
p – 段落
pre – 格式化文本
table – 表格
ul – 非排序列表
3.CSS盒子模型包含四個部分組成:
內容、填充(padding)、邊框(border)、外邊界(margin)。
#ID > .class > 標籤選擇符 !important優先級高
margin-top,padding-top無效
內容,border ,margin,padding
display:block行內元素轉換爲塊級元素
display:inline塊級元素轉換爲行內元素
display:inline-block轉爲內聯元素
可繼承: font-size font-family color, ul li dl dd dt;
不可繼承 :border padding margin width height ;
!important > id > class > 標籤
!important 比 內聯優先級高
* 優先級就近原則,樣式定義最近者爲準;
* 以最後載入的樣式爲準;
text-align是水平對齊,line-height是行間。
結構層 Html 表示層 CSS 行爲層 js