项目过程中会使用到用户触发了一个事件,需要对另外一个元素同样进行触发相应的事件然后执行相应的代码,jquery中就可以通过trigger实现
trigger API
今天想了一下,如果没有jq,那用js是怎么实现的呢?最近第二次看《javascript高级程序设计》这边书又有了一些收获。
如果是实现触发click事件,第一印象肯定是直接element.click(); 就可以了,那触发dbclick、mouseleave、focus 、mouseenter等事件是不是也可以直接element.mouseleave()呢?
于是执行了一下发现,报错了!没错并不是简单的加个element.eventType()这样就可以直接触发相应的事件了。
于是自然想到到createEvent initEvent dispatchEvent 这些方法了。
// 创建一个事件对象,就好像你绑定事件回调函数里获得的那个事件对象一样
var myEvent = document.createEvent('Event')
// 初始化这个事件对象,为它提高需要的“特性”
myEvent.initEvent('myEventName', true, true)
// 按照常见的方式绑定对该事件的监听,这里的 element 可以是任何一个元素,你懂的
element.addEventListener('myEventName', function(evt) {
// 这里,evt 就是你创建的事件对象了,不过它会更丰富一些——这些是浏览器为你做的
})
// 然后这样触发它
element.dispatchEvent(myEvent)
直接上代码:(试了下不兼容 <= IE8 )
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="utf-8" />
<title>原生javascript防jquery的trigger触发鼠标事件</title>
<meta name="author" content="" />
<style>
.div{height:40px;width:100px;background:#ccc;}
</style>
</head>
<body>
<h2>我是H2</h2>
<div class="div">点击div</div>
</body>
</html>
<script>
var h2 = document.querySelector("h2");
var div = document.querySelector(".div");
h2.onclick = function(event){
var ev = event || window.event;
console.log(ev.type);
}
h2.ondbclick = function(event){
var ev = event || window.event;
console.log(ev.type);
}
h2.onmouseenter = function(event){
var ev = event || window.event;
console.log(ev.type);
}
h2.onmouseleave = function(event){
var ev = event || window.event;
console.log(ev.type);
}
h2.onfocus = function(event){
var ev = event || window.event;
console.log(ev.type);
}
h2.onblur = function(event){
var ev = event || window.event;
console.log(ev.type);
}
//触发事件方法
function trigger(elem, event){
var myEvent = document.createEvent('Event')
// 初始化这个事件对象,为它提高需要的“特性”
myEvent.initEvent(event, true, true);
//执行事件
elem.dispatchEvent(myEvent);
}
div.onclick = function(){
trigger(h2, "click"); //触发click事件
trigger(h2, "dbclick"); //触发dbclick事件
trigger(h2, "mouseenter"); //触发mouseenter事件
trigger(h2, "mouseleave"); //触发mouseleave事件
trigger(h2, "blur"); //触发blur事件
trigger(h2, "focus"); //触发focus事件
}
</script>
结果如下:
(试了下不兼容 <= IE8 ),大神有更好的兼容方法,望多多指点小弟,小弟不胜感激~!