关于for循环内部click事件绑定传参的问题 2016.10.17

本文介绍了一种使用JavaScript实现的鼠标悬停时背景图切换的效果。通过修改URL中的图片名称,实现了图片在悬停和非悬停状态下的平滑过渡。此效果适用于网站按钮或其他UI元素,增强用户交互体验。
<script type="text/javascript">
    $(function() {
        var li = $('.se-btn li');
        var pattern = 'images/ser';

        for (var i = 0; i < 9; i++) {
            (function(i) {
                var url = li.eq(i).find('span').css('background-image');
                var length = url.split('').length;          //获取url的长度
                var ind1 = url.search(pattern);             //返回字符串中 pattern开始位置
                var qian = url.slice(0, ind1 + 10);         //前面的字符串
                var hou = url.slice(ind1 + 10);             //后面的字符串

                li.eq(i).hover(function() {
                    $(this).find('span').css({
                        'background-image': qian + 'h' + hou //中间加个 'h'
                    });
                }, function() {
                    $(this).find('span').css({
                        'background-image': qian + hou
                    });
                });
            })(i);
        }

    });
    </script>

摘自:http://www.cnblogs.com/flappyCoder/p/4106109.html

例子:http://pan.baidu.com/s/1sl4FyPJ server.html

 

转载于:https://www.cnblogs.com/relstart/p/5969929.html

<think>好的,用户的问题是关于如何在JavaScript的window.addEventListener中传递参数给回调函数,以及如何正确移除绑定的事件。我需要结合提供的引用资料来整理一个清晰的回答。 首先,用户提到传参问题。根据引用[1],直接传递带参数的函数会导致立即执行,所以需要包裹一个匿名函数。比如element.addEventListener('mouseover', function(e) { fn(e, some); });。但这样在移除事件时会有问题,因为匿名函数无法被识别,导致removeEventListener失效。 接下来,引用[3]中提到使用bind方法生成一个新函数,这样既传参又能保留引用,方便移除。例如,var fn = some.bind(null, '参数'); 添加和移除时都用fn,这样就能正确解绑了。不过要注意bind的兼容性,虽然现在大部分浏览器都支持,但旧版本可能需要处理。 然后,引用[4]展示了一个更复杂的例子,在自定义指令中,将生成的函数保存在元素的属性上,比如el._kpma_event,这样在移除时可以引用同一个函数实例。这种方法适用于需要保持函数引用一致性的场景,比如Vue指令的生命周期中。 总结一下,传参的方法主要有两种:匿名函数包裹和使用bind。但匿名函数会导致无法移除,所以推荐使用bind或者具名函数。同时,为了确保移除时能正确识别函数,必须保持函数引用一致,不能每次生成新的匿名函数。 另外,移除事件时需要注意第三个参数(useCapture)必须与添加时一致,否则removeEventListener可能不起作用。这点引用[2]提到过,addEventListener和removeEventListener的参数要一致,包括事件类型、回调函数和捕获阶段标志。 用户可能的应用场景可能是在需要动态添加和移除事件监听器时,特别是在处理参数的情况下,比如在循环中为多个元素绑定不同参数的事件,或者在框架如Vue中管理事件的生命周期。需要确保在组件卸载时正确移除事件,避免内存泄漏。 可能的相关问题包括如何处理事件监听器的内存管理,或者在框架中使用addEventListener的最佳实践。还有如何在不支持bind的环境下实现类似功能,或者如何传递动态变化的参数给回调函数。 需要确保回答结构清晰,分步骤说明传参和移除的方法,并给出代码示例。同时指出常见错误,比如使用匿名函数导致无法移除,以及参数一致性的重要性。</think>在JavaScript中为`addEventListener`传递参数并正确移除事件监听,可通过以下方法实现: --- ### **一、参数传递的三种方式** 1. **匿名函数包裹(适用于简单场景)** ```javascript function handleClick(e, param) { console.log(param + e.clientX) } // 添加监听 window.addEventListener('click', function(e) { handleClick(e, "X坐标:") }); // 移除无法实现!因为匿名函数是新实例[^1] ``` 2. **bind()绑定参数(推荐方式)** ```javascript const handler = handleClick.bind(null, "X坐标:"); window.addEventListener('click', handler); // 正确移除 window.removeEventListener('click', handler); // 需保持函数引用一致[^3] ``` 3. **自定义属性存储参数(适合复杂场景)** ```javascript element.dataset.customParam = "参数值"; element.addEventListener('click', function(e) { console.log(this.dataset.customParam) }); ``` --- ### **二、正确移除事件绑定的要点** 1. **函数引用一致性** `removeEventListener`要求回调函数必须与添加时是同一个对象,因此不能使用匿名函数: ```javascript // 错误示例:无法移除 element.addEventListener('click', () => console.log('clicked')); element.removeEventListener('click', () => {}); // 新匿名函数 ≠ 原函数 // 正确示例 const handler = () => console.log('clicked'); element.addEventListener('click', handler); element.removeEventListener('click', handler); ``` 2. **保留函数引用(框架场景)** 在Vue/React等框架中,可将函数存储在DOM元素属性上: ```javascript // Vue自定义指令示例 mounted(el) { el._customHandler = (e) => { /* 操作 */ }; el.addEventListener('click', el._customHandler); }, beforeUnmount(el) { el.removeEventListener('click', el._customHandler); // 通过属性引用移除[^4] } ``` 3. **第三个参数必须一致** 若添加时设置了`useCapture`,移除时需保持相同值: ```javascript element.addEventListener('click', handler, true); element.removeEventListener('click', handler, true); // 第三个参数需匹配[^2] ``` --- ### **三、完整示例** ```javascript // 定义带参数的函数 function logPosition(msg, e) { console.log(`${msg}: (${e.clientX},${e.clientY})`); } // 绑定事件 const boundHandler = logPosition.bind(null, "当前坐标"); window.addEventListener('mousemove', boundHandler); // 移除事件 document.querySelector('#removeBtn').addEventListener('click', () => { window.removeEventListener('mousemove', boundHandler); }); ``` --- ### **常见问题** 1. **为什么匿名函数无法移除?** 每次创建的匿名函数都是新实例,导致`removeEventListener`无法匹配原函数[^1]。 2. **如何传递动态参数?** 使用闭包或通过元素属性存储数据: ```javascript buttons.forEach(btn => { btn.dataset.id = btn.id; btn.addEventListener('click', function() { console.log(this.dataset.id); // 通过DOM属性获取参数 }); }); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值