老师,这是代码...
来源:19-2 事件-代码演示
沧海的雨季
2019-02-22
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>事件代理通用</title>
</head>
<body>
<div id="div1">
wooooooooooooooooooooooo
<a href="#1" id="a1">1</a>
<a href="#2">2</a>
<a href="#3">3</a>
</div>
</body>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
function bind(ele,type,selector,fn){
if(fn==null){
fn=selector;
selector=null;
}
// 传入元素只有一个
if(ele.length==null){
ele.addEventListener(type,function(e){
var target;
// 代理
if(selector){
target=e.target;
if(target.matches(selector)){
fn.call(target,e)
}
// 非代理
}else{
fn.call(ele,e)
}
})
}else{
// 传入为一个集合
for(let i=0;i<ele.length;i++){
ele[i].addEventListener(type,function(e){
// 代理
if(selector){
let target=ele[i].target;
if(target.matches(selector[i])){
fn.call(target[i],e)
}
// 非代理
}else{
console.log(this)
fn.call(ele[i],e)
}
})
}
}
}
// 代理
var div1=document.getElementById('div1');
var a=div1.getElementsByTagName('a');
// var a=document.getElementById('a1')
// bind(div1,'click','a',function(e){
// e.preventDefault();
// console.log(this)
// })
// 非代理
bind(a,'click',function(e){
e.preventDefault();
console.log(this)
})
</script>
</html>
6回答
-
新开个问题吧,这个问题的答复、回复都太乱了
012019-02-22 -
双越
2019-02-22
有可能是 a 标签的问题。你把代码中的 a 标签,都换成 p 标签,再试一下。
012019-02-22 -
沧海的雨季
提问者
2019-02-22
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>事件代理通用</title>
</head>
<body>
<div id="div1">
wooooooooooooooooooooooo
<a href="#1" id="a1">1</a>
<a href="#2">2</a>
<a href="#3">3</a>
</div>
</body>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
function bind(ele,type,selector,fn){
if(fn==null){
fn=selector;
selector=null;
}
// 传入元素只有一个
if(ele.length==null){
ele.addEventListener(type,function(e){
var target;
// 代理
if(selector){
target=e.target;
if(target.matches(selector)){
fn.call(target,e)
}
// 非代理
}else{
fn.call(ele,e)
}
})
}else{
for(let i=0;i<ele.length;i++){
ele[i].addEventListener(type,function(e){
// 代理
if(selector){
let target=ele[i].target;
if(target.matches(selector[i])){
fn.call(target[i],e)
}
// 非代理
}else{
console.log(this)
fn.call(ele[i],e)
}
})
}
}
}
// 代理
var div1=document.getElementById('div1');
var a=div1.getElementsByTagName('a');
// var a=document.getElementById('a1')
// bind(div1,'click','a',function(e){
// e.preventDefault();
// console.log(this)
// })
// 非代理
bind(a,'click',function(e){
e.preventDefault();
console.log(this)
})
</script>
</html>
012019-02-22 -
沧海的雨季
提问者
2019-02-22
老师,不使用代理是不是要加一句
fn.call(ele,e)
因为函数是this是指向window,所以调用的时候this也是window,只有改变指向才能让触发的事件绑定在它本身上面吧
012019-02-22 -
沧海的雨季
提问者
2019-02-22
老师,chrome现在不能用preventDefault()阻止默认事件了吗?现在是用什么来代替呢?
还有为什么我写的在不代理情况下,this指向window呢?不应该指向触发事件的元素吗?哪里写错了呢..
这个事件函数是不能用一个集合去绑定事件的吧,如何能写出像jq一样集合也能触发的事件呢?
042019-02-22 -
玥玥颜
2019-02-22
我试了一下能打印出来啊
052019-05-08
相似问题