3

I'm working on a website that will feature two banners- one for mobile and one for desktop. I've got the two banners in place but there seems to be an issue with the two seperate javascript files conflicting as the mobile banner doesn't work correctly when the desktop banner javascript file is included. Now I've narrowed it down and think a setTimeout in the desktop javascript file is causing the issue as when I remove that code the mobile banner works fine. To show this is the javascript code for the mobile banner (the issue lies within the click event of the prev/next buttons):

//Add click events to buttons
$('.js-showcase-next').click(function(event) {
    event.preventDefault();

    if ($(':animated').length) {
        return false;
    } else {
        // Clear the interval, animate the banner and then restart the interval
        clearInterval(banner_interval);
        bannerSwitch(banner_list, false, false);
        banner_interval = setInterval(function() {
            bannerSwitch(banner_list);
        }, wait_time);
    }

});

$('.js-showcase-prev').click(function(event) {
    event.preventDefault();

    if ($(':animated').length) {
        return false;
    } else {
        // Clear the interval, animate the banner and then restart the interval
        clearInterval(banner_interval);
        bannerSwitch(banner_list, true, false);
        banner_interval = setInterval(function() {
            bannerSwitch(banner_list);
        }, wait_time);
    }

});

This is the javascript of the desktip banner that's causing the issue (when removed the mobile banner works fine):

 var wait = setInterval(function() {
     if (!$(currentBanner, loading).is(":animated")) {
         clearInterval(wait);
         loading.stop().fadeOut(300, function() {
             setTimeout(function() {

                 bannerInit();
             }, 800);
             startInterval();
             if (initialLoad) {
                 initialLoad = false;
                 next.slideDown();
                 previous.slideDown();
             }
         });
     }
 }, 200);

It seems that the setTimeout it causing the issue but I don't understand why (they're two seperate javascript files). Can anybody shed some light and maybe have an idea how to fix it?

Update: This is the code for the bannerInit

function bannerInitControls() {
    previous.bind("click", function() {
        $(navigationSelector + currentIndex).removeClass(navigationSelectedClass);
        if (currentIndex == 0) {
            currentIndex = bannerCount;
        } else {
            currentIndex--;
        }
        $(navigationSelector + currentIndex).addClass(navigationSelectedClass);
        bannerLoad(currentIndex);
    });
    previous.bind("mouseenter", function() {
        $("#banner-nav-prev").stop().delay(300).show();
    });
    previous.bind("mouseleave", function() {
        $("#banner-nav-prev").stop().delay(300).hide();
    });
    next.bind("click", function() {
        $(navigationSelector + currentIndex).removeClass(navigationSelectedClass);
        if (currentIndex + 1 < banners.length) {
            currentIndex++;
        } else {
            currentIndex = 0;
        }
        $(navigationSelector + currentIndex).addClass(navigationSelectedClass);
        bannerLoad(currentIndex);
    });
    next.bind("mouseenter", function() {
        $("#banner-nav-next").stop().delay(300).show();
    });
    next.bind("mouseleave", function() {
        $("#banner-nav-next").stop().delay(300).hide();
    });

}

function bannerInitNavigation(index) {
    for (var i = 0; i <= bannerCount; i++) {
        var listItemClass = 'banner-nav-' + i;
        var listItemSelector = listItemClass;
        if (i == index) {
            listItemClass += ' banner-nav-current';
        }
        var listItem = '<li class="' + listItemClass + '"></li>'
        $(".banner-nav-list").append(listItem);
    }
}
pookie
  • 2,890
  • 5
  • 34
  • 70
  • 2
    Can you show the code for the `bannerInit()` function please? Could you also provide both the code of Mobile and Desktop so we can see the differences between the two and what is being executed. Thanks – lukehillonline Jan 21 '16 at 10:45
  • Simple debugging hint: Add a `console.log("bla");` into your timeout, if it appears as expected in the console the timeout doesnt cause the problems – Tom Doodler Jan 21 '16 at 10:58
  • Also you likely want to change to `class="js-showcase" id="showcase-next"`so you can have ONE function using `$('.js-showcase')` – mplungjan Jan 21 '16 at 10:59
  • @TomDoodler I have tried adding the console.log in the timeout, it shows in both the desktop banner as well as the mobile banner but as far as I understand it shouldn't show with the mobile banner? –  Jan 21 '16 at 11:17

1 Answers1

0

In each of your javascript files, wrap your code in

$(function(){

...your code here

});

Update: Instead of loading both scripts, just load the mobile banner script if a mobile device is detected, otherwise load the desktop version:

var isMobile = false; //initiate as false
// device detection
if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent) 
    || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) isMobile = true;

if(isMobile){
    //load the mobile banner script
}else{
    //load the desktop banner script
}

The downside with this approach is that if a new mobile device comes out, you need to update this snippet.

Another method is get the screen size, such as explained in the second answer in the link below. source: What is the best way to detect a mobile device in jQuery?

Alternatively, if you want to use a script, you can try this:

Github: https://github.com/borismus/device.js

Demo: http://borismus.github.io/device.js/sample/desktop.html

Community
  • 1
  • 1
pookie
  • 2,890
  • 5
  • 34
  • 70