【问题标题】:Index with switch statement带有 switch 语句的索引
【发布时间】:2014-02-28 21:03:03
【问题描述】:

我正在尝试弄清楚如何使用索引将此代码组合到 switch 语句中。我正在使用此代码允许某人单击缩略图,在播放器中播放该视频,并根据播放的视频更改标题。提前致谢。

<script>

// Play the video

$( "#video-1, #item1" ).click(function() {
   flowplayer().play("video1.mp4");
});

$( "#video-2, #item2" ).click(function() {
  flowplayer().play("video2.mp4");
});

$( "#video-3, #item3" ).click(function() {
  flowplayer().play("video3.mp4");
});

$( "#video-4, #item4" ).click(function() {
  flowplayer().play("video4.mp4");
});

$( "#video-5, #item5" ).click(function() {
  flowplayer().play("video5.mp4");
});


// Change title

function changeTitle(name)
{
document.getElementById("show-title").innerHTML = "Now playing " + name;
}


// Add and remove active class

$('#playlist li').on('click', function(){
    $(this).addClass('active').siblings().removeClass('active');
});

</script>

【问题讨论】:

  • 您可以发布您的 HTML 示例吗?我认为switch语句不适用,也许是 data- 属性?
  • 我觉得通过使用类和自定义数据属性,所有这一切都可以在几行代码中完成...请设置小提琴:jsfiddle.net,如果可能的话,带有测试视频的正确链接.

标签: javascript jquery switch-statement


【解决方案1】:

最简洁的方法是为您希望启用视频点击的所有项目(所有 #itemX#video-X 元素)添加一个通用类名,这样您就可以使用一个非常简单的用于常见点击处理程序的 javascript。然后,您从点击元素的 ID 值中提取数字,以确定要播放的视频:

$(".videoPlay").click(function {
    var num = this.id.match(/\d+/)[0];
    flowplayer().play("video" + num  + ".mp4");
});

如果你不能添加公共类,那么你可以列出所有你想要包含的选择器:

$("#video-1, #video-2, #video-3, #video-4, #video-5, #item1, #item2, #item3, #item4, #item5").click(function() {
    var num = this.id.match(/\d+/)[0];
    flowplayer().play("video" + num  + ".mp4");
}); 

或者,如果您没有其他 id 可能会陷入部分 id 匹配,您可以使用带有选择器逻辑的开头,但我更愿意避免这种情况,因为浏览器解析的速度并不快(它必须查看每个具有 ID 的对象)。我更喜欢列出实际的 id 或使用通用的类名:

$("[id^='video-'], [id^='item']").click(function() {
    var num = this.id.match(/\d+/)[0];
    flowplayer().play("video" + num  + ".mp4");
}); 

如果点击项的id和视频文件名之间没有对应关系,那么你需要在两者之间创建某种映射。我最喜欢的技术是在实际元素上指定 data-video 自定义属性:

<div class="videoPlay" data-video="thor.mp4">Click me to Play a Video</div>

然后,JS 将是:

$(".videoPlay").click(function {
    var fname = $(this).data("video");
    flowplayer().play(fname);
});

您可以拥有任意数量的这些 HTML 元素,并确保每个元素都指定了您希望该元素播放的视频文件,并且随着您添加越来越多,JS 根本不需要更改。

【讨论】:

  • 如果每个视频标题不以“video”开头然后是数字怎么办?比如是thor.mp4、gravity.mp4等?
  • @user3349779 - 如果 ID 值和视频名称之间没有对应关系,那么您必须创建某种对应关系。您可以在每个 HTML 元素上使用 data-video="thor.mp4" 属性来指定要播放的所需视频,或者您可以创建一个将 id 值与文件名匹配的 javascript 查找表,并使用 JS 查找正确的文件名,或者还有许多其他选项。如果 id 和视频文件名不匹配,我可能会在 HTML 元素上使用 data-video 自定义属性,因为它可以无限扩展并使 HTML 自我描述。
  • @user3349779 - 我在答案末尾添加了一个使用自定义数据属性指定视频文件名的示例。
  • 数据视频解决方案非常完美!你就是那个男人!谢谢
  • @user3349779 - 由于您是新来的,我想知道您是否了解 StackOverflow 应该如何工作?当您的问题得到回答时,您应该通过选中答案左侧的复选标记来选择对您最有帮助的答案。这将为提供该答案的人提供声誉积分奖励,并且您还将因遵循正确的程序而获得一些声誉积分(这可能会导致网站上的其他特权),并且它会长期创建一个更有价值的站点作为存储库标记为如此的问题和好的答案。
【解决方案2】:

这应该可行:

$( "[id^='video-'], [id^=item]" ).click(function() {
    var vid = this.id.replace(/(\d)|./g, '$1');
   flowplayer().play("video"+ vid +".mp4");
});

【讨论】:

  • 它似乎对我不起作用。我设置了一个小提琴或我实际上正在尝试做的事情。如果你能看看它会很棒。谢谢。 jsfiddle.net/zexQa/3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多