如何为html类添加事件监听器?

bit*_*eev 9 javascript

如果我有这样的HTML:

<a href="#" class="movieImg"><div class="previewBulk"></div></a>
<a href="#" class="movieImg"><div class="previewBulk"></div></a>
Run Code Online (Sandbox Code Playgroud)

和Javascript这样:

var movie = document.getElementsByClassName("movieImg");
var preview = document.getElementsByClassName("preview");
Run Code Online (Sandbox Code Playgroud)

有没有办法addEventListener2电影标签和预览div标签?我尝试循环,但当我做的事情:

for(var i = 0, j=movie.length; i<j; i++){
 movie[i].style.left = 100;
 preview[i].style.left = 100;
}
Run Code Online (Sandbox Code Playgroud)

我得到 Uncaught TypeError: Cannot read property 'style' of undefined.

更改预览到previewBulk后,我仍然得到错误,我的代码实际上看起来像这样

(function(){
        var movie = document.getElementsByClassName("movieImg"),
        preview = document.getElementsByClassName("previewBulk");
        //result = [];

        for(var i = 0, j=movie.length; i<j; i++){
            movie[i].addEventListener("mouseover", function(){

                preview[i].style.left = ((movie[i].offsetWidth-preview[i].offsetWidth)/2)+20;
                preview[i].style.top = -(movie[i].offsetHeight+preview[i].offsetHeight);
                preview[i].style.visibility = "visible";
            });

            movie[i].addEventListener("mouseout", function(){
                preview[i].style.visibility = "hidden";
            });
        }
    }());
Run Code Online (Sandbox Code Playgroud)

Orb*_*den 8

document.getElementsByClassName不返回数组.它返回一个遍历XML文件的节点列表.

    <a href="#" class="movie"><div class="previewBulk"></div></a>
    <a href="#" class="movie"><div class="previewBulk"></div></a>

    <script>

    var movie = document.getElementsByClassName("movie");

    for(var i = 0; i<movie.length; i++){
      movie.item(i).style.width = "100px";
    }?

    </script>
Run Code Online (Sandbox Code Playgroud)

见jsfiddle:http://jsfiddle.net/Uy5fk/


Ray*_*nos 7

// for each iterates over a list and runs a function for each element
var forEach = Array.prototype.forEach,
    // query selector all runs a CSS selector and returns a list of elements
    // matching the selector
    $$ = document.querySelectorAll.bind(document);

// for each element in the list returned by the CSS selector    
forEach.call($$('.movieImg, .preview'), function(v) {
  // add an event listener to the click event
  v.addEventListener('click', function(e) {
    // and run some event handling code.    
  }, false);
});
Run Code Online (Sandbox Code Playgroud)

当然还有浏览器合规性问题.他们需要支持ES5和DOM2事件.使用填充程序符合浏览器要求.

如果你包括

它应该修复浏览器支持.当然FF4/Chrome/safari5/ie9/Opera10 +已经支持这些了

编辑:

问题实际上是javascript花园中描述的"内部循环闭包问题"