iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Modern Web

從新開始學習p5.js畫出一片天系列 第 23

D23_網頁元件的事件操作

  • 分享至 

  • xImage
  •  

網頁元件的事件操作

今天來整理一下在網頁中常見的事件操作的功能

一般除了鍵盤,滑鼠(觸擊)之外,網頁的元件都有提供相對應的事件,讓網頁的功能可以更適時地產生回應的動作,甚至是驅動整個網頁流程的運作。

常見的有 window,document,div,video,audio,canvas,iframe,a(hyper-link),input,button,table,img,這些是主要的網頁元件,雖然元件的種類很多,但是大致上分成2類,第1類是跟使用者操作有關的,像是鍵盤,滑鼠(觸擊,點擊),選擇,輸入等,第2類是跟元件本身的運作有關,像是載入,播放,完成動作,連線等。
這些我們都要以一種系統性地來理解事件運作的原理,這樣當查閱一個元件有哪些事件可以使用,就更可以掌握使用的時機。

首先,先來了解一下,在HTML DOM當中,事件的類型有哪些,當事件產生的時候,可以透過 console.log(event)來查閱是什麼事件,以及提供的事件屬性資料有哪些。
常見的有

事件物件種類 事件產生場合
AnimationEvent For CSS animations CSS 動畫事件
ClipboardEvent For modification of the clipboard 剪貼簿事件
DragEvent For drag and drop interaction 拖拉事件
FocusEvent For focus-related events 聚焦事件
HashChangeEvent For changes in the anchor part of the URL 錨點事件
InputEvent For user input 輸入事件
KeyboardEvent For keyboard interaction 鍵盤事件
MouseEvent For mouse interaction 滑鼠事件
PageTransitionEvent For navigating to, and away from, web pages 網頁切換事件
PopStateEvent For changes in the history entry 網頁造訪歷史事件
ProgressEvent For the progress of loading external resources 外部載入進度事件
StorageEvent For changes in the window's storage area. 儲存資料事件
TouchEvent For touch interaction 觸控事件
TransitionEvent For CSS transitions CSS 轉場事件
UiEvent For user interface interaction UI操事件
WheelEvent For mousewheel interaction 滾輪事件

若是以元件種類來分類的話,有以下類別
Window Event -> body
Form Events -> input
Keyboard Events ->
Mouse Events
Drag Events
Clipboard Events
Media Events
Misc Events

網頁載入事件

由以上可看出,在DOM JS中,document本身並沒有提供事件,

console.log(document);

console.log(document)

基本上,如果要在網頁載入時觸發的事件,寫法如下
第1種寫法

window.onload = (e) => { 
	console.log(e);
	e.preventDefault(); 
	return false; 
};

window.onload

event object: Event
target: document
type: "load"

第2種寫法

<body onload="ready(event)"></body>
<script>
function ready(e){
	console.log(e);
	console.log(e.target); 
	e.stopPropagation(); 
}
</script>

這個onload寫在 body標籤中,若要將事件傳到函式中,
可以用event元件作為參數傳入

<body onload="ready(event, this)"></body>
<script>
function ready(e, a){
	console.log(e);  //-- Event
	console.log(a);  //-- Window 
	console.log(e.target); 
	e.stopPropagation(); 
}
</script>

ready(event, this)

觸發的連動與預防

有時事件觸發時只想觸發自訂的動作,不想引發原本存在於網頁的動作時,可以使用 preventDefault() 指令,
event.preventDefault(); 停止預設事件動作
return false; 也有停止預設事件動作的效果

有時事件觸發時只想觸發作用在本身的元件上,不想連動到上層的元件時,可以使用 stopPropagation() 指令,
event.stopPropagation(); 停止事件向外層傳遞

<div id="d1">
    <div id="d2">
        <div id="d3">Click Me!</div>
    </div>
</div>

<script>
document.querySelector("#d1").onclick = (e) => { 
    console.log(e); 
    console.log(e.target); 
    e.stopPropagation(); 
};
document.querySelector("#d2").onclick = (e) => { 
    console.log(e); 
    console.log(e.target); 
    e.stopPropagation(); 
};
document.querySelector("#d3").onclick = (e) => { 
    console.log(e); 
    console.log(e.target); 
    e.stopPropagation(); 
};
</script>

沒有加 e.stopPropagation(); 時,當click div#d3時,觸發3次事件。
stopPropagation()

加上 e.stopPropagation(); 後,當click div#d3時,就只會觸發1次事件。
stopPropagation()

停止滑鼠右鍵觸發Context Menu

window.oncontextmenu = (e) => { 
	e.preventDefault(); 
	console.log(e);
	return false; 
};

event object: PointerEvent
target: html
type: "contextmenu"

參考資料
HTML DOM Event Objects
https://www.w3schools.com/jsref/obj_events.asp
HTML Event Attributes
https://www.w3schools.com/tags/ref_eventattributes.asp
HTML DOM Events
https://www.w3schools.com/jsref/dom_obj_event.asp
HTML DOM Documents
https://www.w3schools.com/jsref/dom_obj_document.asp


上一篇
D22_事件觸發操作[滑鼠]
下一篇
D24_設定事件操作的方法
系列文
從新開始學習p5.js畫出一片天40
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言