Javascript 为什么可以';我不能设置大规模事件处理程序吗?

Javascript 为什么可以';我不能设置大规模事件处理程序吗?,javascript,jquery,Javascript,Jquery,所以这两种方法很好: $(document).on("click", "#_something", function(){ $('#vid').attr('src',video_config["something"].video); }); $(document).on("click", "#_anotherthing", function(){ $('#vid').attr('src',video_config["anotherthing"].video); }); 但是

所以这两种方法很好:

$(document).on("click", "#_something", function(){
    $('#vid').attr('src',video_config["something"].video);

});
$(document).on("click", "#_anotherthing", function(){
    $('#vid').attr('src',video_config["anotherthing"].video);

});
但是,
something
nothing
是我制作的对象的属性,因此我尝试这样做:

for (var key in video_list){
    $(document).on("click", "#_"+key, function(){
        $('#vid').attr('src',video_list[key].video);
    });
}
哪一种搞砸了,将所有的
src
值设置为最后一个
video\u列表[key]。video
值。换言之,这为所有
src
属性分配了相同的值


如何在不手动写入每个事件处理程序的情况下正确执行此操作?

这是因为处理程序函数捕获了作用于父函数的
变量。当处理程序执行时,
key
具有最后一个值

解决方法是使用另一个函数作用域在每次迭代中捕获当前值。像这样:

for (var k in video_list) {
  function(key) {
    // create your event handler here using key
  }(k);
}
这个问题的解释与这个问题基本相同:

在ES6浏览器中,
成为块范围,您可以将其用作快捷方式:

for (let k in video_list) {
  let key = k;
  // same code as your question goes here, using key.
}

又快又脏的黑客:

for (var key in video_list){
    (function(key){// create a new context, so not all handlers point the the same key
        $(document).on("click", "#_"+key, function(){
            $('#vidSrc').attr('src',video_list[key].video);
        });
    })(key);
}
正确的方法是:

$(document).on("click", ".some-new-class-you-just-defined", function() {
    $(this).attr('src', video_list[$(this).attr('id').slice(1)].video);
});

编辑:向id添加子字符串。最好使用某种查找机制,而不是像@jods建议的那样将其存储在id中。

以下是使用一个事件处理程序、一个类和一个数据属性的简单方法:

$(document).on("click", ".video", function(){
    var key = $(this).data("key"); // in the element add data-key="xyz"
    $('#vid').attr('src',video_list[key].video);
});

使用类而不是id。拥有多个#vid会把事情搞砸。是否有多个元素具有相同的id?一般来说,这是非常不鼓励的。不,只有一个
#vidSrc
let
在大多数浏览器中不受支持,这就是我在ES6浏览器中说的原因。此外,大多数浏览器取决于您的目标受众:IE11+、至少FF24+和至少Chrome30+都支持它。关于ES6兼容性方面,您可以查看Kangax兼容性表:您的浏览器是什么?这里,你的小提琴演奏得很好,没有错误。但是输出是333,所以现在我知道了。我会用这个实验来修正我的答案,谢谢!关于FF,它不适用于FF 27.0.1和Chrome 33.0.1750.154(这些是我安装的),它是从支持Javascript 1.7的FF 2开始支持的。诀窍是您必须使用
选择JS1.7支持。此处的详细信息:您的第二段代码不正确,因为
id
以附加下划线
\uu
开头,而不是原始属性名称。需要稍微摆弄一下。这是一个非常复杂的问题,如果你走这条路,你应该把属性名放在一个附加属性中,比如
data videokey=something
@jods,你是对的。我把注意力集中在环路上,却错过了这个。