HTML
<body>
<input type="button" class="btn" value="點擊">
<script src="index.js"></script>
</body>
JavaScript
var el = document.querySelector('.btn');
el.onclick = function (event){
console.log(event);
}
事件的物件中包含
target
觸發到的DOM目標物件
e.target
e.target.nodeName
目標的Tage.target.value
目標的內容值screenX
、screenY
滑鼠觸發座標,相對於螢幕最左上角,不受滾動影響clientX
、clientY
滑鼠觸發座標,相對於瀏覽器左上角,不受滾動影響pageX
、pageY
滑鼠觸發座標,相對於檔案文件最左上角,受滾動影響offsetX
、offsetY
滑鼠觸發座標,相對於被觸發的DOM元件
layerx
、layerY
與offset同(火狐版)altKey
、ctrlKey
是否同時按下Alt / Ctrl鍵最老式的寫法,容易被攻擊、在onClick
中被插入惡意程式碼
HTML
<body>
<input onclick="alert('我被點擊了!!');" type="button" value="點擊">
<script src="index.js"></script>
</body>
或者將function拿到JS當中
HTML
<body>
<input onclick="sayHello();" type="button" class="btn" value="點擊">
<script src="index.js"></script>
</body>
JavaScript
function sayHello(){
alert("Hello");
}
可用程式控制綁定時機
不能同時綁定多個事件在同一個物件上(後面的程式碼會蓋過前面)
HTML
<input type="button" class="btn" value="點擊">
<script src="index.js"></script>
JavaScript
var btn = document.querySelector('.btn');
btn.onclick = function (){ // onclick 全部小寫
alert("~~~~");
}
btn.onclick = function (){ // onclick 全部小寫
alert("!!!!");
}
較新的寫法
可同時綁定多個事件在同一個物件上
JavaScript
var btn = document.querySelector('.btn');
// 選擇事件的參數 'click'、不是onClick
btn.addEventListener('click', function (){
alert("監聽中-1");
})
btn.addEventListener('click', function (){
alert("監聽中-2");
})
第三個參數options
(預設為false
)false
事件氣泡(event bubbling) 按DOM節點從指定元素開始往外找true
事件捕捉(event capture) 按DOM節點從最外層開始往內找
綁定事件到btn及body上,
點擊btn時會同時觸發btn、body事件
HTML
<body style="border: 5px solid black;height: 100vw">
<input type="button" class="btn" value="點擊">
<script src="index.js"></script>
</body>
JavaScript
var btn = document.querySelector('.btn');
var body= document.querySelector('body');
btn.addEventListener('click', function (){
alert("監聽btn");
},false)
body.addEventListener('click', function (){
alert("監聽body");
},false)
觸發btn後就阻止其他事件發生,防止一鍵觸發太多事件
阻止當前事件繼續進行捕捉(capturing)及冒泡(bubbling)階段的傳遞。
JavaScript
var btn = document.querySelector('.btn');
var body= document.querySelector('body');
btn.addEventListener('click', function (e){
e.stopPropagation()
alert("監聽btn");
},false)
body.addEventListener('click', function (e){
alert("監聽body");
},false)
取消預設的<a>連結
跳轉sumbit
先透過JS查詢表單有無錯誤,再判斷送出。而非直接送出到後端。
HTML
<body>
<a id="link1" href="https://google.com">我是Google連結</a>
<a id="link2" href="#" style="margin-top: 1800px;display: block;">我是#連結</a>
<script src="index.js"></script>
</body>
JavaScript
var el1 = document.querySelector('#link1');
var el2 = document.querySelector('#link2');
el1.addEventListener('click', function (e){
// 取消元素的默認行為,原本會跳到google網址
e.preventDefault()
console.log("取消元素的默認行為,原本會跳到google網址")
})
el2.addEventListener('click', function (e){
// 取消元素的默認行為,原本會跳到最首頁(#處)
e.preventDefault()
console.log("取消元素的默認行為,原本會跳到最首頁(#處)")
})
.addEventListener('change',func,false);
HTML
<body>
<select id="level">
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
<option value="D">D</option>
</select>
<ul class="list"></ul>
<script src="index.js"></script>
</body>
JavaScript
document.getElementById("level").selectedIndex = -1; // 一開始讓Select處於未選狀態
var level = document.getElementById('level');
var list = document.querySelector('.list');
var students = [
{name: 'Jason', level: 'A',},
{name: 'Tom', level: 'B',},
{name: 'Bob', level: 'B',},
{name: 'Amber', level: 'A',},
{name: 'Fenix', level: 'D'},
{name: "York", level: "C",},
{name: "Milly", level: "D",},
]
level.addEventListener('change', updateList, false);
function updateList(e) {
var select = e.target.value;
var str = '';
for (var i = 0; i < students.length; i++) {
if (select === students[i].level) {
str += '<li>' + students[i].name + '</li>';
}
list.innerHTML = str;
}
}