Search code examples
javascriptjqueryjquery-events

Animations not playing on load or on click in JavaScript


Working on a tip calculator with an animation on an h1 tag and a slideDown and slideUp on click on the h2 tags. Problem is, none of the animations are playing and the click event isn't working either. Here is the HTML file:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Tip Calculator</title>
    <link rel="shortcut icon" href="images/favicon.ico">
    <link rel="stylesheet" href="midtermcss.css">
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.js"></script>
    <script src="animationJS.js"></script>
</head>

<body>
    <section id="faqs">
        <h1>Tip facts</h1>
        <h2>Things to know before you tip</h2>
        <div>
            <p>Tips Account for 44 Billion dollars of the Food Industry</p>
            
            <p>7 States require servers to be paid minimum wage like everyone else</p>
                <ul>
                    <li>Minnessota</li>
                    <li>Montana</li>
                    <li>Washington</li>
                    <li>Oregon</li>
                    <li>California</li>
                    <li>Nevada</li>
                    <li>Alaska</li>
                </ul>
            <p>Current Federal minimum tipped wage is $2.13 per hour can you live on that?</p>
            <p>Charging with Credit/Debit cards tends to reduce the average tip</p>
        </div>      
    </section>

    <section id="js">
    <h1 id="heading">Tip Calculator</h1>
        <label for="billAmount">Total Amount Of Bill:</label>
        <input type="text" id="billAmount"><br>
        
        <label for="percentTip">Percent To Tip:</label>
        <input type="text" id="percentTip"><br>
        
        <label for="amountPeople">How Many People?:</label>
        <input type="text" id="amountPeople"><br>
        
        <label for="totalTip">Tip Total:</label>
        <input type="text" id="totalTip"><br>
        
        <label>&nbsp;</label>
        <input  type="button" id="calculate" value="Calculate"><br>
    </section>
</body>
</html>

Here is the JS file:

$(document).ready(function() {
    // runs when an h2 heading is clicked
    $("#faqs h2").toggle(
        function() {
            $(this).toggleClass("minus");
            $(this).next().slideDown(1000, "easeOutBounce");
        },
        function() {
            $(this).toggleClass("minus");
            $(this).next().slideUp(1000, "easeInBounce");
        }
    );

    $("#faqs h1").animate({
        fontSize: "400%",
        opacity: 1,
        left: "+=375"
    }, 1000, "easeInExpo")
        .animate({
        fontSize: "175%",
        left: "-=200"
    }, 1000, "easeOutExpo");

    $("#faqs h1").click(function() {
        $(this).animate({
            fontSize: "400%",
            opacity: 1,
            left: "+=375"
        }, 2000, "easeInExpo")
            .animate({
            fontSize: "175%",
            left: 0
        }, 1000, "easeOutExpo");
    });

});


var $ = function(id) {
    return document.getElementById(id);
}
var calculateClick = function() {
    var billAmount = parseFloat($("billAmount").value);
    var percentTip = parseFloat($("percentTip").value);
    var amountPeople = parseInt($("amountPeople").value);

    if (isNaN(billAmount) || billAmount <= 0) {
        alert("Your bill can't be 0 or less.");
    } else if (isNaN(percentTip) || percentTip <= 0) {
        alert("The percentage should be a whole number.");
    } else if (isNaN(amountPeople) || amountPeople <= 0) {
        alert("You are 1 person never count yourself as less.");
    } else {
        var total = billAmount * (percentTip / 100) / amountPeople;
        $("totalTip").value = total.toFixed(2);
    }
}

window.onload = function() {
    $("calculate").onclick = calculateClick;
    $("billAmount").focus();
}

Last but not least the CSS file since the open and minus classes are listed in there

        * {
    margin: 0;
    padding: 0;
}

body {
    font-family: Arial, Helvetica, sans-serif;
    background-color: white;
    margin: 0 auto;
    width: 500px;
    border: 3px solid blue;
}
section {
    padding: 0 1em .5em;
}
section.js {
    padding: 0 1em .5em;
}
h1 {
    text-align: center;
    margin: .5em 0;
}
label {
    float: left;
    width: 10em;
    text-align: right;
}
input {
    margin-left: 1em;
    margin-bottom: .5em;
}
#faqs h1 { 
    position: relative;
    left: -168px;
    font-size: 125%;
    color: blue;
}
h2 {
    font-size: 120%;
    padding: .25em 0 .25em 25px;
    cursor: pointer;
    background: url(images/plus.png) no-repeat left center;
}
h2.minus {
    background: url(images/minus.png) no-repeat left center;
}
div.open {
    display: block;
}
ul {
    padding-left: 45px;
}
li {
    padding-bottom: .25em;
}
p {
    padding-bottom: .25em;
    padding-left: 25px;
}

I can't figure out for the life of me why the animations work in a separate test file but when I use them now in my tip calculator they don't. I'm using Murach's JavaScript and jQuery book but this section has been terribly hard to understand.


Solution

  • Your issue is that you include jQuery but later on in the global scope you redefine the $:

    var $ = function(id) {
        return document.getElementById(id);
    }
    

    Fiddle: http://jsfiddle.net/AtheistP3ace/u0von3g7/

    All I did was change the variable name holding that function and replace it in the areas you were using it. Specifically:

    var getById = function(id) {
        return document.getElementById(id);
    }
    var calculateClick = function() {
        var billAmount = parseFloat(getById("billAmount").value);
        var percentTip = parseFloat(getById("percentTip").value);
        var amountPeople = parseInt(getById("amountPeople").value);
    
        if (isNaN(billAmount) || billAmount <= 0) {
            alert("Your bill can't be 0 or less.");
        } else if (isNaN(percentTip) || percentTip <= 0) {
            alert("The percentage should be a whole number.");
        } else if (isNaN(amountPeople) || amountPeople <= 0) {
            alert("You are 1 person never count yourself as less.");
        } else {
            var total = billAmount * (percentTip / 100) / amountPeople;
            getById("totalTip").value = total.toFixed(2);
        }
    }
    
    window.onload = function() {
        getById("calculate").onclick = calculateClick;
        getById("billAmount").focus();
    }
    

    $ is just shorthand for jQuery. When you include jQuery it creates two functions for you that both do the same thing. jQuery and $. If you set $ equal to something else you have effectively overwritten jQuery library included in your page and it will no longer operate as you would expect. All jQuery functionality begins with using $ or jQuery function. Once that returns a jQuery object to you, you can begin chaining and calling functions off those objects but to get a jQuery object you need to use the jQuery or $ function.

    You mentioned in a comment above your teacher had you do that to fix something. I imagine it was because jQuery was not initially included so he just created the $ selector function to get you moving but I would hope he explained why he did that and how it can affect things later.