在下拉选项鼠标经过事件中接触了闭包

在制作鼠标经过下拉导航的过程中遇到通过for循环来遍历ul的子元素li并分别为其添加鼠标经过事件使其改变背景颜色,如下代码:

 for(var i=0,l=lis.length;i<l;i++){
      lis[i].onmouseover=function(){
          lis[i].style.background=‘#567‘;
      }}

但是结果是当鼠标经过li的时候并不能使li改变颜色,这是为什么呢?仔细想想这也没有错误呀!首先遍历ul下的所有第一代子元素li然后添加dom0级事件onmouseover事件,通过一个匿名函数来改变行元素li的背景。但是如果我们稍加修改把以上代码变成如下方式情况就完全不一样了:

1 for(var i=0,l=lis.length;i<l;i++){
2       lis[i].onmouseover=(function(i){
3           return function(){lis[i].style.background=‘#567‘;}
4       }(i));
5 }

这时候当鼠标经过li的时候就能得到我们想要的效果了。这是为什么呢?原来这是闭包在起作用。

js变量不同于c语言等其他语言是块级作用域变量只在大括号里面才有定义,而js函数的作用域是函数作用域,它的作用域在整个函数中都有定义。在for循环中的i与在for循环中外定义i没有什么区别。所以在匿名函数使用i的时候它的值已经被初始化为lis.length了,而i在实际上最大只能取到lis.length-1所以lis.length这个值i是取不到的,所以我们也就看不到任何效果了。当我们把li的事件绑定到一个函数表达式上,并且在函数表达式内部,我们将一个匿名函数作为参数返回出去的话,情况就不一样了。这里的i就是闭包环境下的i可以依次取到每次for循环到的i了。

时间: 2024-11-26 10:47:00

在下拉选项鼠标经过事件中接触了闭包的相关文章

VC 鼠标滚轮事件控制绘图的问题

问题描述: 在MFC中绘制数据曲线,通过鼠标滚轮来进行放大缩小操作.在使用滚轮事件时,发现如果数据量较大,会出现卡顿. 解决方案: 鼠标滚轮事件会进行重复绘图,考虑在鼠标滚轮结束之后再重绘: 在鼠标滚轮事件中更新:重绘标识,新坐标轴值,此时时间: 利用OnTimer函数,在重绘标识为真时,判断当前时间与滚轮事件时间的差,超过预定值(比如500ms)就重绘,并置重绘标识为假. 方案待验证.

每日分享!~ 使用js原生方式对拖拉元素(鼠标的事件)

一个元素放置页面上.如何进行拖拉,实现想放哪里就放哪里的效果呢? 效果如下: 如果让你写这个效果,你会如何写呢? --- 思路分析:我首先想到的是,对这个元素先绑定一个事件.(什么事件? 那当然是鼠标按下时的事件啦? )   那么绑定这个事件具体做啥子呢? 在绑定这个事件之前.我们需要先了解如下几个事情-- 1. 元素如何才能在页面上移动?  (是不是要脱离文档流呢? OK / 这时我们给设置一个position:absolute /  让其绝对定位. 2. 获取元素当前距离页面两边的位置 3.

3D Slicer Modify Mouse Event 修改3D Slicer中的鼠标响应事件

在3D Slicer中,我们如果想在自己写的插件中来修改默认的鼠标响应事件的话,就需要先将原有的响应事件链接删除,然后建立自定义的响应事件链接,然后将自己要实现的功能写在响应事件函数中. 比如Slicer中默认的鼠标左键拖拽,是任意旋转视图中的Camera,默认中的滑轮操作是拉远和拉近视图摄像机,默认的鼠标右键操作也是拉远和拉近视图摄像机的操作.这样滑轮就和鼠标右键的功能重复了,我们可以让鼠标右键实现其他的功能.比如在模型的Pitch, Yaw, Roll三个旋转方向上(其实旋转的只是试图中的摄

dev 中 字符串转中文拼音缩写,对grid列表进行模糊匹配,grid获取焦点行,gridlookupedit控件用拼音模糊匹配下拉选项

番外篇:. //该方法是将字符串转化为中文拼音的首写字母大写, public static string RemoveSpecialCharacters(string str){try{if (string.IsNullOrWhiteSpace(str)) { return str; }var result = Regex.Replace(str, "[^0-9A-Za-z]", "");if (string.IsNullOrWhiteSpace(result))

制作由下向上的滚动字幕,字幕内容要求包含网站超级链接和图片超级链接, 使用鼠标移动事件控制字幕运动和停止。 2、在下拉列表框中设置五种以上颜色,选择颜色后, 滚动字幕背景色改变成相应颜色

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>    </head>    <!--        时间:2016-12-28        描述:1.制作由下向上的滚动字幕,字幕内容要求包含网站超级链接和图片超级链接,                   使用鼠标移动事件控制

js中鼠标滚轮事件详解

(以下内容部分内容参考了http://adomas.org/javascript-mouse-wheel/ ) 之前js 仿Photoshop鼠标滚轮控制输入框取值中已使用js对鼠标滚轮事件进行控制,滚轮事件其中考虑浏览器兼容性问题 附加事件 其中经我测试,IE/Opera属于同一类型,使用attachEvent即可添加滚轮事件. /*IE注册事件*/ if(document.attachEvent){ document.attachEvent('onmousewheel',scrollFunc

Winform 中panel的mousewheel鼠标滚轮事件触发

如果将窗体或容器控件(如Panel控件)的AutoScroll属性设置为True时,那么当窗体或Panel容不下其中的子控件时就会出现 滚动条,通过移动滚动条可以上下显示出窗体或Panel中的全部内容.但是默认情况下滚动条的移动只能通过鼠标直接拖动滚动条来实现,而不能通过鼠标的滚 轮来实现上下移动,因此需要手动添加代码来实现这个功能. 滚动鼠标的滚轮,触发的是窗体或控件上的 MouseWheel 事件.但是在VS.net2005中,窗体和控件的事件列表中却不包含 MouseWheel 事件,因此

BaseTool中鼠标双击事件获取鼠标位置的方法

ArcGISEngine的BaseTool类中提供了鼠标双击.鼠标移动.鼠标按键按下.鼠标按键弹起四种鼠标事件,但是鼠标双击事件的参数跟其他三种不一样,双击事件中没有提供鼠标位置信息. public virtual void OnDblClick(); public virtual void OnMouseDown(int Button, int Shift, int X, int Y); public virtual void OnMouseMove(int Button, int Shift

Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法

bug说明: Mint-ui中loadmore(上拉加载下拉刷新)组件 在 使用fastclick的情况下 ,在ios设备中滑动会触发点击事件: 解决方法: 我是按需引入,去项目中找到loadmore下的index.js,全部引入的要找mint下面mint-ui.common.js 路径如下:你的项目名/node_modules\mint-ui\lib\loadmore\index.js 搜索 handleTouchEnd ,记得写event进去 handleTouchEnd: function