#BOM 和 DOM
#####瀏覽器內核:
①渲染引擎:webkit;
② JS引擎:V8引擎(谷歌)
DOM瀏覽器:對DOM的支持高於IE(包括谷歌)。
###怎麼在瀏覽器裏面寫JS代碼:
方法1:外聯JS
<script src="路徑 "></script> 能夠引多個JS,從上往下指行。
方法2:內部書寫
<script>
let a = 100; // 這個a是全局變量,整個網頁均可以通用。
consle.log(a); // 100
</script>
方法3:內嵌 內嵌做用域全局儘可能避免
<a herf = " javasript:console.log(內嵌JS) " 執行JS</a> console.log(內嵌JS)它是一個代碼塊。
<input type = "button" value onclick = "console.log('click')"> console.log('click') 它是一個代碼塊。
<script>
window.onload = function (){ //後面是的會覆蓋前面的
let a = 100; // 局部的a ,定義在函數裏的變量就是局部的。
console.log("a",a)
}
</script>
window.addEventListener ("load",function(){}); 不會覆蓋前面的。
##BOM
window表明一個窗口
window 對象有哪些屬性和方法:
BOM :Bowser(瀏覽器) Object(對象) Moder (模式)
屬性:
innerWidth innerheight // 可視區域的寬度
outerWidth outerHeight) //瀏覽器的寬和高
window.screenX window.screenY // screenX 窗口至關於屏幕的X軸 ;screenY窗口至關於屏幕的Y軸 相似雪碧圖
(window裏面的屬性:就是window.屬性)
方法:alert("警告"); 若是出現框,若是不關掉,會阻止代碼,下面的代碼不會執行。
let flag = confirm ("確認");
console.log(flag);
let value = prompt("請輸入:")
console.log(value);
時間函數 :異步 通常用在動畫中
1. setTimeout()給定一個時間,等時間時間到了以後,執行且執行一次這個方法。
例:let timeId = setTimeout ( function(){
console.log("timeout");
},200);
cleartimeout(timeoutId);
2. setInterval() 每隔多長時間後,不斷的間隔執行方法。
let count =0;
let intervalId = setInterval( function(){
count++;
if(count>5){
clearInterval(inderId) //用來結束循環
}
console.log("interval",count);
}
隊例:先進先出
open("") 打開一個新窗口 ,裏面寫地址,彈出一個標籤頁。
open("地址","name","width=0,height=30" ); 子頁面的寬高
Screen 對象屬性
screen.availWidth screen.availHeight
//電腦屏幕的寬度和高度 ,高度不加上下邊的任務欄 。"screen.avail:", 能夠不寫它只是在終端顯示出來,方便咱們知道它是那個對象的屬性。
screen.width screen.height /電腦屏幕的總寬度和總高度 。高度要加上下邊的任務欄
location 對象屬性 (經過location能夠訪問網站的任何一部分)
location.herf = "http:" "; 跳轉到指定頁面
http://www.baidu.com:80/index.com/#xx?name:xxx
#DOM
##docunment(文檔)Object(對象)Moder(模式)
DOM(文檔樹) : html根節點 {head , body是子節點}(head , body裏面的元素是子節點)
##點擊事件 格式: n.onclick= function(){ }
DOM節點分三種:
nodeType nodeName nodeValue
1. 元素節點 : 1 元素名 null
2. 屬性節點 : 2 屬性名 屬性值
3. 文本節點: 3 #text 文本內容 例:<h1> 標題 <h1>
##獲取節點的方法:(方法要調用)
1. getElementById(""); (獲取節點)
2. getElementsByTagName("元素名"); 根據元素獲取多個節點(集合、數組)
3. getElementsByName("元素名"); 根據內容屬性獲取
4. doucument.querySelector("css選擇器"); 根據css的選擇器獲取一個節點 (只得一個,第一個節點)
5. doucument.querySelectorAll("css選擇器"); 根據css的選擇器獲取所有節點
##屬性用來遍歷節點:(.屬性)
1. firstChild第一個節點
2. lastChild 最後一個節點
3. nextSibing 下一個節點(兄弟查找)
4. previousSibing上一個節點(兄弟查找)
5. parentNale 父節點
6. childNodes全部的節點
##建立節點
建立元素節點:createElement("");
建立屬性節點:createAttribute(""); 也能夠直接用 格式:newNode.id = " ";
建立文本節點:createTextNode("");
##DOM 的方法:對整個節點的增改查刪 進行操做。
添加:n.appendChild( ); - 添加新的子節點(元素) ()括號裏寫新節點
插入父節點:n.insertBefore(新節點,舊節點 ); 新節點會插入到舊節點的前面
刪除:n.removeChild(); 刪除子節點(元素) 例:(n.lastChild)從最後一個開始刪除
修改節點(替換節點): n.replaceChild(); 括號裏面填(newnode新節點,n.firstChild.nexSibing舊節點);首先要先建立一個新的節點。
##innerHTML屬性 :能夠獲取或改變任意HTML元素,包括(HTML和BODY)。(把獲取的內容以字符串的形式返回) input id = "innerHTMLBth" type= "button" value
innerHTMLBth.onclick = function (){
.innerHTML = "<p>新增元素</p>"; 替換以前的元素
.innerHTML += "<p>新增元素</p>" ; 添加在以前元素的後面
.innerHTML = "<p>新增元素</p>" + .innerHTML; 添加在以前元素的前面
}
.innerHTML設置的內容會被瀏覽器解析,而innerText的內容不會被解析,原樣的顯示出來。
###IE瀏覽器的限制:
1. 不容許tr,td經過innerHTML添加到table 裏面
2. 不容許option經過innerHTML添加到select裏面。
##事件:在某一刻發生的事情
##事件流:在一個標籤上觸發了一個事件後,沿着這個方向進行傳播
###事件流的分類:
1. 事件冒泡 :(IE僅支持冒泡) 從裏到外;
2. 事件捕獲:(網景瀏覽器僅支持)從外到裏
3. DOM事件流:(及支持冒泡也支持捕獲)。
默認狀況下瀏覽器都是事件冒泡
###DOM處理事件的方法:
1. 內嵌事件 直接在標籤上綁定事件 (儘可能避免,它在全局找)
2. DOM0 傳統處理事件:
優勢:兼容瀏覽器,以on開頭後加屬性名,全部的字母都是小寫。
缺點:只能爲一個事件添加一個處理方法。
3. DOM2 優勢:爲一個事件,添加多個處理方法。
缺點:IE不兼容
IE的處理方法:
###DOM2 的增長刪除
增長:.addEventListener("事件",function){ }
刪除:.removeEventListener("事件",function){ }
###IE瀏覽器的增長刪除
增長:.addEventListener("事件",show);
刪除:.removeEventListener("事件",show);
###DOM0 的增長刪除
增長:.事件 = function (){}
刪除:.事件=null;
###事件處理的類型:
鼠標 經常使用的:onclick點擊 ondbliclick雙擊 oncontextmenu右鍵
鍵盤: onkeydown 按下 onkeyup 鬆開 onkeypress 按下鬆開
###事件對象:Event 每個事件被觸發後,就會產生一個對象,用形參來接收這個事件。
IE : e= window.event || e
DOM : e.
clientX clientY 鼠標頂部到可視區域的距離
screenX screenY 電腦屏幕區域的距離 IE用e.screenX e.screenY
pageY pageX 鼠標頂部到body頂部的距離
###阻止事件的冒泡:
IE方法:cansel Bubble = true
DOM瀏覽器方法: stopProgation()方法 通常用於作複雜的動畫
###阻止事件的默認行爲:不是每個事件都有默認行爲
IE:returnValue = false
DOOM : preventDafault ()方法
###事件委託:適用於同時爲不少標籤綁定事件。 (子元素不處理,委託父元素統一處理)
怎麼肯定是子元素:
event.target.parentNode.
##消除閉包
產生閉包的兩個條件:1.一個函數的內部函數在訪問外部變量
2.在此函數外部引用了這個內部函數
```js
let arr = [1,2,3,4,5]
for(var i = 0; i < arr.length; i++){
(function(index){
lis[index].onclick = function(){
console.log(index);
}
})(i)
}
//解決辦法就是:使用當即調用函數,傳形參,不讓它訪問外部變量
```
###獲取表單:
1. DOM方法 document.getElementById("");
BOM方法:
2. document.forms[0]; // [下標]
3. document.forms[""]; // ["ID名"]
document.forms["f"+"m"]; //["f"+"m"]字符串拼接,
4. document.name(名)
###獲取表單域對象/表單字段:
1. let a = document.getElementById("a");
2. fm(form的Id名).elements(表單元素) // 例:let a = fm.elements[0]
3. let a = fm.elements[「」]; // [「Id名」]
4. let a = fm.a // .id或者 . name 均可以
5. let a = fm[""] // ["ID名"]
6. let a = fm[0] // [下標]
form表單能夠用標籤提交,也能夠用JS方法提交
<input type="button">這是一個普通按鈕,不具有提交功能,可是用JS方法也能夠具有提交功能
<input type="rest"> 返回初始狀態(默認狀態)
<input type="image" src = "地址"> 具備提交功能
表單名.onsubmit = function (){} 當利用標籤提交時會觸發onsubmit事件,若是用JS提交就不會觸發onsubmit事件。重置標籤和重置方法都會觸發onrest.
###特殊屬性 :
多選 multipe
關閉,禁用 disabled 沒法提交到服務器 ,可是能夠用JS(false,true)方法能夠取消禁用,可是標籤不能夠取消
只讀 readlyonly 只有輸入框有readlyonly只讀,單行和多行也能夠有
選中 checked
添加元素:父級點. Option.add(Ls); //(Ls)增長的內容
獲取選中的元素: 父級點.onchange = function (){} 改變事件 [父級點. selectedIndex].innerHTML
刪除元素:父級點.ption.remove(); 刪除一個
父級點.ptions.length = 0; 清空
獲取焦點事件: .onfocus = function (){}
離開/失去焦點事件: .onblur = function (){} 改變了值,而且離開纔會觸發焦點事件
.oninput 只要改變了值之後,當即觸發的事件。
###HTML5設置的JS方法
1. 視頻
```js
<video>
<source src = "" type = "video/mp4">
</video>
```
ontimeupdate 當時間改變時觸發 //音頻/視頻的位置發生改變
ID名.play() 播放當前音頻/視頻
ID名.pause() 暫停 當前音頻/視頻
controls 特殊屬性 控制
2. 音頻
3. canvas 標籤
```html
<canvas> </canvas> //設置寬度,高度引用屬性,而且不加px
例:<canvas width = "800" height = "400" id = "cs">
```
```js
let cs = document.getelementById("cs");/獲取畫板
let ctx = cs.getContext("2d"); //獲取畫筆
ctx.fillRect(0,0,200,50)// 矩型,有顏色填充
ctx.fillStyle = "red"// 變換畫筆顏色(默認爲黑色)
ctx.strokeStyle = "blue"無顏色填充
ctx.lineCap ()設置直線
ctx.arc(圓心X座標,圓心Y座標,半徑,起始角位置,結束角 ,true/false(可選寫))
例:ctx.arc ( 100,75, 50,2*Math.PI); //畫圓 若是半圓就把(2*Math.PI改爲Math.PI) ;若是要逆時針的半圓就在第六個屬性寫true ,順時針 false)
ctx.beginPath(); //開始新的路徑
ctx.lineWidth = 20;
ctx.moveTo(20,20); //起始座標(從那個地方開始 。初始化)
ctx.lineTo(20,150); //結束座標 (要移動到的那個位置)
ctx.closePath(); //關閉路徑
```
4. 引入圖片
```js
let image = new Image();
image.src = "images/地址/路徑";
image.onload = function(){ //等加載完以後
ctx.rotate(Math.PI);
ctx.drawImage(image,-125,-125,250,250)
}
```
若是作旋轉之類的動畫:
先 .save(), //保存 狀態;
完了再 .restore() //恢復;
.translate(X,Y) //改變原點位置;
###HTML5 內聯SVG 全稱(SVG可伸縮矢量圖形)
1. 位圖:有一個個的像素塊構成。
優勢:圖片色彩豐富
缺點:若是圖片不等比例縮放會失真。
2. 矢量圖:經過一系列的算法算出來的。 (它不是html5 的規範,它本身自己就是一個規範)
優勢:不會失真,可伸縮。可經過編輯器來建立和修改。
缺點:色彩不夠豐富。
3. SVG 優勢:
可伸縮矢量圖形
用於定義用於網絡的基於矢量的圖形
使用XML格式定義圖形
SVG是萬維網的標準
SVG可被搜索、索引
4. canvas 和SVG的區別:
Canvas :
依賴分辨率
不支持事件處理器
弱的文本渲染能力
可以以 .png 或 .jpg 格式保存結果圖像
最適合圖像密集型的遊戲,其中的許多對象會被頻繁重繪
SVG:
不依賴分辨率
支持事件處理器
最適合帶有大型渲染區域的應用程序(好比谷歌地圖)
複雜度高會減慢渲染速度(任何過分使用 DOM 的應用都不快)
不適合遊戲應用
SVG教程:
cx和cy屬性定義圓點的x和y座標。若是省略cx和cy,圓的中心會被設置爲(0, 0)
r屬性定義圓的半徑
```js
例:<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<circle cx="100" cy="50" r="40" stroke="black" //畫圓
stroke-width="2" fill="red" />
</svg>
```
CX屬性定義的橢圓中心的x座標
CY屬性定義的橢圓中心的y座標
RX屬性定義的水平半徑
RY屬性定義的垂直半徑
```js
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<ellipse cx="300" cy="80" rx="100" ry="50" //橢圓
style="fill:yellow;stroke:purple;stroke-width:2"/>
</svg>
```
元素能夠安排任何分小組與<tspan> 元素的數量。每一個<tspan> 元素能夠包含不一樣的格式和位置。幾行文本(與 <tspan> 元素
//幾行文本共同組成的
```js
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<text x="10" y="20" style="fill:red;">Several lines:
<tspan x="10" y="45">First line</tspan>
<tspan x="10" y="70">Second line</tspan>
</text>
</svg>
```
###HTML的拖拽
draggable = "true" 容許拖拽 ,標籤跟着鼠標移動
拖放事件:
ondragstart 開始
ondragend 結束
ondrag
要有拖放目標 :
ondragenter 進入拖放目標 ,有響應事件(觸發)
ondragleave 離開時觸發
ondragover 移動,一直在觸發
ondrop 會受到干擾,若是讓ondrop觸發,首先要阻止 ondragover的默認行爲,放開時纔會觸發。
e.preventDefault() 阻止默認行爲。
###HTML5 web存儲
cookie:服務器會發給瀏覽器一些簡短的東西 (例登錄) 不屬於HTML5
容量小 : 4KB
安全性 :容易被截獲
HTML5開始的,存放在瀏覽器裏面的對象。
sessionStorage 和 localStorage 本地存儲,不會提交給瀏覽器
區別:
localStorage 存放時間長 除非本身刪除,不然一直存放 用法同樣
sessionStorage 打開瀏覽器開始,關閉瀏覽器結束。存放範圍短,用法同樣
方法: 保存數據 二者存進去的都是字符串,不是字符串會轉成字符串。
JOSN.stringify();存入的是對象,先轉成字符串
JOSN.parse();取 還原成數組
屬性:
保存數據:localStorage.setItem(key,value);
讀取數據:localStorage.getItem(key);
刪除單個數據:localStorage.removeItem(key);
刪除全部數據:localStorage.clear();
獲得某個索引的key:localStorage.key(index);
#jQuery
jquery:函數庫,簡化開發
特色:
1. 簡單,小巧
2. 兼容全部的瀏覽器
jquery版本:
1.X版本 任兼容IE8如下的版本
3.X 以 2.X開始徹底放棄IE9如下的版本
###一 引入jquery
jquery的用法:
先獲得jquery對象:jquery("選擇器") ; 在jquery中 $ = jquery ,因此能夠寫成$("選擇器") 例:$("#d1")
###二 jquery對象如何轉化成原生
方法1:.get 例: $("選擇器").get(0).innerHTML ="hello"; (0)下標
方法2. [] 例: $("#d1")[0].innerHTMl = "hello";
###三 原生對象轉化成jquery對象
$()
例:let d1 = document.getElementById("d1");
$(d1).html("hello");
###四 jquery對象裏循環對象的方法 (遍歷出來的都是數組,須要轉換成jquery)
1. for
2. for of
3. map
4. reduce
5. for in
6. forEach
7. filter
8. jquery each
###五jquery選擇器
例:$("#d1").css("color","red");
atter通常用作普通屬性的設置
prop通常用做特殊屬性的設置
toggleClass:切換
###文檔處理:
#####添加節點:
添加
方法1 父級. append 子級點 添加在父級的後面 例:$("選擇器")("<p>增長節點</p>")
方法2 子級 . appendTo 父級 添加在父級的後面 例:$("<p>增長節點</p>") . appendTo("選擇器")
添加在前面 :$("選擇器") . prepend ("增長的節點")
加到對應的選擇器後面: $("選擇器").before ("增長的節點")
加到對應的選擇器前面: $("選擇器"). after ("增長的節點")
#####包裹節點:
$("選擇器").mrap("<div></div>") 向每一個選擇器加入父節點
$("選擇器").mrapAll("<div></div>") 向整個選擇器加入父節點
$("選擇器").mrapInner("<div></div>") 向每一個選擇器內容加入一個節點
#####修改/替換節點:
方法1:$("選擇器").replaceWidth("節點")
方法2:$("節點").replaceWidth("選擇器")
#####刪除節點;
$("選擇器").remove() 清空全部的內容,包括事件,標籤,內容 //$("選擇器")被刪除
$("選擇器").detach()
$("選擇器").empty() 還剩一個標籤
###操做CSS
一個屬性的書寫格式:$("選擇器").css(backgroundColor:red);
多個屬性的:
$("選擇器").css ({
backgroundColor:red,
border:1px solid red
})
###篩選
prev() 用於篩選前一個同輩元素
prevAll()查找當前元素以前的全部同輩元素
###其餘:
$("選擇器").offset.left/top :相對可視區域 (有2個屬性left/top )
("選擇器").position :返回相對於父元素
width height 設置的寬/高
innerWidth innerHeihgt 還包含padding 和border
outerWidth outerHeight 還包含padding 和border和 margin
###語法糖:on("事件類型",回調函數) 能夠解決全部事件
格式:$("選擇器"). on ("事件類型",function(){
})
事件委託點擊事件:$("父級").delegate("指定哪個子元素作委託","事件",function(){
})
###面試常問的;
on 能夠解決全部事件
bind 如今幾乎不用了,轉向on
live 用來作委託事件,過期了
delegate 用來作委託事件,如今還在用
怎麼在瀏覽器裏寫jquery代碼:
$(window).on("load",function(){
}); 能夠添加多個事件。DOM加載完成,等整個頁面加載完成後執行 儘可能使用這個
而以前的window.oload = function(){} 只能夠添加一個事件
$(document).ready(function(){
}); 頁面加載完成,等DOM加載完成後執行。 可簡寫 (語法糖):$(function(){ }) 這兩個若是一塊兒寫,他們的執行順序是叢書到下的
###鏈式操做
例:$("選擇器").css({
width:100,
height:100,
border:「1px solid red 」
}).atter("title","標題").html("<p>段落</p>") // 1. 鏈式操做的寫法:不換行的寫法
2.普通操做的寫法: $("").atter("name","id")
3.或:let $d1 = $("") //他也是鏈式操做的寫法,換行的寫法。把選擇器先交給一個變 $d1.css() 量,而這個變量名咱們一般給它前面加一個$.
(在篩選的方法中會破壞原有鏈條 .find .end回到最近一次破壞性的操做)
###jquery動畫
show:顯示隱藏的匹配元素
hide:隱藏顯示的元素
toggle:用於綁定兩個或多個事件處理器函數,以響應被選元素的輪流的 click 事件。
若是元素是可見的,切換爲隱藏的;若是元素是隱藏的,切換爲可見的。
slideDown:從下到上
slideUp:從上到下
slideToggle:
###animate 第一個參數是JOSN,第二個參數是時間 (指定一個最終樣式,自動補充)
例:$("").animate({
maginLeft:500, //第一個參數僅限於數字(padding,top...)
opcity:0,
width:0,
color:red
},2000);
$("").animate({
},2000,function(){
$("").stop(true ,false);
} //中止
);
###中止動畫:
.finsh():中止當前正在運行的動畫,刪除全部排隊的動畫,完成最終的狀態。
.stop(參數1,參數2若是不寫默認false)
.stop(true,true) //來到當前狀態
.stop(false,false) //來到當前動畫,執行下一個動畫
.stop(true,false) //停在原地
.stop(false,true) //直接到當前動畫的最終狀態,執行下一個動畫
###性能的優化:
1. 應該老是從ID選擇器開始繼承 例;$("")
2. 儘可能在class前面加元素名 例:("h1.tt")
3. 儘可能使用ID選擇器來替代class選擇器
4. 在適當的時候使用jquery的鏈式操做
5. 將jquery對象緩存起來使用,賦值給一個變量,變量名前加$
例: let $obj = $("");
$obj.css();
$obj.html();
例: let $ps = $("");
for (let i = 0;i<$ps.length;i++){
$ps.eq(i).html();
}
6. 限制直接操做DOM的次數(循環的時候不要append,先用字符串拼裝,而後再一次型添加到節點上)。
7. 儘可能使用事件委託
8. JS代碼儘可能推遲到window.onload事件中進行
9. 使用事件委託時用delegate來替代live
10. 能用子代選擇器就不用後代選擇器。css