使用JavaScript操作DOM節(jié)點事件的具體方案
一、核心:事件綁定的 3 種方式(推薦第 3 種)
事件綁定是操作 DOM 事件的基礎(chǔ),核心是「給 DOM 節(jié)點關(guān)聯(lián)一個觸發(fā)后執(zhí)行的函數(shù)」,以下是從易到難、從舊到新的 3 種方式:
1. 行內(nèi)綁定(最原始,不推薦)
直接在 HTML 標簽里寫on+事件名,把 JS 代碼寫在標簽里,耦合性高,不利于維護。
<!-- 行內(nèi)綁定點擊事件 -->
<button onclick="alert('點擊了按鈕')">按鈕1</button>
<!-- 也可以調(diào)用外部函數(shù) -->
<button onclick="handleClick()">按鈕2</button>
<script>
function handleClick() {
console.log('按鈕2被點擊');
}
</script>
2. DOM 屬性綁定(簡單,但有缺陷)
通過 JS 給 DOM 節(jié)點的on+事件名屬性賦值,缺點是一個事件只能綁定一個處理函數(shù)(后綁定的會覆蓋前一個)。
<button id="btn3">按鈕3</button>
<script>
const btn3 = document.getElementById('btn3');
// 綁定點擊事件
btn3.onclick = function() {
console.log('第一次綁定的點擊事件');
};
// 后綁定的會覆蓋前一個
btn3.onclick = function() {
console.log('第二次綁定的點擊事件(覆蓋了之前的)');
};
</script>
3. addEventListener(推薦,標準方式)
這是 W3C 標準的事件綁定方式,支持一個事件綁定多個處理函數(shù),還能控制事件傳播方式,是開發(fā)中最常用的。語法:dom節(jié)點.addEventListener(事件名, 處理函數(shù), 可選參數(shù));
- 事件名:不帶
on(比如click而非onclick); - 處理函數(shù):觸發(fā)事件后執(zhí)行的函數(shù);
- 可選參數(shù):布爾值(
false= 冒泡階段觸發(fā),默認;true= 捕獲階段觸發(fā)),或配置對象。
<button id="btn4">按鈕4</button>
<script>
const btn4 = document.getElementById('btn4');
// 綁定第一個點擊事件
btn4.addEventListener('click', function() {
console.log('點擊事件1');
});
// 綁定第二個點擊事件(不會覆蓋,會依次執(zhí)行)
btn4.addEventListener('click', function() {
console.log('點擊事件2');
});
// 也可以綁定其他事件(如鼠標移入、移出)
btn4.addEventListener('mouseenter', function() {
btn4.style.backgroundColor = 'pink';
});
btn4.addEventListener('mouseleave', function() {
btn4.style.backgroundColor = '';
});
</script>
二、事件解綁:移除已綁定的事件
綁定的事件如果不再需要,要及時解綁,避免內(nèi)存泄漏,不同綁定方式的解綁方法不同:
1. 解綁 DOM 屬性綁定的事件
直接把on+事件名賦值為null即可:
const btn3 = document.getElementById('btn3');
btn3.onclick = null; // 解綁點擊事件
2. 解綁 addEventListener 綁定的事件
注意:必須使用「綁定時候的同一個函數(shù)引用」(匿名函數(shù)無法解綁)!
<button id="btn5">按鈕5</button>
<script>
const btn5 = document.getElementById('btn5');
// 先定義具名函數(shù)(不能用匿名函數(shù))
function handleBtn5Click() {
console.log('按鈕5被點擊');
}
// 綁定事件
btn5.addEventListener('click', handleBtn5Click);
// 解綁事件(用同一個函數(shù))
btn5.removeEventListener('click', handleBtn5Click);
</script>
三、事件對象:獲取事件的詳細信息
事件處理函數(shù)會自動接收一個「事件對象(通常命名為e/evt)」,里面包含觸發(fā)事件的所有信息(比如點擊位置、觸發(fā)元素、是否按了快捷鍵等),是開發(fā)的核心工具。
<button id="btn6">按鈕6</button>
<div id="box" style="width: 200px; height: 200px; background: #eee;"></div>
<script>
// 1. 點擊按鈕:獲取事件信息
const btn6 = document.getElementById('btn6');
btn6.addEventListener('click', function(e) {
console.log('觸發(fā)事件的元素:', e.target); // 觸發(fā)事件的DOM節(jié)點(按鈕本身)
console.log('點擊的坐標(相對于頁面):', e.pageX, e.pageY);
console.log('是否按了Ctrl鍵:', e.ctrlKey);
});
// 2. 常用:阻止默認行為(比如阻止a標簽跳轉(zhuǎn)、表單提交)
const a = document.createElement('a');
a.;
a.textContent = '百度鏈接(點了不跳轉(zhuǎn))';
document.body.appendChild(a);
a.addEventListener('click', function(e) {
e.preventDefault(); // 阻止默認行為(跳轉(zhuǎn))
console.log('點擊了鏈接,但沒跳轉(zhuǎn)');
});
// 3. 常用:阻止事件冒泡(避免父元素觸發(fā)相同事件)
const box = document.getElementById('box');
box.addEventListener('click', function() {
console.log('點擊了div');
});
btn6.addEventListener('click', function(e) {
e.stopPropagation(); // 阻止事件冒泡到div
console.log('點擊了按鈕,不會觸發(fā)div的點擊事件');
});
</script>
四、常用場景示例
1. 點擊按鈕切換元素樣式
<p id="text">Hello DOM</p>
<button id="toggleBtn">切換樣式</button>
<script>
const text = document.getElementById('text');
const toggleBtn = document.getElementById('toggleBtn');
toggleBtn.addEventListener('click', function() {
text.classList.toggle('active'); // 切換active類
});
</script>
<style>
.active {
color: red;
font-size: 20px;
font-weight: bold;
}
</style>
2. 輸入框?qū)崟r監(jiān)聽輸入內(nèi)容
<input type="text" id="input" placeholder="輸入內(nèi)容...">
<p id="preview"></p>
<script>
const input = document.getElementById('input');
const preview = document.getElementById('preview');
// 監(jiān)聽輸入事件(input)
input.addEventListener('input', function(e) {
preview.textContent = `你輸入了:${e.target.value}`;
});
</script>
總結(jié)
- 事件綁定優(yōu)先用
addEventListener:支持多函數(shù)綁定,功能更全; - 事件對象是核心:通過
e.target找觸發(fā)元素、e.preventDefault()阻止默認行為、e.stopPropagation()阻止冒泡; - 解綁事件要注意:
addEventListener綁定的事件必須用具名函數(shù)才能解綁,避免內(nèi)存泄漏。
以上就是使用JavaScript操作DOM節(jié)點事件的具體方案的詳細內(nèi)容,更多關(guān)于JavaScript操作DOM節(jié)點事件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript實現(xiàn)鼠標拖拽調(diào)整div大小
這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)鼠標拖拽調(diào)整div大小,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-03-03
JavaScript 自動分號插入(JavaScript synat:auto semicolon insertion)
今天在看《Extjs中文手冊》的時候,寫了四五行樣例代碼,結(jié)果IE和Firefox一直報錯不通過。2009-11-11

