用匿名函数去包含一个事件响应函数

1解决动态事件函数不能传参问题

转自,https://blog.csdn.net/q5706503/article/details/82989804,自己验证如下,

如想完成点击按钮后,窗口内弹出特定的内容,可以是其他节点对象的属性值。代码如下,

            var btn2 = document.getElementById("btn2");
            function alertStr (str) {
                alert(str);
                alert(this);
            }

            btn2.onclick = function () {
                alertStr("124");    
            };

结果为,

2解决1中匿名函数中事件函数中this指向不是被绑定对象。

alertStr函数中弹出this是window对象,这印证了https://blog.csdn.net/qq_38277179/article/details/90543510中第四章this的情况中(1)的情况,但是一帮情况下,我们希望事件处理函数中的this指向的都是被绑定事件的对象,也即上述代码中的input对象,

修改代码如下

var btn2 = document.getElementById("btn2");
			function alertStr (str) {
				alert(str);
				alert(this);
			}

			btn2.onclick = function () {
				alertStr.call(this, "124");	
			};

运行结果

应用:在为对象绑定多个事件中,解决attachEvent返回this不是被绑定对象的问题。

问题说明:attachEvent参数接受:参数1  被绑定参数的对象,参数2  事件字符串,参数3  事件响应函数;在事件响应函数中按照逻辑 alert(this)  时,应弹出参数1的对象,但是这种方式只能弹出window对象。

问答原因:之所以只能弹出window对象,无非是事件响应函数是仅仅作为一个函数执行了,没有放在参数1的作用域中。

问题解决:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>事件bind的测试</title>
	<script type="text/javascript">
		
		window.onload = function () {

			var btn1 = document.getElementById("btn1");
			bind(btn1,	"onclick", function () {
				alert(this);
			});
		}

// 封装函数,参数  绑定的对象obj,事件字符串eventStr,回调函数fun
// 默认传入的eventStr是带on的
		function bind(obj, eventStr, fun){
			// 需要解决的问题:
			// 1  浏览器对于addEventListener和attachEventListener的兼容性
			// 2  两个事件绑定函数返回的this不同
			// 3  addEventListener的eventStr不带on,而attachEventListener带on
			if (obj.addEventListener) { 
				eventStr = eventStr.replace("on", "");
				obj.addEventListener(eventStr, fun, false);
			} else {
				obj.attachEvent.call(obj, eventStr, function () {
					fun.call(obj);
				});
			}
		}

	</script>
</head>
<body>
	<input type="button" id="btn1" value="点我一下">
</body>
</html>

IE8下,运行结果如下,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值