JavaScript常见事件对象与操作实例总结(2)

<script type="text/javascript"> var btn = document.getElementById("myBtn"); btn.onclick = function (event) { console.log("Clicked"); event.stopPropagation(); }; document.body.onclick = function (event) { console.log("Body clicked"); }; </script>

eventPhase 属性,可以确定事件当前正处于事件流的哪一个阶段:

<script type="text/javascript"> var btn = document.getElementById("myBtn"); btn.onclick = function (event) { console.log(event.eventPhase);//2 }; document.body.addEventListener("click", function (event) { console.log(event.eventPhase);//1 }, true);//true 表示捕获阶段 document.body.onclick = function (event) { console.log(event.eventPhase);//3 }; </script>

注意: 只有在事件处理程序执行期间,event 对象才会存在;一旦事件处理程序执行结束,event 对象就会被销毁!

2 IE 中的事件对象

在使用 DOM0 级方法添加事件处理程序时,event 对象是作为 window 对象的一个属性存在:

var btn = document.getElementById("myBtn"); btn.onclick = function () { var event = window.event; console.log(event.type);//"click" };

如果是通过 HTML 属性指定的事件处理程序,也跟 DOM一样,可以通过 event 变量来访问 event 对象。

IE 的 event 对象也包含着创建它的特定事件相关的属性和方法,所以可能每个特定事件都有自己所特有的属性和方法,不过所有事件都会有这些属性和方法:

属性 类型 读/写 说明
cancelBubble   Boolean   读/写   默认值为 false,true 表示可以取消事件冒泡(同 DOM 的 stopPropagation() )。  
returnValue   Boolean   读/写   默认值为 true,false 表示取消事件默认行为(同 DOM 的 preventDefault() )。  
srcElement   Element   只读   事件的目标(同 DOM 中的 target)。  
type   String   只读   被触发的事件类型。  

因为事件处理程序的作用域是根据它指定的方式来确定的,所以最好是使用 event.srcElement 来得到事件的目标比较靠谱:

<button>点我</button> <script type="text/javascript"> var btn = document.getElementById("myBtn"); btn.onclick = function () { console.log(window.event.srcElement === this);//true }; btn.attachEvent("onclick", function (event) { console.log(event.srcElement === this);//false }); </script>

将 returnValue 设置为 false,就能阻止默认行为:

<a href="https://www.jb51.net/163.com" >点我</a> <script type="text/javascript"> var link = document.getElementById("myLink"); link.onclick = function () { window.event.returnValue = false; } </script>

与 DOM 不同的是,这里没有办法确定事件是否能被取消。

因为 IE 不支持事件捕获,所以只能取消事件冒泡:

<script type="text/javascript"> var btn = document.getElementById("myBtn"); btn.onclick = function () { console.log("Clicked"); window.event.cancelBubble = true; }; document.body.onclick = function (event) { console.log("Body clicked"); }; </script>

3 跨浏览器的事件对象

我们把之前的 EventUtil 对象进行增强:

var EventUtil = { ... /** * 返回对 event 对象的引用 * @param event * @returns {*} */ getEvent: function (event) { return event ? event : window.event; }, /** * 返回事件的目标 * @param event * @returns {*|elem|Object} */ getTarget: function (event) { return event.target || event.srcElement; }, /** * 取消事件默认行为 * @param event */ preventDefault: function (event) { if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } }, /** * 阻止事件流 * @param event */ stopPropagation: function (event) { if (event.stopPropagation) { event.stopPropagation(); } else { event.cancelBubble = true; } } }

这样使用:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/b322c9ffc7ec89a7ada3f34c985c84ea.html