JavaScript學習記錄十
總結繫結事件的區別: * addEventListener(); * attachEvent() * * 相同點: 都可以為元素繫結事件 * 不同點: * 1.方法名不一樣 * 2.引數個數不一樣addEventListener三個引數,attachEvent兩個引數 * 3.addEventListener 谷歌,火狐,IE11支援,IE8不支援 * attachEvent 谷歌火狐不支援,IE11不支援,IE8支援 * 4.this不同,addEventListener 中的this是當前繫結事件的物件 * attachEvent中的this是window * 5.addEventListener中事件的型別(事件的名字)沒有on * attachEvent中的事件的型別(事件的名字)有on
解綁事件: /* * 注意:用什麼方式繫結事件,就應該用對應的方式解綁事件 * 1.解綁事件 * 物件.on事件名字=事件處理函式--->繫結事件 * 物件.on事件名字=null; * 2.解綁事件 * 物件.addEventListener("沒有on的事件型別",命名函式,false);---繫結事件 * 物件.removeEventListener("沒有on的事件型別",函式名字,false); * 3.解綁事件 * 物件.attachEvent("on事件型別",命名函式);---繫結事件 * 物件.detachEvent("on事件型別",函式名字);
案例: 繫結和解綁相容的封裝
//繫結事件的相容 function addEventListener(element,type,fn) { if(element.addEventListener){ element.addEventListener(type,fn,false); }else if(element.attachEvent){ element.attachEvent("on"+type,fn); }else{ element["on"+type]=fn; } } //解綁事件的相容 //為任意的一個元素,解綁對應的事件 function removeEventListener(element,type,fnName) { if(element.removeEventListener){ element.removeEventListener(type,fnName,false); }else if(element.detachEvent){ element.detachEvent("on"+type,fnName); }else{ element["on"+type]=null; } }
事件冒泡:多個元素巢狀,有層次關係,這些元素都註冊了相同的事件,如果裡面的元素的事件觸發了,
外面的元素的該事件自動的觸發了.
//事件冒泡,阻止事件冒泡, //如何阻止事件冒泡: window.event.cancelBubble=true; IE特有的,谷歌支援,火狐不支援
// e.stopPropagation(); 谷歌和火狐支援,
<div id="dv1">
<div id="dv2">
<div id="dv3"></div>
</div>
</div>
my$("dv1").onclick=function () {
console.log(this.id);
};
my$("dv2").onclick=function () {
console.log(this.id);
//window.event.cancelBubble=true;
};
//事件處理引數物件
my$("dv3").onclick=function (e) {
console.log(this.id);
//阻止事件冒泡
//e.stopPropagation();
console.log(e);
};
事件有三個階段: /* *可以理解為警察抓小偷,小偷藏在最裡邊的房間,警察的捕獲是由外向裡的。 * 1.事件捕獲階段 :從外向內 * 2.事件目標階段 :最開始選擇的那個 * 3.事件冒泡階段 : 從裡向外 * * 為元素繫結事件 * addEventListener("沒有on的事件型別",事件處理函式,控制事件階段的) * 事件觸發的過程中,可能會出現事件冒泡的效果,為了阻止事件冒泡---> * window.event.cancelBubble=true;谷歌,IE8支援,火狐不支援 * window.event就是一個物件,是IE中的標準 * e.stopPropagation();阻止事件冒泡---->谷歌和火狐支援 * window.event和e都是事件引數物件,一個是IE的標準,一個是火狐的標準 * 事件引數e在IE8的瀏覽器中是不存在,此時用window.event來代替 * addEventListener中第三個引數是控制事件階段的 * 事件的階段有三個: * 通過e.eventPhase這個屬性可以知道當前的事件是什麼階段你的 * 如果這個屬性的值是: * 1---->捕獲階段 * 2---->目標階段 * 3---->冒泡 * 一般預設都是冒泡階段,很少用捕獲階段 * 冒泡階段:從裡向外 * 捕獲階段:從外向內
<div id="dv1">
<div id="dv2">
<div id="dv3"></div>
</div>
</div>
<script src="common.js"></script>
<script>
//事件冒泡:是從裡向外
//同時註冊點選事件
var objs = [my$("dv3"), my$("dv2"), my$("dv1")];
//遍歷註冊事件
objs.forEach(function (ele) {
//為每個元素繫結事件
ele.addEventListener("click", function (e) {
console.log(this.id+"====>"+e.eventPhase);
}, true);
↑ 注意這個值:true表示捕獲階段的查詢 | false表示冒泡階段的查詢
案例:為同一個元素繫結多個不同的事件,指向相同的事件處理函式
<input type="button" value="小蘇" id="btn"/>
<script src="common.js"></script>
<script>
//為同一個元素繫結多個不同的事件,指向相同的事件處理函式
my$("btn").onclick = f1;
my$("btn").onmouseover = f1;
my$("btn").onmouseout = f1;
function f1(e) {
switch (e.type) {
case "click":
alert("好帥哦");
break;
case "mouseover":
this.style.backgroundColor = "red";
break;
case "mouseout":
this.style.backgroundColor = "green";
break;
}
}
案例:搜尋框的實現
<div id="box">
<input type="text" id="txt" value="">
<input type="button" value="搜尋" id="btn">
</div>
<script src="common.js"></script>
<script>
var keyWords = ["qingqing", "qinqin", "qingqin", "qinqing", "abcd", "bcc", "def", "abc"];
//獲取文字框註冊鍵盤擡起事件
my$("txt").onkeyup = function () {
//每一次的鍵盤擡起都判斷頁面中有沒有這個div
if(my$("dv")){
//刪除一次
my$("box").removeChild(my$("dv"));
}
//獲取文字框輸入的內容
var text = this.value;
//臨時陣列--空陣列------->存放對應上的資料
var tempArr = [];
//把文字框輸入的內容和陣列中的每個資料對比
for (var i = 0; i < keyWords.length; i++) {
//是否是最開始出現的
if (keyWords[i].indexOf(text) == 0) {
tempArr.push(keyWords[i]);//追加
}
}
//如果文字框是空的,臨時陣列是空的,不用建立div
if (this.value.length == 0 || tempArr.length == 0) {
//如果頁面中有這個div,刪除這個div
if (my$("dv")) {
my$("box").removeChild(my$("dv"));
}
return;
}
//建立div,把div加入id為box的div中
var dvObj = document.createElement("div");
my$("box").appendChild(dvObj);
dvObj.id = "dv";
dvObj.style.width = "350px";
//dvObj.style.height="100px";//肯定是不需要的------
dvObj.style.border = "1px solid green";
//迴圈遍歷臨時陣列,建立對應的p標籤
for (var i = 0; i < tempArr.length; i++) {
//建立p標籤
var pObj = document.createElement("p");
//把p加到div中
dvObj.appendChild(pObj);
setInnerText(pObj, tempArr[i]);
pObj.style.margin = 0;
pObj.style.padding = 0;
pObj.style.cursor = "pointer";
pObj.style.marginTop = "5px";
pObj.style.marginLeft = "5px";
//滑鼠進入
pObj.onmouseover = function () {
this.style.backgroundColor = "yellow";
};
//滑鼠離開
pObj.onmouseout = function () {
this.style.backgroundColor = "";
};
}
JavaScript分三個部分: * 1. ECMAScript標準---基本語法 * 2. DOM--->Document Object Model 文件物件模型,操作頁面元素的 * 3. BOM--->Browser Object Model 瀏覽器物件模型,操作瀏覽器的 * * 瀏覽器中有個頂級物件:window---- * 頁面中頂級物件:document----- * 頁面中所有的內容都是屬於瀏覽器的,頁面中的內容也都是window的
var num=100;
console.log(window.num);
function f1() {
console.log("小蘇我也從了");
}
window.f1();
//因為頁面中的所有內容都是window的,window是可以省略的.
window.document.write("哈哈");
var name="您好";
console.log(window.name);
console.log(top);和下邊的效果相同
console.log(window); 注:可以通過這種方式,來檢視物件的方法和屬性
系統的對話方塊
//window.alert("您好啊");//以後不用,測試的時候使用 //window.prompt("請輸入帳號"); //var result=window.confirm("您確定退出嗎");
頁面載入
//頁面載入的時候,按鈕還沒出現,頁面沒有載入完畢
window.onload=function () {
document.getElementById("btn").onclick=function () {
alert("您好");
};
};
onload=function () {
document.getElementById("btn").onclick=function () {
alert("您好");
};
};
//擴充套件的事件---頁面關閉後才觸發的事件 注:谷歌瀏覽器不支援 IE8可以看到效果
window.onunload=function () {};
//擴充套件事件---頁面關閉之前觸發的 注:區別在於彈框的時機
window.onbeforeunload=function () {
alert("哈哈");
};
location物件 *console.log(window.location);通過這種方式檢視屬性方法
//位址列上#及後面的內容
console.log(window.location.hash);
//主機名及埠號
console.log(window.location.host);
//主機名
console.log(window.location.hostname);
//檔案的路徑---相對路徑
console.log(window.location.pathname);
//埠號
console.log(window.location.port);
//協議
console.log(window.location.protocol);
//搜尋的內容
console.log(window.location.search);
onload=function () {
document.getElementById("btn").onclick=function () {
//設定跳轉的頁面的地址
location.href="http://www.jd.com";屬性----------------->必須記住
location.assign("http://www.jd.com");方法 和上邊那個同樣可以實現頁面的跳轉,一模一樣
location.reload();//重新載入--重新整理
location.replace("http://www.jd.com");沒有歷史記錄,瀏覽器上沒有那個回退的箭頭
history物件
*根據history可以向前向後跳轉
<input type="button" value="跳過去" id="btn1"/>
<input type="button" value="前進" id="btn2"/>
<script src="common.js"></script>
<script>
//跳轉的
my$("btn1").onclick = function () {
window.location.href = "15test.html";
};
//前進
my$("btn2").onclick = function () {
window.history.forward();
};
navigator物件
*問題:我的電腦是64位的為什麼查詢所得的是32位的
*瀏覽器廠商自定義的,不同的瀏覽器可能有不同的區別,儘量不要通過這種方式來確定平臺的位數
//通過userAgent可以判斷使用者瀏覽器的型別
console.log(window.navigator.userAgent);Mozilla/5.0 (Windows NT 6.1; Win64;
//通過platform可以判斷瀏覽器所在的系統平臺型別.
console.log(window.navigator.platform);Win32
BOM中有兩個定時器---計時器
<input type="button" value="停止" id="btn"/>
<script>
var timeId = setInterval(function () {
alert("hello");//斷言
}, 1000);
document.getElementById("btn").onclick = function () {
//點選按鈕,停止定時器
//引數:要清理的定時的id的值
window.clearInterval(timeId);
};
案例:圖示的動態顯示
<input type="button" value="搖起來" id="btn1"/>
<input type="button" value="停止" id="btn2"/>
<div id="dv">
<img src="images/heihei.jpg" alt=""/>
<img src="images/lyml.jpg" alt=""/>
</div>
<script src="common.js"></script>
<script>
//點選按鈕搖起來
var timeId="";
my$("btn1").onclick = function () {
timeId= setInterval(function () {
//隨機數
var x = parseInt(Math.random() * 100 + 1);
var y = parseInt(Math.random() * 100 + 1);
//設定元素的left和top屬性值
my$("dv").style.left = x + "px";
my$("dv").style.top = y + "px";
}, 10);
};
my$("btn2").onclick=function () {
clearInterval(timeId);
};
案例:小星星
<input type="button" value="亮起來" id="btn"/>
<div id="dv"></div>
<script src="common.js"></script>
<script>
my$("btn").onclick=function () {
setInterval(function () {
my$("dv").innerHTML="<span>★</span>";
var x = parseInt(Math.random() * 600 + 1);
var y = parseInt(Math.random() * 600 + 1);
my$("dv").firstElementChild.style.left=x+"px";
my$("dv").firstElementChild.style.top=y+"px";
},5);
};
</script>
案例:動態圖片的顯示
function f1() {
//獲取當前時間
var dt = new Date();
//獲取小時
var hour = dt.getHours();
//獲取秒
var second = dt.getSeconds();
hour = hour < 10 ? "0" + hour : hour;
second = second < 10 ? "0" + second : second;
my$("im").src="meimei/"+hour+"_"+second+".jpg";
}
f1();
//頁面載入完畢後,過了1秒才執行函式的程式碼
setInterval(f1,1000);