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,你是对的。我把注意力集中在环路上,却错过了这个。