11、JavaScript-事件
每天一句:一個人現在某一個領域達到極致,往往需要一萬小時的積累。現在的你就是需要努力先讓自己成為一個領域的高手,然後去獲取更好的機會。[10時/天 * 30 = 300時/月 * 12 = 3600時/年 * 3 = 10800小時]
元素.style.width: 樣式寬
元素.clientWidth: 可視寬度(樣式寬 + padding)
元素.offsetWidth: 佔位寬(樣式寬 + padding + border)
一、獲取元素CSS大小
- 通過style內聯獲取元素的大小
oBox.style.width // 空
oBox.style.height // 空
注: style只能獲取到內聯style屬性的CSS中的寬度和高度,如果有即獲取到;如果沒有則返回空;
- 通過計算獲取元素的大小
var width = window.getComputedStyle ? getComputedStyle(oBox).width : oBox.currentStyle.width; // width: 100px; => 100px
var height = window.getComputedStyle ? getComputedStyle(oBox).height : oBox.currentStyle.height; // height: 100px; => 100px
注: 通過計算獲取元素的大小,不管是內聯、內部、外部樣式,它都經過計算後得到結果。如果本身設定有大小,即返回元素的大小;如果沒有設定,非IE會返回預設大小,IE返回auto;
二、獲取元素實際大小
- clientWidth和clientHeight 【可視區域大小: width+padding】
獲取元素可視區域的大小,可以得到元素內容以及內邊距的空間大小,即width+padding(height+padding);
oBox.clientWidth; // width: 100px; + padding: 10px; => 120
oBox.clientHeight; // height: 100px; + padding: 10px; => 120
注: 返回元素大小是沒有單位的,預設單位就是px
- offsetWidth和offsetHeight 【實際大小即佔位大小: width + padding + border】
oBox.offsetWidth // width: 100px; + padding: 10px; + border: 5px; => 130
oBox.offsetHeight // height: 100px; + padding: 10px; + border: 5px; => 130
- scrollWidth和scrollHeight 【滾動內容大小】
oBox.scrollWidth // 120
oBox.scrollHeight // 滾動內容的大小
三、獲取元素周邊大小
- clientLeft和clientTop 【元素邊框大小】
oBox.clientLeft // border-left: 5px; => 5
oBox.clientTop // border-top: 5px; => 5
注: 目前只提供left和top,如果四條邊框大小不一,可以通過計算得到;
右邊框: oView.offsetWidth - oView.clientWidth - oView.clientLeft
- offsetLeft和offsetTop 【相對於父元素的位置】
oBox.offsetLeft // left:30 + margin-left:10 => 40
oBox.offsetTop // top:30 + margin-top:10 => 40
注: 獲取元素當前相對於父元素的位置,最好設定有定位position: absolute;否則不同的瀏覽器會有不同的解釋; 加上邊框和邊距不會影響它的位置,但加上外邊界會累加;
四、焦點事件
焦點,使瀏覽器能夠區分使用者輸入的物件,當元素有焦點時,就可以接受使用者的輸入,不是所有元素都能夠接收焦點的,能響應使用者操作的元素才有焦點;
// onfocus: 當元素獲取焦點時觸發
oText.onfocus = function(){
this.value = '';
}
// onblur: 當元素失去焦點時觸發
oText.onblur = function(){
this.value = '請輸入密碼';
}
oText.focus(); // 獲取焦點
oText.blur(); // 獲取焦點
五、事件物件
- event物件
Event物件,當一個事件發生的時,和當前物件發生的相關資訊,都會臨時儲存在這個物件中;
IE/谷歌: event是一個內建全域性物件;
火狐: 事件物件是通過事件函式的第一個引數傳入;
function fn2(ev){
// 相容的寫法
ev = ev || event;
// 遍歷事件物件
for (att in ev){
document.write(att + '=' + ev[att] +'<br/>');
}
}
foo = foo || bar ,這行程式碼是什麼意思?為什麼要這樣寫?
這種寫法稱之為短路表示式
答案:if(!foo) foo = bar; //如果foo存在,值不變,否則把bar的值賦給foo。
- 事件源: 即觸發該事件的節點
IE: event物件只有srcElement屬性,而沒有target屬性;
火狐: event物件只有target屬性,而沒有srcElement屬性;
谷歌/Safari: target和srcElement都可以使用;
oBox.onclick = function(ev){
ev = ev || event;
// 相容的寫法(在此表示的就是oBox物件)
var self = ev.target || ev.srcElement;
alert(ev.srcElement.id);
};
注意: 獲取對應事件源後,最好要判斷型別是否匹配;例如if(self.tagName.toLowerCase() === 'li'){...} ;
- offsetX和offsetY 【滑鼠相對於事件源的位置】
ev.offsetX // 水平方向,距離事件源的左邊位置
ev.offsetY // 垂直方向,距離事件源的頂部位置
- clientX和clientY 【滑鼠相對於瀏覽器頁面的位置】
ev.clientX // 水平方向,距離左邊的位置
ev.clientY // 垂直方向,距離頂部的位置
案例: 跟隨滑鼠移動效果
六、事件型別
- onclick: 單擊事件
- ondbclick: 雙擊事件
- onmousedown: 滑鼠按下事件
- onmouseup: 滑鼠釋放(彈起)事件
- onmousemove: 滑鼠移動事件
- onmouseover: 滑鼠移入事件
- onmouseout: 滑鼠移出事件
- onfocus: 獲取焦點事件
- onblur: 失去焦點事件
注: onclick是滑鼠點選彈起之後觸發的事件,即一次完整的滑鼠點選過程;而onmousedown是滑鼠按下後觸發,無需等待滑鼠釋放;即onclick = onmousedown + onmouseup;
七、事件冒泡
- 事件冒泡
當一個元素接收到事件以後,會將接收到的事件傳遞給父級元素,一直傳遞給頂層window;可以利用事件冒泡,可以減少事件的繫結,有利於效能優化
注意: 事件傳遞給某個元素,並不一會觸發該事件;會不會觸發該事件,和你是否新增該事件有關;
- 阻止事件冒泡
非IE: stopPropagation()
IE: ev.cancelBubble = true;
// 相容寫法
ev.stopPropagation ? ev.stopPropagation() : ev.cancelBubble = true;
案例: 輸入框的提示列表 (事件冒泡的使用)
案例: 下拉選單效果(阻止事件冒泡)
案例: 分享到 效果 (事件冒泡的使用)
案例: 表格的編輯(冒泡的利用-效能優化)
作業: 模擬select控制元件效果
相關文章
- JavaScript-事件迴圈-eventLoopJavaScript事件OOP
- JavaScript-閉包JavaScript
- javascript-函式表示式JavaScript函式
- MDN之JavaScript-高階(二)【Concurrency model and Event Loop併發模型與事件迴圈】JavaScriptOOP模型事件
- 16、JavaScript-正規表示式JavaScript
- 死磕JavaScript-垃圾收集機制JavaScript
- 你不知道的JavaScript-原型JavaScript原型
- 你不知道的JavaScript-提升JavaScript
- JavaScript-快速語法參考-全-JavaScript
- JavaScript-滑鼠獲取頁面座標JavaScript
- 窗體事件 1130事件
- JavaScript學習11:事件入門JavaScript事件
- JavaScript-總結常用程式碼書寫規範JavaScript
- JavaScript-設計模式-物件導向程式設計JavaScript設計模式物件程式設計
- Javascript-判斷是否為陣列的5種方法JavaScript陣列
- 11g rac 等待事件resmgr:cpu quantum事件
- iOS11 UITableViewCell滑動事件改動iOSUIView事件
- 編寫可維護的JavaScript-程式設計風格JavaScript程式設計
- Oracle11g新增事件CLIENTID_OVERWRITEOracle事件client
- oracle11g ddl trace event事件小記Oracle事件
- JavaScript-開發一個簡單的貪吃蛇小遊戲JavaScript遊戲
- 「javaScript-每三位插入一個逗號實現方式」JavaScript
- [譯] 理解非同步 JavaScript-學習JavaScript是怎麼工作的非同步JavaScript
- 放棄Javascript-使用kotlin編寫react前端應用之todoListJavaScriptKotlinReact前端
- 吐槽202401113關於監管特殊停牌炒作股票事件--兼此事件覆盤事件
- [20201117]解析cursor pin S等待事件.txt事件
- oracle 11.1.0.6 版本中的resmgr:cpu quantum 等待事件Oracle事件
- oracle 11.2.0.4 rac叢集等待事件enq: TM - contentionOracle事件ENQ
- 龍蜥社群 11 月運營大事件回顧事件
- Oracle 11g 遇到log file sync嚴重等待事件Oracle事件
- Oracle 11g direct path read 等待事件的理解Oracle事件
- 死磕JavaScript-鬆散型別、js變數儲存模型、變數提升JavaScript型別JS變數模型
- [20140311]等待事件enq HW - contention事件ENQ
- oracle11g_Descriptions of Wait Events_等待事件全列表OracleAI事件
- 11g direct path read 等待事件的實驗分析事件
- 11g direct path read 等待事件的初步探討事件
- 美國駭客發動“9·11”事件網路反擊戰 (轉)事件
- oracle11g_wait event等待事件及潛在原因列表OracleAI事件