javascript - Angular 中断了 jQuery 幻灯片放映

标签 javascript jquery html css angularjs

我正在研究这个 template在应用程序中包含 Angular 后,很多功能都被破坏了。 A 以某种方式设法修复了很多问题,但我无法让此幻灯片放映正常工作。

这是我的HTML

<!doctype html>
<!--[if IE 9 ]><html class="ie9" lang="en"><![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--><html lang="en"><!--<![endif]-->
<head>
    <link rel="icon" type="image/ico" href="images/fav.ico">
    <!--stylesheet include-->
    <link rel="stylesheet" type="text/css" media="all" href="css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" media="all" href="css/camera.css">
    <link rel="stylesheet" type="text/css" media="all" href="css/owl.carousel.css">
    <link rel="stylesheet" type="text/css" media="all" href="css/owl.transitions.css">
    <link rel="stylesheet" type="text/css" media="all" href="css/jquery.custom-scrollbar.css">
    <link rel="stylesheet" type="text/css" media="all" href="css/style.css">
    <link rel="stylesheet" type="text/css" media="all" href="css/lightbox.css">
    <!--font include-->
    <link href="css/font-awesome.min.css" rel="stylesheet">
</head>
<body ng-app="app">
<!--slider-->
<div class="camera_wrap m_bottom_0" ng-controller="slideShowCtrl" ng-show="slideShow()">
    <div data-src="images/slide_02.jpg" data-custom-thumb="images/slide_02.jpg">
        <div class="camera_caption_1 fadeFromTop t_align_c d_xs_none">
            <div class="f_size_large color_light tt_uppercase slider_title_3 m_bottom_5">Meet New Theme</div>
            <hr class="slider_divider d_inline_b m_bottom_5">
            <div class="color_light slider_title tt_uppercase t_align_c m_bottom_45 m_sm_bottom_20"><b>Attractive &amp; Elegant<br>HTML Theme</b></div>
            <div class="color_light slider_title_2 m_bottom_45">$<b>15.00</b></div>
            <a href="#" role="button" class="tr_all_hover button_type_4 bg_scheme_color color_light r_corners tt_uppercase">Buy Now</a>
        </div>
    </div>
    <div data-src="images/slide_01.jpg" data-custom-thumb="images/slide_01.jpg">
        <div class="camera_caption_2 fadeIn t_align_c d_xs_none">
            <div class="f_size_large tt_uppercase slider_title_3 scheme_color">New arrivals</div>
            <hr class="slider_divider type_2 m_bottom_5 d_inline_b">
            <div class="color_light slider_title tt_uppercase t_align_c m_bottom_65 m_sm_bottom_20"><b><span class="scheme_color">Spring/Summer 2014</span><br><span class="color_dark">Ready-To-Wear</span></b></div>
            <a href="#" role="button" class="d_sm_inline_b button_type_4 bg_scheme_color color_light r_corners tt_uppercase tr_all_hover">View Collection</a>
        </div>
    </div>
    <div data-src="images/slide_03.jpg" data-custom-thumb="images/slide_03.jpg">
        <div class="camera_caption_3 fadeFromTop t_align_c d_xs_none">
            <img src="images/slider_layer_img.png" alt="" class="m_bottom_5">
            <div class="color_light slider_title tt_uppercase t_align_c m_bottom_60 m_sm_bottom_20"><b class="color_dark">up to 70% off</b></div>
            <a href="#" role="button" class="d_sm_inline_b button_type_4 bg_scheme_color color_light r_corners tt_uppercase tr_all_hover">Shop Now</a>
        </div>
    </div>
</div>

<div ng-view></div>

<!--scripts include-->
<script src="js/jquery-2.1.4.js"></script>
<script src="js/jquery-ui.js"></script>
<script src="js/jquery-migrate-1.2.1.min.js"></script>
<script src="js/retina.js"></script>
<script src="js/camera.min.js"></script>
<script src="js/jquery.easing.1.3.js"></script>
<script src="js/waypoints.min.js"></script>
<script src="js/jquery.isotope.min.js"></script>
<script src="js/owl.carousel.min.js"></script>
<script src="js/jquery.custom-scrollbar.js"></script>
<script src="js/scripts.js"></script>
<script src="js/lightbox.js"></script>
<script src="js/angular.js"></script>
<script src="js/angular-resource.js"></script>
<script src="js/angular-route.js"></script>
<script src="js/angular-ui.min.js"></script>
<script src="js/angular-animate.js"></script>
<script src="js/sortable.js"></script>
<script src="js/ng-file-upload.js"></script>
<script src="js/ng-file-upload-shim.js"></script>
<script src="app/app.js"></script>
<script src="app/controllers.js"></script>
<script src="app/factory.js"></script>
<script src="app/filters.js"></script>

</body>
</html>

我的 Controller

controllers.slideShowCtrl = function($scope, $location){
    $scope.slideShow = function(){
        if($location.url() == '/' || $location.url() == '/home'){
            $scope.slideShowView = true;
            return true;
        }else{
            $scope.slideShowView = false;
            return false;
        }
    }
}

这是用于创建幻灯片的 jQuery

// camera slideshow
(function(){
    var cs = $('.camera_wrap');
    if(cs.length){
        cs.camera({
            height: '41%',
            navigation: true,
            pagination: true,
            playPause:false,
            thumbnails: false,
            time: 4000,
            transPeriod : 1000,
            navigationHover: false,
            onLoaded: function() {
                var image = $('.camera_wrap .camera_src > [data-src]'),
                    len = image.length,
                    bullet = $('.camera_wrap .camera_pag_ul > li');
                if(bullet.find('.custom_thumb').length) return;
                for(var i = 0; i < len; i++){
                    bullet.eq(i).append('<div class="custom_thumb tr_all_hover"><img src="' + image.eq(i).data('custom-thumb') + '" alt=""></div>');
                }
                bullet.on("mouseenter mouseleave",function(){
                    $(this).children('.custom_thumb').toggleClass("active");
                });
            }
        });
        cs.find('.camera_prev').append('<i class="fa fa-angle-left"></i>');
        cs.find('.camera_next').append('<i class="fa fa-angle-right"></i>');
    }
})();

问题就在这里。在第一次加载或重新加载 (f5) 时, slider 看起来不错并且播放效果很好。

Slider OK

点完页面再访问首页(#/home), slider 有时断,有时不断,有时自己修。

Slider broken

再次刷新网页后, slider 工作正常并且播放效果很好。

如果你们需要任何额外的代码块,请告诉我,我会提供。

谢谢

最佳答案

理论上,当您在 Angular View 中放置 JQ 幻灯片时。每次访问 View 时都需要初始化。因为在 View /路径更改时,您的幻灯片将从 DOM 中丢弃,因此幻灯片的所有内容和实例也将被丢弃。

The problem is here. On first load or reload (f5), slider looks ok and plays well.

是的,它应该可以工作,因为幻灯片放映效果很好

After clicking trough page and again visiting home (#/home), slider sometimes break, sometimes don't, sometimes it fixes by him self.

幻灯片没有正确初始化,因为它在路由/ View 更改时从 DOM 中丢弃

=> 要使其正常工作,只需在您的 View 呈现后重新初始化即可。

// This is a dirty patch up, and only showing the fix in most basic way. So you could understand the concept of angular with other DOM manipulation like JQ.
// You should try to study more about DOM manipulation in angular. And for better solution, you can go with directive
controllers.slideShowCtrl = function($scope, $location, $timeout){
    $scope.slideShow = function(){
        if($location.url() == '/' || $location.url() == '/home'){
            $scope.slideShowView = true;
            return true;
        }else{
            $scope.slideShowView = false;
            return false;
        }

        // I just putting slideshow initial right after $scope.slideShow() return true.
        // To make sure slideshow got initial after the ng-show condition return true.
        $scope.$watch(function () {
            return $scope.slideShow();
        }, function (isShow) {

            // This $timeout to 100% sure slideshow initial only happen after view got all its base content rendered
            $timeout(function () {
                if(isShow){
                    var cs = $('.camera_wrap');
                    if(cs.length){
                        cs.camera({
                            height: '41%',
                            navigation: true,
                            pagination: true,
                            playPause:false,
                            thumbnails: false,
                            time: 4000,
                            transPeriod : 1000,
                            navigationHover: false,
                            onLoaded: function() {
                                var image = $('.camera_wrap .camera_src > [data-src]'),
                                    len = image.length,
                                    bullet = $('.camera_wrap .camera_pag_ul > li');
                                if(bullet.find('.custom_thumb').length) return;
                                for(var i = 0; i < len; i++){
                                    bullet.eq(i).append('<div class="custom_thumb tr_all_hover"><img src="' + image.eq(i).data('custom-thumb') + '" alt=""></div>');
                                }
                                bullet.on("mouseenter mouseleave",function(){
                                    $(this).children('.custom_thumb').toggleClass("active");
                                });
                            }
                        });
                        cs.find('.camera_prev').append('<i class="fa fa-angle-left"></i>');
                        cs.find('.camera_next').append('<i class="fa fa-angle-right"></i>');
                    }
                }
            }, 0)

        })
    }
}

附言 请注意,由于我们没有任何 fiddle/plunker,因此为了确保解决方案有效,我应用了一些技巧,这些技巧将最大限度地为我的答案提供工作代码。您可以尝试删除 $timeout 以查看它是否有效

关于javascript - Angular 中断了 jQuery 幻灯片放映,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35389967/

相关文章:

javascript - 如何在点击时重复增加 CSS 属性的值?

javascript - 单击时 HTML/Javascript/Bootstrap 无法隐藏按钮

javascript - 从内部库捕获设置超时?

javascript - 哪个更好 : &lt;script type ="text/javascript">. ..&lt;/script&gt; 或 &lt;script&gt;...&lt;/script&gt;

jquery - 如果从高级搜索对话框中删除行,如何清除工具栏中的过滤器值

javascript - 为工具提示自定义 css 后,它显示两次

javascript - 在 Vue.js 中,更改数据数组中所有项目的特定属性值

javascript - Html 密码框,如果正确,淡入显示博客

javascript - getElementById 的非常简单的 JavaScript 示例。为什么我收到错误?

jquery - Select2 填充 select 时出现问题