最初浏览器有两种截然相反的事件处理规则:事件捕获和事件冒泡,对于一组有父子关系的元素,事件处理的顺序规则决定了哪个元素先响应事件,最终w3c统一了一个标准:
事件处理被分为捕获阶段和冒泡阶段。单击div,从document开始捕获,然后向上冒泡。开发者可以通过element.addEventListener()
的参数进行在捕获阶段还是冒泡阶段响应事件,但通常应该使用事件冒泡。
<body>
<button id="btn" onclick="btn_click()">click</button>
<script>
function btn_click()
{
alert("hello");
}
</script>
</body>
<body>
<button id="btn">click</button>
<script>
var btn_click = function()
{
alert("hello");
};
document.querySelector("#btn").onclick = btn_click;
</script>
</body>
<body>
<button id="btn">click</button>
<script>
var btn_click = function()
{
alert("hello");
};
document.querySelector("#btn").addEventListener("click", btn_click, false);
</script>
</body>
第三种功能最强大,可以指定捕获顺序(通常为冒泡),还可以使用removeEventListener()
删除事件处理函数绑定(参数和add相同)。
上述三种事件处理方式,都会传入event对象到事件处理函数中,event对象的常用属性和方法:
注:我测试的时候,clientX/clientY和pageX/pageY在firefox和chrome中都是相同值,都是相对于页面的。
我们经常利用ctrl+单击的方式多选,实际上javascript中也可以捕获这种事件,鼠标+功能组合键:
注:实际上以上三个属性大部分都在用户输入文本时用到,除此之外游戏时也会用到
HTML5中定义了几种新的事件类型。
实现右键菜单例子:
<body>
<div id="my_div" style="width: 640px; height: 480px; background-color: red"></div>
<div id="my_menu" style="visibility: hidden; background-color: green; position: absolute">
<ul>
<li>li1</li>
<li>li2</li>
<li>li3</li>
<li>li4</li>
</ul>
</div>
<script>
var div = document.querySelector("#my_div");
var menu = document.querySelector("#my_menu");
var show_menu = function(event)
{
event.preventDefault();
menu.style.left = event.clientX + "px";
menu.style.top = event.clientY + "px";
menu.style.visibility = "visible";
};
var hide_menu = function(event)
{
menu.style.visibility = "hidden";
};
div.addEventListener("click", hide_menu, false);
div.addEventListener("contextmenu", show_menu, false);
</script>
</body>
页面卸载之前触发,可以对用户弹个框,询问是否真的退出。
页面状态改变,页面状态: