|
1 | 1 | /* |
2 | | - * jQuery FlexSlider v2.2.2 |
| 2 | + * jQuery FlexSlider v2.3.0 |
3 | 3 | * Copyright 2012 WooThemes |
4 | 4 | * Contributing Author: Tyler Smith |
5 | 5 | */ |
|
18 | 18 | touch = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch, |
19 | 19 | // depricating this idea, as devices are being released with both of these events |
20 | 20 | //eventType = (touch) ? "touchend" : "click", |
21 | | - eventType = "click touchend MSPointerUp", |
| 21 | + eventType = "click touchend MSPointerUp keyup", |
22 | 22 | watchedEvent = "", |
23 | 23 | watchedEventClearTimer, |
24 | 24 | vertical = slider.vars.direction === "vertical", |
|
70 | 70 | } |
71 | 71 | return false; |
72 | 72 | }()); |
| 73 | + slider.ensureAnimationEnd = ''; |
73 | 74 | // CONTROLSCONTAINER: |
74 | 75 | if (slider.vars.controlsContainer !== "") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer); |
75 | 76 | // MANUAL: |
|
593 | 594 | } |
594 | 595 | }, |
595 | 596 | uniqueID: function($clone) { |
596 | | - $clone.find( '[id]' ).each(function() { |
| 597 | + // Append _clone to current level and children elements with id attributes |
| 598 | + $clone.filter( '[id]' ).add($clone.find( '[id]' )).each(function() { |
597 | 599 | var $this = $(this); |
598 | 600 | $this.attr( 'id', $this.attr( 'id' ) + '_clone' ); |
599 | 601 | }); |
|
602 | 604 | pauseInvisible: { |
603 | 605 | visProp: null, |
604 | 606 | init: function() { |
605 | | - var prefixes = ['webkit','moz','ms','o']; |
606 | | - |
607 | | - if ('hidden' in document) return 'hidden'; |
608 | | - for (var i = 0; i < prefixes.length; i++) { |
609 | | - if ((prefixes[i] + 'Hidden') in document) |
610 | | - methods.pauseInvisible.visProp = prefixes[i] + 'Hidden'; |
611 | | - } |
612 | | - if (methods.pauseInvisible.visProp) { |
613 | | - var evtname = methods.pauseInvisible.visProp.replace(/[H|h]idden/,'') + 'visibilitychange'; |
| 607 | + var visProp = methods.pauseInvisible.getHiddenProp(); |
| 608 | + if (visProp) { |
| 609 | + var evtname = visProp.replace(/[H|h]idden/,'') + 'visibilitychange'; |
614 | 610 | document.addEventListener(evtname, function() { |
615 | 611 | if (methods.pauseInvisible.isHidden()) { |
616 | | - if(slider.startTimeout) clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible |
617 | | - else slider.pause(); //Or just pause |
| 612 | + if(slider.startTimeout) { |
| 613 | + clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible |
| 614 | + } else { |
| 615 | + slider.pause(); //Or just pause |
| 616 | + } |
618 | 617 | } |
619 | 618 | else { |
620 | | - if(slider.started) slider.play(); //Initiated before, just play |
621 | | - else (slider.vars.initDelay > 0) ? setTimeout(slider.play, slider.vars.initDelay) : slider.play(); //Didn't init before: simply init or wait for it |
| 619 | + if(slider.started) { |
| 620 | + slider.play(); //Initiated before, just play |
| 621 | + } else { |
| 622 | + if (slider.vars.initDelay > 0) { |
| 623 | + setTimeout(slider.play, slider.vars.initDelay); |
| 624 | + } else { |
| 625 | + slider.play(); //Didn't init before: simply init or wait for it |
| 626 | + } |
| 627 | + } |
622 | 628 | } |
623 | 629 | }); |
624 | 630 | } |
625 | 631 | }, |
626 | 632 | isHidden: function() { |
627 | | - return document[methods.pauseInvisible.visProp] || false; |
| 633 | + var prop = methods.pauseInvisible.getHiddenProp(); |
| 634 | + if (!prop) { |
| 635 | + return false; |
| 636 | + } |
| 637 | + return document[prop]; |
| 638 | + }, |
| 639 | + getHiddenProp: function() { |
| 640 | + var prefixes = ['webkit','moz','ms','o']; |
| 641 | + // if 'hidden' is natively supported just return it |
| 642 | + if ('hidden' in document) { |
| 643 | + return 'hidden'; |
| 644 | + } |
| 645 | + // otherwise loop over all the known prefixes until we find one |
| 646 | + for ( var i = 0; i < prefixes.length; i++ ) { |
| 647 | + if ((prefixes[i] + 'Hidden') in document) { |
| 648 | + return prefixes[i] + 'Hidden'; |
| 649 | + } |
| 650 | + } |
| 651 | + // otherwise it's not supported |
| 652 | + return null; |
628 | 653 | } |
629 | 654 | }, |
630 | 655 | setToClearWatchedEvent: function() { |
|
719 | 744 | slider.animating = false; |
720 | 745 | slider.currentSlide = slider.animatingTo; |
721 | 746 | } |
| 747 | + |
| 748 | + // Unbind previous transitionEnd events and re-bind new transitionEnd event |
722 | 749 | slider.container.unbind("webkitTransitionEnd transitionend"); |
723 | 750 | slider.container.bind("webkitTransitionEnd transitionend", function() { |
| 751 | + clearTimeout(slider.ensureAnimationEnd); |
724 | 752 | slider.wrapup(dimension); |
725 | 753 | }); |
| 754 | + |
| 755 | + // Insurance for the ever-so-fickle transitionEnd event |
| 756 | + clearTimeout(slider.ensureAnimationEnd); |
| 757 | + slider.ensureAnimationEnd = setTimeout(function() { |
| 758 | + slider.wrapup(dimension); |
| 759 | + }, slider.vars.animationSpeed + 100); |
| 760 | + |
726 | 761 | } else { |
727 | 762 | slider.container.animate(slider.args, slider.vars.animationSpeed, slider.vars.easing, function(){ |
728 | 763 | slider.wrapup(dimension); |
|
871 | 906 | slider.cloneOffset = 1; |
872 | 907 | // clear out old clones |
873 | 908 | if (type !== "init") slider.container.find('.clone').remove(); |
874 | | - slider.container.append(slider.slides.first().clone().addClass('clone').attr('aria-hidden', 'true')).prepend(slider.slides.last().clone().addClass('clone').attr('aria-hidden', 'true')); |
875 | | - methods.uniqueID( slider.slides.first().clone().addClass('clone') ).appendTo( slider.container ); |
876 | | - methods.uniqueID( slider.slides.last().clone().addClass('clone') ).prependTo( slider.container ); |
| 909 | + slider.container.append(methods.uniqueID(slider.slides.first().clone().addClass('clone')).attr('aria-hidden', 'true')) |
| 910 | + .prepend(methods.uniqueID(slider.slides.last().clone().addClass('clone')).attr('aria-hidden', 'true')); |
877 | 911 | } |
878 | 912 | slider.newSlides = $(slider.vars.selector, slider); |
879 | 913 |
|
|
902 | 936 | if (type === "init") { |
903 | 937 | if (!touch) { |
904 | 938 | //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing); |
905 | | - slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing); |
| 939 | + if (slider.vars.fadeFirstSlide == false) { |
| 940 | + slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).css({"opacity": 1}); |
| 941 | + } else { |
| 942 | + slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing); |
| 943 | + } |
906 | 944 | } else { |
907 | 945 | slider.slides.css({ "opacity": 0, "display": "block", "webkitTransition": "opacity " + slider.vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2}); |
908 | 946 | } |
|
1059 | 1097 | animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds |
1060 | 1098 | initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds |
1061 | 1099 | randomize: false, //Boolean: Randomize slide order |
| 1100 | + fadeFirstSlide: true, //Boolean: Fade in the first slide when animation type is "fade" |
1062 | 1101 | thumbCaptions: false, //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav. |
1063 | 1102 |
|
1064 | 1103 | // Usability features |
|
1070 | 1109 | video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches |
1071 | 1110 |
|
1072 | 1111 | // Primary Controls |
1073 | | - controlNav: true, //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage |
| 1112 | + controlNav: true, //Boolean: Create navigation for paging control of each slide? Note: Leave true for manualControls usage |
1074 | 1113 | directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false) |
1075 | 1114 | prevText: "Previous", //String: Set the text for the "previous" directionNav item |
1076 | 1115 | nextText: "Next", //String: Set the text for the "next" directionNav item |
|
0 commit comments