一、事件模型
1.瀏覽器事件模型
①DOM0級事件模型:只支持一個DOM事件處理函數(shù)
? <input type="button" onclick="doSomething()"/>
? input.onclick = function() { ... }
? event = event || window.event;
? var target = event.target || event.srcElement;
? …
代碼示例:
<body>
<p id="example" onclick="console.log('Click');console.log('Click2');">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Officiis praesentium, sapiente? Earum, molestiae rem. Enim, perspiciatis quisquam! A consequatur culpa error et, natus nobis placeat qui rem, suscipit tempora tenetur.
</p>
<div id="p1">
<div id="p1-1">
<div id="p1-1-1">
<div id="p1-1-1-1">
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet architecto beatae delectus enim ipsum iusto laborum, libero minus perspiciatis quae quidem rem sed soluta velit veniam voluptatem voluptates voluptatibus. Repudiandae.
</p>
</div>
</div>
</div>
</div>
<script>
document.getElementById('example').onmouseover = function(event) {
event = event || window.event;
console.log('MouseOver: %o', event); //后面的事件會覆蓋前面的
};
document.getElementById('example').onmouseover = function(event) {
console.log('MouseOver2: %o', event);
};
document.getElementById('p1').onclick = function() {
console.log('p1');
};
document.getElementById('p1-1').onclick = function() {
console.log('p1-1');
};
document.getElementById('p1-1-1').onclick = function() {
console.log('p1-1-1');
};
document.getElementById('p1-1-1-1').onclick = function(e) {
console.log('p1-1-1-1');
// e.cancelBubble = true;//阻止事件冒泡
e.stopPropagation();//阻止事件冒泡
};
</script>
</body>
②DOM2級事件模型:事件不會覆蓋
- addEventListener(eventType, listener, useCapture)
useCapture為false時跟DOM0級事件類似啊研,只冒泡不捕獲
為true時:只捕獲扫腺,不冒泡 - attachEvent(eventName, handler)
代碼示例:
<body>
<p id="example">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Officiis praesentium, sapiente? Earum, molestiae rem. Enim, perspiciatis quisquam! A consequatur culpa error et, natus nobis placeat qui rem, suscipit tempora tenetur.
</p>
<div id="p1">
<div id="p1-1">
<div id="p1-1-1">
<div id="p1-1-1-1">
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet architecto beatae delectus enim ipsum iusto laborum, libero minus perspiciatis quae quidem rem sed soluta velit veniam voluptatem voluptates voluptatibus. Repudiandae.
</p>
</div>
</div>
</div>
</div>
<script>
var element = document.getElementById('example');
element.addEventListener('click', function(event) {
console.log('Click1: %o', event);
}, false);
element.addEventListener('click', function(event) {
console.log('Click2: %o', event);
}, false);
element.addEventListener('click', function(event) {
console.log('Click3: %o', event);
}, false);
var useCapture = true;
document.getElementById('p1').addEventListener('click', function() {
console.log('p1');
}, useCapture);
document.getElementById('p1-1').addEventListener('click', function() {
console.log('p1-1');
}, useCapture);
document.getElementById('p1-1-1').addEventListener('click', function() {
console.log('p1-1-1');
}, useCapture);
document.getElementById('p1-1-1-1').addEventListener('click', function() {
console.log('p1-1-1-1');
}, useCapture);
</script>
</body>
2.jQuery事件模型
? 提供了統(tǒng)一的事件處理方法
? 允許添加多個事件處理函數(shù)
? 使用標準的事件名稱(不帶on)
? 事件實例做為事件處理函數(shù)的第一個參數(shù)
? 標準化事件實例最常用的屬性
? 提供了統(tǒng)一的事件取消和阻止默認行為的方法
①添加事件處理
- on(eventType[, selector][, data], handler):在選擇的元素上綁定一個或多個事件
eventType:事件的名稱(多個名稱用空格分隔)
[, selector]:選擇器(事件委托時用到)
[, data]:數(shù)據(jù)(傳遞一些數(shù)據(jù)給事件處理函數(shù)疼燥,從事件event的data屬性中獲燃唷)
handler:事件處理函數(shù) - bind()、delegate() 肠虽、live():過時
②統(tǒng)一方法和屬性
? 阻止冒泡: stopPropagation()
? 阻止默認行為: preventDefault()
? 阻止冒泡和默認行為:return false
③所有支持的事件
? blur
? change
? click
? dblclick
? error
? focus
? focusin
? focusout
? keydown
? keypress
? keyup
? load
? unload
? mousedown
? mouseenter
? mouseleave
? mousemove
? mouseout
? mouseover
? mouseup
? ready
? resize
? scroll
? select
? submit
④一次性的事件處理:只執(zhí)行一次
? one(eventType[, selector][, data], handler)
代碼示例:
<body>
<h2>title</h2>
<div class="item">
<p>Lorem ipsum dolor sit amet.</p>
</div>
<ul>
<li class="item1">新聞標題-1</li>
<li class="item2">新聞標題-2</li>
<li class="item3">新聞標題-3</li>
<li class="item4">新聞標題-4</li>
<li class="item5">新聞標題-5</li>
<li class="item6">新聞標題-6</li>
<li class="item7">新聞標題-7</li>
<li class="item8">新聞標題-8</li>
<li class="item9">新聞標題-9</li>
</ul>
<div id="p1">
<div id="p1-1">
<div id="p1-1-1">
<div id="p1-1-1-1">
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet architecto beatae delectus enim ipsum iusto laborum, libero minus perspiciatis quae quidem rem sed soluta velit veniam voluptatem voluptates voluptatibus. Repudiandae.
</p>
</div>
</div>
</div>
</div>
<script src="../../../vendor/jquery-1.12.4.js"></script>
<script>
$(function() {
// $('p')
// .on('click', null, null, function (e) {
// console.log('p clicked'); //所有的p都綁定了
// })
// .on('click', function (e) {
// console.log('p clicked2');
// })
// .on('click', { foo: 'bar' }, function (e) {
// console.log('p clicked3 %o', e.data);//%o 在控制臺把對象顯示出來
// })
// .on('mouseover', function (e) {
// console.log('p mouseover');
// })
// .on('mouseover', function (e) {
// console.log('p mouseover2');
// })
// .on('click mouseover', function (e) {
// console.log('p click or mouseover');
// })
// $('ul').on('click', 'li.item2', function () {
// console.log('li clicked');
// })
// $('li').on('click', function (e) {
// console.log('Clicked: %o', $(this));
// })
// $('ul').on('click', 'li', function (e) {
// console.log('Clicked: %o', $(e.target));
// })
// $('div').on('click', function () {
// console.log(this.id);
// })
// $('p').on('click', function (e) {
// e.stopPropagation()
// console.log('clicked p');
// })
// $('p').on({
// click: function () {
// console.log('click');
// },
// mouseover: function () {
// console.log('mouseover');
// }
// })
$('p').one('click', function(e) {
console.log('clicked p');
});
});
</script>
</body>
⑤移除事件處理
? off(eventType[, selector][, handler])
? off()
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur assumenda debitis fugiat laboriosam magni modi sequi, sint ullam! Ad consequatur cum excepturi modi nam quos. Dolor est laudantium minima ratione.</p>
<script src="../../../vendor/jquery-1.12.4.js"></script>
<script>
$(function() {
var clicked2 = function(e) {
console.log('clicked2');
};
$('p').on('click', function(e) {
console.log('clicked');
}).on('click', clicked2).on('mouseover', function(e) {
console.log('mouseover');
});
// $('p').off('click') //不帶參數(shù) 移除所有事件處理
// $('p').off('mouseover')
// $('p').off('click mouseover')//移除多個
// $('p').off('click', clicked2)//移除特定的clicked2
});
</script>
</body>
二幔戏、事件實例對象
1.事件實例對象的屬性
altKey
bubbles
button
cancelable
charCode
clientX
clientY
ctrlKey
currentTarget
data
detail
delegateTarget
eventPhase
metaKey
namespace
offsetX
offsetY
originalTarget
originalEvent
pageX
pageY
prevValue
relatedTarget
result
screenX
screenY
shiftKey
target
timeStamp
type
view
which
2.事件實例對象的方法
? preventDefault():阻止瀏覽器默認事件
? stopPropagation():阻止冒泡
? stopImmediatePropagation():立刻阻止事件處理函數(shù)并防止事件冒泡(阻止冒泡還阻止后續(xù)綁定的)
? isDefaultPrevented():對以上三個方法是否調(diào)用的一個檢測,調(diào)用了就返回true
? isPropagationStopped()
? isImmediatePropagationStopped()
代碼示例:
<body>
<div id="p1">
<div id="p1-1">
<div id="p1-1-1">
<div id="p1-1-1-1">
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet architecto beatae delectus enim ipsum iusto laborum, libero minus perspiciatis quae quidem rem sed soluta velit veniam voluptatem voluptates voluptatibus. Repudiandae.
</p>
</div>
</div>
</div>
</div>
<script src="../../../vendor/jquery-1.12.4.js"></script>
<script>
$(function() {
$('div').on('click', function(e) {
console.log('clicked: %o', $(this));
});
$('p').on('click', function(e) {
e.stopPropagation();
console.log('clicked1: p');
console.log(e.isPropagationStopped());
});
$('p').on('click', function(e) {
console.log('clicked2: p');
});
});
</script>
</body>
3.觸發(fā)事件
? trigger(eventType[, data]):主動觸發(fā)事件
? triggerHandler(eventType[, data])
區(qū)別
triggerHandler 相比 trigger:
? 不會觸發(fā)瀏覽器默認事件税课;
? 不會產(chǎn)生事件冒泡闲延;
? 只觸發(fā)jQuery對象集合中第一個元素的事件處理函數(shù);
? 返回的是事件處理函數(shù)的返回值韩玩,而不是jQuery對象垒玲。(所以不能使用鏈式語法)
代碼示例:
<body>
<ul>
<li class="item1">新聞標題-1</li>
<li class="item2">新聞標題-2</li>
<li class="item3">新聞標題-3</li>
<li class="item4">新聞標題-4</li>
<li class="item5">新聞標題-5</li>
<li class="item6">新聞標題-6</li>
<li class="item7">新聞標題-7</li>
<li class="item8">新聞標題-8</li>
<li class="item9">新聞標題-9</li>
</ul>
<button id="all">全部標記為已讀</button>
<script src="../../../vendor/jquery-1.12.4.js"></script>
<script>
$(function() {
$('li').on('click', function(e, arg1, arg2) {
console.log('%o 已讀', $(this));
console.log(arg1);
console.log(arg2);
return $(this);
});
$('#all').on('click', function() {
console.log($('li').trigger('click', [1, 2]));
console.log($('li').triggerHandler('click'));
});
});
</script>
</body>
4.快捷方法
blur
change
click
dblclick
focus
focusin
focusout
keydown
keypress
keyup
mousedown
mouseenter
mouseleave
mousemove
mouseout
mouseover
mouseup
ready
resize
scroll
select
submit
快捷方法的使用
? eventName([data,] handler)
? eventName()
代碼示例:
<body>
<ul>
<li class="item1">新聞標題-1</li>
<li class="item2">新聞標題-2</li>
<li class="item3">新聞標題-3</li>
<li class="item4">新聞標題-4</li>
<li class="item5">新聞標題-5</li>
<li class="item6">新聞標題-6</li>
<li class="item7">新聞標題-7</li>
<li class="item8">新聞標題-8</li>
<li class="item9">新聞標題-9</li>
</ul>
<button id="all">全部標記為已讀</button>
<script src="../../../vendor/jquery-1.12.4.js"></script>
<script>
$(function() {
$('li').click(function(e) {
console.log('%o 已讀', $(this));
});
// $('li').dblclick(function (e) {
// console.log('%o 又讀', $(this));
// })
$('#all').on('click', function() {
console.log($('li').click());
});
});
</script>
</body>
5.hover方法
? hover(enterHandler, leaveHandler)
? hover(handler)
代碼示例:
<head>
<meta charset="UTF-8">
<title>demo</title>
<style>
.outer {
width: 200px;
height: 200px;
padding: 20px;
color: #fff;
background-color: green;
}
.inner {
width: 100px;
height: 100px;
margin: 30px auto;
padding: 20px;
color: #fff;
background-color: orange;
}
#outer2 {
margin-top: 50px;
}
</style>
</head>
<body>
<div class="outer" id="outer1">
Outer 1
<div class="inner" id="inner1">Inner 1</div>
</div>
<div class="outer" id="outer2">
Outer 2
<div class="inner" id="inner2">Inner 2</div>
</div>
<script src="../../../vendor/jquery-1.12.4.js"></script>
<script>
$(function() {
function report(event) {
event.stopPropagation();
console.log(event.type + ' on ' + event.target.id);
}
$('#outer1').on('mouseover mouseout', report);
$('#inner1').on('mouseover mouseout', report);
$('#outer2').hover(report);
$('#inner2').hover(report);
});
</script>
</body>
6.自定義事件
? on(customEvent)
? trigger(customEvent)
<body>
<ul>
<li class="item1">新聞標題-1</li>
<li class="item2">新聞標題-2</li>
<li class="item3">新聞標題-3</li>
<li class="item4">新聞標題-4</li>
<li class="item5">新聞標題-5</li>
<li class="item6">新聞標題-6</li>
<li class="item7">新聞標題-7</li>
<li class="item8">新聞標題-8</li>
<li class="item9">新聞標題-9</li>
</ul>
<button id="all">全部標記為已讀</button>
<script src="../../../vendor/jquery-1.12.4.js"></script>
<script>
$(function() {
$('li').on('markAsRead', function(e) {
console.log('%o 已讀', $(this));
});
$('li').on('click', function(e) {
$(this).trigger('markAsRead');
});
$('#all').on('click', function() {
$('li').trigger('markAsRead');
});
});
</script>
</body>
7.事件命名空間
? eventName.namespace
<body>
<ul>
<li class="item1">新聞標題-1</li>
<li class="item2">新聞標題-2</li>
<li class="item3">新聞標題-3</li>
<li class="item4">新聞標題-4</li>
<li class="item5">新聞標題-5</li>
<li class="item6">新聞標題-6</li>
<li class="item7">新聞標題-7</li>
<li class="item8">新聞標題-8</li>
<li class="item9">新聞標題-9</li>
</ul>
<button id="even">點擊偶數(shù)</button>
<button id="odd">點擊奇數(shù)</button>
<button id="all">全部點擊</button>
<script src="../../../vendor/jquery-1.12.4.js"></script>
<script>
$(function() {
$('li:odd').on('click.even', function(e) {
console.log('%o 偶數(shù)', $(this));
});
$('li').eq(0).on('click.even.0', function(e) {
console.log('%o 0', $(this));
});
$('li:even').on('click.odd', function(e) {
console.log('%o 奇數(shù)', $(this));
});
$('#even').on('click', function() {
$('li').trigger('click.even');
});
$('#odd').on('click', function() {
$('li').trigger('click.odd');
});
$('#all').on('click', function() {
// $('li').trigger('click');
$('li').trigger('click.even.0');
});
// $('li').off('.even')
});
</script>
</body>