【问题标题】:AngularJS script is running twiceAngularJS 脚本运行了两次
【发布时间】:2015-11-07 23:54:34
【问题描述】:

我正在构建一个脚本,当 Bootstrap 模式打开时自动播放视频。我在模态打开表单上使用 ng-click,它运行带有 angularjs 控制器的 jquery 脚本。

$scope.startVideo = function (id) {
    $(window).on('shown.bs.modal', function() { 
        console.log('Id nu is: '+id);
        var v = document.getElementById("player"+id);
        v.play();
        console.log('Now playing: player'+id);
    });
}

起初它工作正常。但是当我关闭第一个模态(并停止视频)并在另一个模态上再次触发脚本时,第一个视频开始,第二个视频开始。所以现在我有 2 个视频正在播放。

控制台正在回馈::

正在播放:player1
正在播放:player1

正在播放:player2

模态中可能有趣的部分:

<div class="modal-body">
    {{video.subheader}}<br>
    <video id="player{{video.id}}" width="100%" height="100%" controls>
        <source src="{{video.videourl+video.ext}}" type="video/mp4></source>
    </video>
</div>

<!-- Popup modals below -->
<div id="videomodal{{video.id}}" class="modal fade" role="dialog">
    <div class="modal-dialog">

        <!-- Modal content-->
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h4 class="modal-title">{{video.header}}</h4>
            </div>
            <div class="modal-body">
                {{video.subheader}}<br>
                <video id="player{{video.id}}" width="100%" height="100%" controls>
                    <source src="{{video.videourl+video.ext}}" type="video/mp4"></source>
                </video>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            </div>
        </div>
    </div>
</div>

为什么脚本运行两次?我需要它在模态打开时运行一次。当我停止视频,关闭模态并打开另一个模态时,另一个模态应该开始。两者都不是。

【问题讨论】:

  • 您正在创建一个新变量,v 每次打开模式时。当你关闭它时,你所做的变量不会消失。你需要处理这个
  • @Ronnie 当我在脚本末尾删除 v 时,例如;删除 v;它不会工作。
  • 只做document.getElementById("player" + id).play(); 如果这不能解决问题,请为我们创建一个复制问题的小提琴。
  • @Ronnie 生活可以如此简单。那解决了它。也许将其归档为答案,所以我可以将其标记为答案!

标签: javascript jquery angularjs html twitter-bootstrap


【解决方案1】:

一个快速的猜测是您的事件侦听器不是从特定模式侦听showed.bs.modal,而是从页面上的任何模式侦听。假设每个模态都有自己的 id(或数据属性或其他东西)基于视频的 id(如果它们没有 id,你可以使用 jQuery :has 选择器 - :has('#player'+id) - 或类似的东西)

$scope.startVideo = function (id) {
    $(window).on('shown.bs.modal', '<modal specific selector>', function() { 
        console.log('Id nu is: '+id);
        var v = document.getElementById("player"+id);
        v.play();
        console.log('Now playing: player'+id);
    });
}

【讨论】:

  • 模态确实使用自己的 id。然后我可以再次调用。问题是它不适用于此选择器。现在视频只是无法播放。 $(window).on('shown.bs.modal', '#videomodal'+id, function() {
  • 请发布其中一种模式的 html,和/或尝试 :has 选择器
  • 嗨,我添加了模态。
  • 抱歉——在我看来是对的,不知道为什么它不起作用——显示的.bs.modal 应该被发送到带有“modal”类的元素,它会冒泡然后由委托的处理程序处理。这应该正确地将其过滤为基于您放置的 '#videomodal'+id 的 id 选择器显示的模式 - 然后开始播放(假设事件处理程序仍在安装中)。我假设您仍然没有在另一条评论中推荐的“删除 v”行,因为这会产生问题。
  • 正确我不使用 delete v,因为它不起作用。但是我仍然没有一个很烦人的独奏;)还有其他想法吗?
猜你喜欢
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2013-02-04
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多