对JQuery在循环中绑定事件的问题理解

03-jQuery-事件绑定【click() 、on()】、事件切换toggle()、事件方法、样式控制 on() 方法是 jQuery 中最常用且最通用的事件绑定方法,可以绑定多个事件类型,并为每个事件类型指定一个或多个处理程序。click() 方法是一种简洁的事件绑定方法,只能绑定 click 事件,并且只允许绑定一个处理程序,无法为同一个元素绑定多个处理程序。off() 方法用于移除之前绑定的事件处理程序,它需要传递一个或多个事件类型参数,并为这些事件类型制定要移除的处理程序。jQuery 事件绑定中,on() 方法用于为元素添加事件处理程序,off() 方法则用于移除绑定的事件处理程序。 阅读详情

对JQuery在循环中绑定事件的问题理解

在昨天写网页时遇到了一个关于jQuery在循环中绑定事件后部分效果失效的问题,在这里分享一下解决方案

1、先上HTML代码:

在这里需要实现的是鼠标经过li时通过jq animate动画动态增加li元素的高同时使兄弟元素高减少,此外每个li都有指定的img图片,当鼠标经过li时触发mouseover事件使相对的img图片显示同时其他兄弟图片隐藏

            <div class="hoverpart">
                    <img src="images/exhibition1_1.jpg" alt="" class="hoverpart_img1 imgSelected">
                    <img src="images/exhibition1_2.jpg" alt="" class="hoverpart_img2">
                    <img src="images/exhibition1_3.jpg" alt="" class="hoverpart_img3">
                    <img src="images/exhibition1_4.jpg" alt="" class="hoverpart_img4">
                    <img src="images/exhibition1_5.jpg" alt="" class="hoverpart_img5">
                    <ul class="hoverpart_menu">
                        <li class="hoverpart_menu_option">
                            <a href="" title="">
                                <span class="title">1</span>
                                <div class="hoverpart_menu_option_content">我是mouseover事件触发时时显示的内容,平时是隐藏的!(第一条默认显示内容及对应有imgSelected的图片)</div>
                            </a>
                        </li>
                        <li class="hoverpart_menu_option">
                            <a href="" title="">
                                <span class="title">2</span>
                                <div class="hoverpart_menu_option_content">我是mouseover事件触发时时显示的内容,平时是隐藏的!</div>
                            </a>
                        </li>
                        <li class="hoverpart_menu_option">
                            <a href="" title="">
                                <span class="title">3</span>
                                <div class="hoverpart_menu_option_content">我是mouseover事件触发时时显示的内容,平时是隐藏的!</div>
                            </a>
                        </li>
                        <li class="hoverpart_menu_option">
                            <a href="" title="">
                                <span class="title">4</span>
                                <div class="hoverpart_menu_option_content">我是mouseover事件触发时时显示的内容,平时是隐藏的!</div>
                            </a>
                        </li>
                        <li class="hoverpart_menu_option">
                            <a href="" title="">
                                <span class="title">5</span>
                                <div class="hoverpart_menu_option_content">我是mouseover事件触发时时显示的内容,平时是隐藏的!</div>
                            </a>
                        </li>
                    </ul>
                </div>

2、js代码

            for(var i=1;i<=5;i++){
                $(".hoverpart_menu_option").mouseover(function(){
                    $(this).stop().animate({height:"94px"},400).css("background-color","#0055ce")
                    .siblings().stop().animate({height:"37px"},400).css("background-color","#ccc");
                    $(this).addClass("option_selected")
                    .siblings().removeClass("option_selected");
                    //以下失效
                    $("img.hoverpart_img"+i).addClass("imgSelected")
                    .siblings().removeClass("imgSelected");
                    });
               }

在这标注“以下失效”之前的代码都已经成功绑定了每个li,然而此时img并没有随着切换
于是在JS中间添加alert测试i值:

            for(var i=1;i<=5;i++){
                $(".hoverpart_menu_option").mouseover(function(){
                    $(this).stop().animate({height:"94px"},400).css("background-color","#0055ce")
                    .siblings().stop().animate({height:"37px"},400).css("background-color","#ccc");
                    $(this).addClass("option_selected")
                    .siblings().removeClass("option_selected");
                    alert("到这里的i值为:"+i);//插这里
                    //以下失效
                    $("img.hoverpart_img"+i).addClass("imgSelected")
                    .siblings().removeClass("imgSelected");
                    });
               }

结果弹出:
这里写图片描述
而且关键是还弹出5次!!!

。。。。此时我的内心是这样的:
这里写图片描述
于是乎再改alert的位置进行测试:

for(var i=1;i<=5;i++){
                $(".hoverpart_menu_option").mouseover(function(){
                    alert("到这里的i值为:"+i);//插这里
                    $(this).stop().animate({height:"94px"},400).css("background-color","#0055ce")
                    .siblings().stop().animate({height:"37px"},400).css("background-color","#ccc");
                    $(this).addClass("option_selected")
                    .siblings().removeClass("option_selected");
                    //以下失效
                    $("img.hoverpart_img"+i).addClass("imgSelected")
                    .siblings().removeClass("imgSelected");
                    });
               }

这里写图片描述
还是5个6。。。。你怎么不6个6啊!
这里写图片描述
再改!

for(var i=1;i<=5;i++){
                alert("到这里的i值为:"+i);//我再插!
                $(".hoverpart_menu_option").mouseover(function(){
                    $(this).stop().animate({height:"94px"},400).css("background-color","#0055ce")
                    .siblings().stop().animate({height:"37px"},400).css("background-color","#ccc");
                    $(this).addClass("option_selected")
                    .siblings().removeClass("option_selected");
                    //以下失效
                    $("img.hoverpart_img"+i).addClass("imgSelected")
                    .siblings().removeClass("imgSelected");
                    });
               }

这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述
这里写图片描述

果断问百度爸爸
于是乎找到这篇文章:《深入理解JQuery循环绑定事件》

恍然大悟!!!

始终弹出6, 因为function() {} 并没有被立即解析,直到调用的时候才被解析,立即弹出0, 1, 2, 3,4,5是因为使用了function() {}(index)立即被解析,遇到alert,就立即弹出
于是依瓢画葫芦改了一番代码,

3、如下:

            for(var i=1;i<=5;i++){
                    $(".hoverpart_menu_option"+i).bind("mouseover",{index:i},addOne);
                    }
                function addOne(event){
                        var i=event.data.index;
                        $(this).stop().animate({height:"94px"},400).css("background-color","#0055ce")
                        .siblings().stop().animate({height:"37px"},400).css("background-color","#ccc");
                        $(this).addClass("option_selected")
                        .siblings().removeClass("option_selected");
                        $("img.hoverpart_img"+i).addClass("imgSelected")
                        .siblings().removeClass("imgSelected");
                    }

效果终于正确执行,鼠标滑过li对应图片变化正常同时选项高度变化,内容显示。
这里写图片描述

4、原理

按照期望的效果是在for五次循环分别给按钮每个li都绑定mouseover事件,但是五遍循环绑定的是mouseover(i)事件,而不是mouseover(1)、mouseover(2)、mouseover(3)……
与此同时给”img.hoverpart_img”+i中绑定的也是i,而不是1到5,因为在绑定的过程中bind的事件处理函数里的代码并没有运行,因此在触发onmoseover事件之前并不知道i等于几,于是乎就出现了上面的测试中弹出五个6的现象

啊哈哈这难不倒我
这里写图片描述

在这里还有一个javascript的版本,主要是需要闭包解决:
《JavaScript在for循环中绑定事件解决事件参数不同的情况》

5、改装

实际在网页开发过程中代码还可以进一步优化
首先为了方便后台改动,需要微调一下HTML的class:

<!--将img图片class全部统一为hoverpart_img -->
 <img src="images/exhibition1_1.jpg" alt="" class="hoverpart_img imgSelected">
 <img src="images/exhibition1_2.jpg" alt="" class="hoverpart_img">
 <img src="images/exhibition1_3.jpg" alt="" class="hoverpart_img">
 <img src="images/exhibition1_4.jpg" alt="" class="hoverpart_img">
 <img src="images/exhibition1_5.jpg" alt="" class="hoverpart_img">                    

然后再改js:

$(".hoverpart_menu_option").each(function(index, element) {
                $(this).mouseover(function(e) {
                    $(this).stop().animate({height:"94px"},400).css("background-color","#0055ce")
                    .siblings().stop().animate({height:"37px"},400).css("background-color","#ccc");
                    $(this).addClass("option_selected")
                    .siblings().removeClass("option_selected");
                    $("img.hoverpart_img").eq(index).addClass("imgSelected")
                    .siblings("img.hoverpart_img").removeClass("imgSelected");
                });
               })

在这里我们使用了each()方法即jquery的遍历而不是原声的js的for循环遍历,它方便在于each() 方法规定为每个匹配了元素规定运行的函数,同时可以指定index及选择器的位置,将位置指示给eq()方法使用以依次遍历每个img.hoverpart_img,在这里jquery的each方法是通过js里的call方法来实现的,即调用一个对象的一个方法,以另一个对象替换当前对象,通俗来讲就是改变上下文的this指针从而达到改变指向的效果最终实现遍历不同位置。

大功告成,洗洗睡了!
这里写图片描述

JQuery在循环中绑定事件的问题详解 下面小编就为大家带来一篇JQuery在循环中绑定事件的问题详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 立即下载

相关推荐

深入理解JQuery循环绑定事件

下面小编就为大家带来一篇深入理解JQuery循环绑定事件。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

JQuery动态循环绑定事件

有时需要根据业务需要动态绑定事件,比如需要从根据从数据库中查出来的链接名称和URL,将这些信息放到标签中,数据库中的数据量是变化的,要在前端循环遍历数据,并进行事件绑定 function events(result){ //循环绑定事件 for(var j = 0;j<result.length;j++){ var name = result[j].name; var url = result[j].url; var a

Noodles小飞 932

手把手教你用Matlab为PMSM电流环设计2P2Z补偿器(附与PI对比)

本文详细介绍了如何使用Matlab的controlSystemDesigner工具为永磁同步电机(PMSM)电流环设计2P2Z补偿器,并与传统PI控制器进行性能对比。通过频域分析和时域仿真,展示了2P2Z补偿器在提升带宽、减少超调等方面的优势,为高性能伺服驱动和精密运动控制提供了实用解决方案。

weixin_42551227的博客 381

jquery循环绑定事件

for (var i = 0;i<Factories.length;i++){ $("#factorylist").append( "<p style='width: 140px' id='factory"+[i]+"'>"+ Factories[i].name +"</p>"+ ); $("#fa.

weixin_42378077的博客 1330

stm32H743基于CubeMX配置为双ADC多通道DMA规则采样

stm32H743的ADC支持的最大频率为36MHz,有相关资料上说是可以超频,具体技术细节不多讨论。 需求: 使用stm32H743的ADC采集5路ovrc

xtqbp的博客 4364

手把手教你解决Kernel panic报错:init找不到的5种排查方法(附NFS挂载实战)

本文深入解析了Linux系统启动时出现“Kernel panic - not syncing: No working init found”报错的根本原因,并提供了五种系统性的排查方法。文章结合NFS挂载根文件系统的实战场景,详细阐述了从动态链接库依赖、内核引导参数、NFS权限配置、文件系统完整性到内核配置干扰的完整排查路径,帮助开发者快速定位并解决这一常见的系统启动故障。

weixin_29159995的博客 196

jQuery事件绑定

jQuery 事件对象常用属性也与之前学过的 DOM 事件对象几乎一致,多了一个。旧的 jQuery 事件绑定方法如。jQuery 允许给同一个 jQ 对象的同一个事件绑定多个不同的事件处理函数。jQuery 事件中的事件对象通过事件处理函数的形参获取,事件中的。指向绑定事件的 jQuery 对象代表的 DOM 对象,如果使用。等都可以使用第一种方式绑定事件,但也有特殊的如输入框的。方式添加的事件委托,委托事件处理函数中的。上的属性,与原生事件中的事件对象一致。jQuery 事件中的。

m0_67388537的博客 2844

ESP32 BLE Mesh Provisioner实战:手把手教你用ESP-IDF配网智能灯泡(附常见错误排查)

本文提供了一份基于ESP-IDF的ESP32 BLE Mesh Provisioner实战指南,详细解析了配网器的核心角色与工作流程。文章手把手教你从工程搭建、代码初始化到核心回调解析,并重点针对常见的‘Model not bound to AppKey’等错误提供了深度排查思路与解决方案,帮助你构建一个稳定可靠的智能照明网关。

desk3的博客 515

jquery循环绑定click事件

&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;&lt;/title&gt; &lt;/head&gt; &lt;script type="text/javascript" src="js/jq

qq358828690的专栏 7328

VSCode玩转ESP-ADF音频开发:从环境搭建到成功播放MP3的避坑全流程

本文详细介绍了如何在VSCode环境下使用ESP-ADF框架进行ESP32音频开发,从环境搭建到成功播放MP3的全流程。重点解析了`IDF_PATH`和`ADF_PATH`的配置问题,以及如何解决`xTaskCreateRestrictedPinnedToCore`等常见编译错误,帮助开发者快速上手ESP-ADF音频开发。

weixin_42520909的博客 339

CMake是什么?为什么学习CMake

CMake的主要作用和重要性,包括其在跨平台构建中的应用、如何支持多种编译器及操作系统,以及它在管理大型和复杂项目中的优势。

小鱼酱的博客 3872

2019前端面试常问

面试项目简介: Vue:hash(散列算法)DOM Diff算法(React) Node.js https://www.cnblogs.com/DCL1314/p/7903085.html 路由传参: https://www.jianshu.com/p/4debd60d3187#!/xh 一、直接在路由中写参数 二、通过prams传参 三、通过query传参 Vue数据双向绑定: https://...

qq_42143163的博客 586

SAP_SD模块路径及运输功能后台配置简介

后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义传输模式根据实际运输过程运输地理的类型:海运、公路运输、空运后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义发运类型根据实际运输过程运输方式:汽车、卡车、火车、轮船、飞机后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义运输连接点指在运输过程中需要中转的地区可以维护中转地区的停留的时间后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义路径和阶段。

我小时候很黑的博客 1400

Vue简单运用

1.插值表达式 插值表达式:数据绑定【插值表达式中一般指定变量,也可以指定表达式等等。】 插值闪烁 当数据不是预定义的时候,而是通过网络进行获取的,那么当网络延迟加载时,页面中会显示插值表达式的语法,等网络加载完毕后,数据进行渲染,这种现象称之为:插值闪烁 2.v-text&v-html <div id="app"> <h1 v-text="name"></h1> <h2 v-text="age"></h2...

NAIYAnana的博客 303

Robot Framework 7.0 报告解析

本文深入解析 Robot Framework 7.0 新增的 JSON 报告功能,手把手教你如何从 output.xml 转换为结构清晰的 output.json,并通过 Python 脚本提取关键测试指标。文章附完整示例、命令、解析脚本,支持导出为 CSV 和 Markdown,方便接入可视化看板、群通知和 CI 流程。适用于测试自动化、质量平台建设和回归趋势分析场景。

点点寒彬的博客 266

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【jQuery】动画,遍历,事件绑定

【jQuery】动画,遍历,事件绑定1. 动画2. 遍历3. 事件绑定3.1 jquery标准的绑定方式3.2 on绑定事件/off解除绑定3.3 事件切换:toggle4. 插件:增强JQuery的功能5. 案例5.1 广告显示和隐藏5.2 抽奖 1. 动画 三种方式显示和隐藏元素 1. 默认显示和隐藏方式 1. show([speed,[easing],[fn]]) 2. hide([...

来日浅谈的博客 2120

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

for循环绑定事件时,var和let声明循环变量的区别

在理解var、let、const三者在声明变量的区别时,遇到了一道十分有意思的题:&lt;body&gt; &lt;ul&gt; &lt;li&gt;第一个li&lt;/li&gt; &lt;li&gt;第二个li&lt;/li&gt; &lt;li&gt;第三个li&lt;/li&gt; &lt;li&gt;第四个li&lt;/li&gt;

王龙楷 7257

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jquery 属性操作,循环,事件

jquery属性操作 1、html() 取出或设置html内容 // 取出html内容 var $htm = $('#div1').html(); // 设置html内容 $('#div1').html('<span>添加文字</span>'); 2、prop() 取出或设置某个属性的值 // 取出图片的地址 var $src = $('#img1').prop('src'); // 设置图片的地址和alt属性 $('#img1').prop({src: "test.j

小赵的呢 574

jquery循环绑定事件有一个坑----总是绑定最后一个元素

1. 先看一段用jquery循环绑定事件的代码,要求是对每个元素都作事件绑定。结果在绑定事件中只能得到最后一个值,如下代码片段1所示: var checkMutipleChoices=[{questionId:7547,maxNum:2},{questionId:7553,maxNum:3}]; for(var i=0;i<checkMutipleChoices.length;i++){

budapest的专栏 4448

jquery遍历绑定事件

html lang="en"> head> meta charset="UTF-8"> title>Titletitle> script src="javascripts/http_code.jquery.com_jquery-2.0.0.js">script> style> img{ width:100%;

github_turboemily的博客 865

由JS for 循环中为元素添加点击事件到JS 中的事件委托

一 、问题的出现           在web中,我们常常需要为某一类型的元素添加事件,这时,常用for循环。对于刚刚接触不久的小白总是容易在这里犯错,比如我。因此今天在这里记录一下自己的踩过的坑,希望对大家有所帮助。          假如我们需要为页面上的一组按钮添加点击事件。采用for循环,最容易写成如下: html> html lang="en"> head> meta

远走的兔子博客 1万+

4 jQuery、JavaScript 作用域、闭包与 DOM 事件绑定

jQuery是一个JavaScript函数库,提供了简化DOM操作、事件处理等功能。通过$(selector).action()语法操作元素,支持CSS选择器。jQuery可通过CDN引入或本地文件引用。$(document).ready()是DOM加载完成的回调函数,其内部形成闭包作用域,局部变量可被事件函数访问。推荐使用jQuery的事件绑定方式(如.click()),而非onclick全局函数,以避免作用域污染。闭包机制能保留局部变量的引用,解决事件处理中的变量访问问题。

LSL666_的博客 1124

对js事件绑定的一些理解

对js事件绑定的一些理解

CodingBleeding的博客 442

jquery中关于事件绑定的问题

jquery中的事件绑定方法:1.将事件绑定到document上,当整个dom中发生点击事件时会先判断当前点击的对象是否匹配该className,再执行点击的回调方法。适用于多组重复元素的点击事件。$(document).on('click','.className',function(){});2.将事件绑定到该className的元素上,一旦该元素发生点击事件立即执行回调方法。如果是单独的元素

hfhwfw161226的博客 322
下一篇: rem单位的使用总结
RotatingBlock
博客等级 码龄10年 16粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值