对于循环功能,意外输出-始终相同

文森特815

我有这种奇怪的情况,我不知道为什么输出的结果不是我期望的。这只是一个简单的for循环功能。有人可以解释一下为什么会这样吗?

var pm = 2; 
for (var i = 0; i < pm; i++) {
     $("#specialty_pm_"+i).mouseenter(function(){
            alert(i);
    });
};

我在我的html中有2个div,id="specialty_pm_<?php echo $countPM; ?>"并且该div位于php中的for循环函数中。foreach ($employee_info as $emp_info){ $countPM++; }我希望第一个div的悬停警报为“ 1”,第二个div的警报为“ 2”。但是当我将鼠标悬停在第一个div上时,它会提示“ 2”。

马丁·耶斯珀森

正如已经提到的,原因i是两个事件处理程序的范围都相同,因此对于两个事件处理程序而言,它的值都相同。

有两个解决方案可以解决此问题。

解决方案1:通过立即函数创建新作用域

var pm = 2; 
for (var i = 0; i < pm; i++) {
     $("#specialty_pm_"+i).mouseenter(function(instance){
        return function() {  alert(instance); };
    }(i));
};

您可以在这里看到它的作用:http : //jsfiddle.net/LP6ZQ/

解决方案2:使用jQuerysdata方法存储值

var pm = 2; 
for (var i = 0; i < pm; i++) {
     $("#specialty_pm_"+i).data('instance',i).mouseenter(function(){
            alert($(this).data('instance'));
    });
};

您可以在这里看到它的作用:http : //jsfiddle.net/LP6ZQ/1/

解决方案3:bind事件处理程序的实例号

var pm = 2; 
for (var i = 0; i < pm; i++) {
     $("#specialty_pm_"+i).mouseenter(function(instance){
        alert(instance);
    }.bind(null,i));
};

您可以在这里看到它的作用:http : //jsfiddle.net/LP6ZQ/2/

解决方案3有一些警告-this被绑定为null,因此它不再像jQuery eventhandlers名义上那样可以用作对dom元素的引用。bind没有被旧版本浏览器的支持,但是这可以通过usinga填充工具来缓解,好一个可以在这里找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/功能/绑定

解决方案4:保持聪明,并使用委托而不是在循环中绑定事件处理程序

     $(document.body).on('mouseenter','.specialty_pm',function(){
        alert($(this).data('id'));
    });

您可以在这里看到它的作用:http : //jsfiddle.net/LP6ZQ/4/

解决方案4是实现此目标的“正确方法”,但这将要求您更改构建标记的方法

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

QUnit-循环测试,索引始终相同

对于不同的PDF,MD5始终相同

熊猫数据框情感分析始终输出相同的值

如果Powershell中的Statement始终以相同的输出响应

nawk中的for循环中的rand()返回始终相同的值-ksh

用于for()循环的标记的GMaps APIv3 InfoWindow始终相同

循环中的Python rng始终返回相同的数字

Ruby on Rails Active Record RANDOM()在循环内始终相同

Wordpress 自定义循环分页 - 始终相同的内容

循环返回始终相同的最后一个值

如何强制`gpg2`始终为相同的输入产生相同的输出?

对于JS字符串,s ===“”是否始终与s.length == 0相同?

配置单元-对于按值重复的订单,结果是否始终相同?

Guid.NewGuid()对于所有行始终返回相同的Guid

对于始终在x轴上保持相同位置的组件的推荐布局?

无论输入如何,Tensorflow lite模型输出始终提供相同的输出

纯函数:“无副作用”是否意味着“在给定相同输入的情况下始终相同的输出”?

将布尔参数传递给我的脚本始终会导致相同的输出

自组织地图运行不正常,始终与输出相同类

Random.Next()在每次运行时,数字始终提供相同的输出

Tensorflow seq2seq聊天机器人始终提供相同的输出

如何在R中输出始终相同的尺寸(宽度/高度)图?

在C ++中的循环中读取QML对象(CheckBox)属性:始终相同的值

相同功能的不同输出

通知设置始终相同

对于V8优化,“始终以相同顺序初始化对象成员”是什么意思?

如何为 2 种类型的交换同时执行相同的代码块,但对于相同类型的交换却始终如一?

部署在Cloud ML Engine中的经过重新训练的inception_v3模型始终输出相同的预测

对于循环,请继续打印相同的信息