javaScript原生的事件委托原因及过程

<!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>事件委托代理 | Array 的新方法 EMB </title>
</head>

<body>


    <button><a href="#"> 点<i> 击</i></a>创建按钮</button>
    <button>点击创建按钮</button>
    <button>点击创建按钮</button>
    <button>点击创建按钮</button>
    <button>点击创建按钮</button>
    <button>点击创建按钮</button>
    <button>点击创建按钮</button>
    <button>点击创建按钮</button>
    <button>点击创建按钮</button>
    <button>点击创建按钮</button>
    <script src="../../public/js/normal.1.js"></script>
    <script src="main.js"></script>
</body>

</html>

 

var bts = $("button");




// 1. 我们要给他按钮绑定可以创建按钮的事件 ,太麻烦。那么我们可以给他父元素添加啊?

// 那我到时候判断就好了。




// // // ----------------------------------------- 我是代码段

// function createHandler(ev) {

// var e = ev || window.event; //事件对象

// var captureElemet = e.target || e.srcElement; //捕获到的点击对象

// if (captureElemet.nodeName === "BUTTON") {

// document.body.appendChild(createElement({

// tagName: "button",

// html: "我是创建的按钮"

// }));

// }

// // console.log(captureElemet.nodeName);

// }




// document.body.addEventListener("click", createHandler);



// -------------------------------------------我是代码段




// 2. 我还嫌弃他,为啥? 我觉的这样不够优雅(装 13) 这样我每次相同的操作时我都要这样去判断?



// > 那我觉的他很麻烦 我要封装 要成为通用的方法




// 那这个代码块哪里可以重用?

// 我们只要找哪里是不一样的就行了吧?

// 1. 那就是 选择的呀元素不一样吧? 下次就不一定是、按钮了吧? 很有可能是 相同的类 , 和标签了吧?

//2. 我不会每次都绑定的事件都相同吧? 功能不会都是创建一个按钮吧?



// 所以我们就可以 创建两个变量来替代对吧?

// 那像不像我不想自己喝水,累 ………… ,我就叫了个人,你去给我那杯水给我喝。。这个就是事件的代理

// 那我开始了!

function easyCreateHandler(ev) {

document.body.appendChild(createElement({

tagName: "button",

html: "我是创建的按钮"

}));

}





function delegation(executeHandler, targetSelector) {

return function (ev) { // 我本人认为第一步应先给监听事件要的东西, 就是执行事件对吧?

// 这个函数被作为传进去的执行者,那么他是不是接受了事件对象?嘿嘿

var e = ev || window.event; // 获取到了事件对象



// 获取当前捕获元素

var captureElemet = e.target || e.srcElement;

//获取要执行的目标元素

var targetElemets = this.querySelectorAll(targetSelector);



// console.log(captureElemet, this);



// 那是不是 执行目标和捕获目标相同 就执行就好了?

// 但是我们的目标元素不是一堆啊? 那是不是得一一辨认?

for (var i = 0, targetItem; targetItem = targetElemets[i++];) {

if (captureElemet == targetItem) { // 如果是这个目标 那就杠

executeHandler.call(targetItem, e);

//执行事务 ,并把执行事务 的参数给人家句柄

//指向执行的人,事件对象给执行句柄

}

}



}

}





// document.body.addEventListener("click", delegation(easyCreateHandler, "button"));






// > 3 .但是还是有问题啊!! 好烦啊对不? 在元素内部要是有嵌套那是不是 绑定的事件是不是就没用了啊?

// 就啊是啊? 那怎么解决了? 还是那样啊啊 判断,对不? 给绑定事件的一家子 ,就是包括他在内的儿子,都认为是执行目标,都应该执行这个绑定的事件,对。。对吧

// 开始更新了》》






function delegation(executeHandler, targetSelector) {

return function (ev) { // 我本人认为第一步应先给监听事件要的东西, 就是执行事件对吧?

// 这个函数被作为传进去的执行者,那么他是不是接受了事件对象?嘿嘿

var e = ev || window.event; // 获取到了事件对象

// 获取当前捕获元素

var captureElemet = e.target || e.srcElement;

//获取要执行的目标元素

var targetElemets = this.querySelectorAll(targetSelector);

var targetFamilay = [] //抓住一家子

var _targetemp = captureElemet;

while (true) {

if (_targetemp === this) break;

//如果是找到的父元素 放弃寻找

targetFamilay.push(_targetemp);

_targetemp = _targetemp.parentNode

}

if (!targetFamilay.length) return false;

// console.log(captureElemet, this);

// 那是不是 执行目标和捕获目标相同 就执行就好了?

// 但是我们的目标元素不是一堆啊? 那是不是得一一辨认?

for (var i = 0, targetItem; targetItem = targetElemets[i++];) {

if (targetFamilay.length === 1 ? captureElemet == targetItem : targetFamilay.indexOf(targetItem) !== -1) { // 如果是这个目标 那就杠

executeHandler.call(targetItem, e);

//执行事务 ,并把执行事务 的参数给人家句柄

//指向执行的人,事件对象给执行句柄

}

}



}

}





document.body.addEventListener("click", delegation(easyCreateHandler, "button"));





Node.prototype.on = function (eventType, handler, isCapture) {

arguments.length > 2 && isCapture ? "" : isCapture = false;

if (this.addEventListener) {

this.addEventListener(eventType, handler, isCapture);

} else if (this.attachEvent) {

this.attachEvent(eventType, handler);

} else {

this["on" + eventType] = handler;

}

}



// some 判定数组中是否存在某个符合条件的; 一旦函数返回true那么some就会终止循环,并且返回true ;

// Some 封装



var arr = [15000, 20000, 21000, 26000, 3000, 2000, 8000];

var boolean = arr.some(function (item, index, arr) {

console.log(item);

return item === 3000

})

console.log(boolean);



Array.prototype.iSome = function (fn) {

for (var i = 0, item; item = this[i++];) {

if (fn(item, i, arr)) {

return true;

}

}

}



var Iboolean = arr.iSome(function (item, index, arr) {

console.log(item);

return item === 3000

})

console.log(Iboolean);

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值