简体   繁体   English

将事件添加到数组的元素

[英]Adding events to elements of an array

I´m trying to make a loop inside an array, and add events to its elements, not succeeding. 我试图在数组中创建一个循环,并向其元素添加事件,而不是成功。 This is the array: 这是数组:

div_empresa_links_elements.push({
    div_mouseover: div_imagens_mouseover,
    div_submenu: div_empresa_imagens,
    div_txt: div_imagens_txt
}, {
    div_mouseover: div_institucional_mouseover,
    div_submenu: div_empresa_institucional,
    div_txt: div_institucional_txt
}, {
    div_mouseover: div_localizacao_mouseover,
    div_submenu: div_empresa_localizacao,
    div_txt: div_localizacao_txt
}, {
    div_mouseover: div_infraestrutura_mouseover,
    div_submenu: div_empresa_infraestrutura,
    div_txt: div_infraestrutura_txt
}, {
    div_mouseover: div_politicaDeQualidade_mouseover,
    div_submenu: div_empresa_politicaDeQualidade,
    div_txt: div_politicaDeQualidade_txt
}, {
    div_mouseover: div_linhaDoTempo_mouseover,
    div_submenu: div_empresa_linhaDoTempo,
    div_txt: div_linhaDoTempo_txt
}, {
    div_mouseover: div_historico_mouseover,
    div_submenu: div_empresa_historico,
    div_txt: div_historico_txt
})

This is the loop: 这是循环:

for (var i = 0; i < div_empresa_links_elements.length; i++) {
    var obj = div_empresa_links_elements[i]
    obj.div_mouseover.onmouseover = function () {
        obj.div_txt.style.opacity = 1
        obj.div_txt.style.filter = 'alpha(opacity = 100)'
        obj.div_submenu.style.opacity = .7
        obj.div_submenu.style.filter = 'alpha(opacity = 70)'
    }
}

The thing just works, if I put an event for each of the elements (_mouseover), by hand without a loop. 如果我手动为每个元素(_mouseover)放置一个事件,而没有循环,那么事情就起作用了。 Can anyone tell me why? 谁能告诉我为什么?

The issue is caused by a closure issue. 问题是由关闭问题引起的。 Currently, obj is overwritten at each iteration. 当前, obj在每次迭代时都会被覆盖。 So, obj points to the lastly defined element. 因此, obj指向最后定义的元素。 To fix this, wrap the the loop's body in a self-invoking function, and pass the variable obj as an argument, as shown below: 要解决此问题,请将循环的主体包装在自调用函数中,并将变量obj作为参数传递,如下所示:

 for (var i = 0; i<div_empresa_links_elements.length;i++){
    var obj = div_empresa_links_elements[i]
    (function(obj){ //obj is declared again. Inside this func, obj = <see below>
        obj.div_mouseover.onmouseover = function(){
            obj.div_txt.style.opacity = 1
            obj.div_txt.style.filter = 'alpha(opacity = 100)'
            obj.div_submenu.style.opacity = .7
            obj.div_submenu.style.filter = 'alpha(opacity = 70)'
        }
    })(obj); //Pass the variable obj as defined at the top
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM