0

Here is my webpage with a puzzle game I am making:

http://www.acsu.buffalo.edu/~jamesber/GameOne.html#

If you take a look at it, keep refreshing the page, it takes a second or two for all the components to load.

I thought it was that the ajax was loading slow but I don't think that is it. Someone please help! Thanks!

My javascript code:

     <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <title>Untitled Document</title>
   <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes   /smoothness/jquery-ui.css" />
 <style>
 #puzzle {
width: 450px;
height: 450px;
outline: 4px solid black;
padding: 0px;
-webkit-padding-start: 0px;
margin-left:440px;
margin-right:auto;
margin-top:-205px;
 }

  .helper {
width: 200px;
height: 200px;
border: 1px solid black;
margin: 0px;
 }

  .piece {
float: left;
display: block;
width: 148px;
height: 148px;
border: 1px solid black;
margin: 0px;
background-size: 450px 450px;
background-repeat:no-repeat;
 }
 .piece span {
display:inline-block;
border:1px solid #FFFFFF;
color: #B80000;
display: none;
 }

 .ui-dialog .ui-dialog-title {
 text-align: center;
 width: 100%;
 }

 </style>
 <script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
 <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.js"></script>
 <script type="text/javascript">

   $(function () {

var plant = "";

$.when($.ajax({"url":"http://botanicalapp.com/api/v1/plants/?photo=true"}))
.done(function(fullData){
    (function(){
        var rand = Math.floor(Math.random()*fullData.length)
        plant = fullData[rand].plant.image_default.url;
    })()
    startGame();
});

   function startGame() {

        $("#puzzle div").css({'background-image':'url('+ plant +')'});
        $("#helper").attr("src",plant);
        var puzzle = $("#puzzle");
        var pieces = $("#puzzle div");

        pieces.sort(function (a, b) {
            var temp = parseInt(Math.random() * 100);
            var isOddOrEven = temp % 2;
            var isPosOrNeg = temp > 5 ? 1 : -1;
            return (isOddOrEven * isPosOrNeg);
        }).appendTo(puzzle);

        var checkDone = false;
        var timer;
        var secs = 0;
        var mins = 0;
        var millsecs = 0;
        var timeString = document.getElementById("time");
        timeString.innerHTML = "00:00:00";

        function update(){
            if(millsecs > 98) {
                secs++;
                millsecs = 0;
                if(secs > 59){
                    mins++;
                    secs = 0;
                }
            } 
            else {
                millsecs++;
            }
            if((millsecs<10) && (secs<10) && (mins<10)) {
        timeString.innerHTML = '0' + mins + ':0' + secs + ':0' + millsecs;
            }
            else if ((millsecs<10) && (secs<10)) {
            timeString.innerHTML = mins + ':0' + secs + ':0' + millsecs;
            }
            else if ((millsecs<10) && (mins<10)) {
        timeString.innerHTML = '0' + mins + ':' + secs + ':0' + millsecs;
            }
            else if((secs<10) && (mins<10)){
        timeString.innerHTML = '0' + mins + ':0' + secs + ':' + millsecs;
            } 
            else if (millsecs<10) {
        timeString.innerHTML = mins + ':' + secs + ':0' + millsecs;
            }
            else if (secs<10){
        timeString.innerHTML = mins + ':0' + secs + ':' + millsecs;
            } 
            else if (mins<10) {
        timeString.innerHTML = '0' + mins + ':' + secs + ':' + millsecs;
            } 
            else {
                    timeString.innerHTML = mins + ':' + secs + ':' + millsecs;
            }   
        }

        function start(){
            timer = setInterval(function() {update()}, 10);
        }

  document.getElementById("instr").onclick=function(){ $("#instruct").dialog("open"); };

        start();    
        initSwap();

        $("#final").dialog({
            autoOpen: false,
            modal: true,
            width: 900,
            resizable: false,
            height: 540,
            position: [250,75],
            dialogClass: "fixed-dialog",
            title: "Congratulations Puzzle Solved!",
            draggable: false
        });

        $("#instruct").dialog({
            autoOpen: false,
            modal: true,
            width: 700,
            resizable: false,
            height: 250,
            position: [325,75],
            dialogClass: "fixed-dialog",
            draggable: false,
            title: "Puzzle Instructions",
            open: function(ev, ui) { clearTimeout(timer); },
            close: function(ev, ui) { if (!checkDone) { start(); } }
        });

        function initSwap() {
            initDroppable($("#puzzle div"));
            initDraggable($("#puzzle div"));
         }


          function initDraggable($elements) {
             $elements.draggable({
                appendTo: "body",
                helper: "clone",
                cursor: "move",
                revert: "invalid"
            });
          }

        function initDroppable($elements) {
              $elements.droppable({
                activeClass: "ui-state-default",
                hoverClass: "ui-drop-hover",
                accept: ":not(.ui-sortable-helper)",
                over: function (event, ui) {
                    var $this = $(this);
                },
                drop: function (event, ui) {
                    var $this = $(this);
                    var linew1 = $(this).after(ui.draggable.clone());
                    var linew2 = $(ui.draggable).after($(this).clone());
                    $(ui.draggable).remove();
                    $(this).remove();
                    initSwap();
                    var finished = "1,2,3,4,5,6,7,8,9";
                    var started = '';
                    $("#puzzle div").each(function(){
                        var image = $(this).attr("id");
                 started += image.replace("recordArr_","")+",";
                        });
                   started = started.substr(0,(started.length)-1);
                        if(started == finished){
                            checkDone = true;
                            clearTimeout(timer);
                            $("#thePlant").attr("src",plant);
                            $("#final").dialog("open");
                            }
                }
        });
    }
}
  });

 </script>

 </head>
 <body>
<big><big><big><div id="time"></div></big></big></big>
<div id="help"><image id="helper" width="200", height="200"/></div>
<div id="final"><img id="thePlant" width="450", height="450" <p align="top"> Plant Information! </p></div>
<div id="instruct"><p> To begin playing a picture will appear that has been scrambled. 
Your job is to drag each piece into the location you think it should be. 
When you move all the pieces into their correct locations a window will appearthat will tell you 
more about that plant and where to find it when you visit the Botanical Gardens. 
If you need help, click on the hints button and numbers will appear in the corners 
of the pictures to show you what order the pieces should be in. Good Luck!</p></div>
<div id="maindiv">
    <div id="puzzle">
        <div id="1" class="piece" style="background-position: -000px -000px;"><b><big><big><span>1</span></big></big></b></div>
        <div id="6" class="piece" style="background-position: -301px -151px;"><b><big><big><span>6</span></big></b></big></div>
        <div id="9" class="piece" style="background-position: -301px -301px;"><b><big><big><span>9</span></big></big></b></div>
        <div id="4" class="piece" style="background-position: -000px -151px;"><b><big><big><span>4</span></big></big></b></div>
        <div id="3" class="piece" style="background-position: -301px -000px;"><b><big><big><span>3</span></big></big></b></div>
        <div id="7" class="piece" style="background-position: -000px -301px;"><b><big><big><span>7</span></big></big></b></div>
        <div id="2" class="piece" style="background-position: -151px -000px;"><b><big><big><span>2</span></big></big></b></div>
        <div id="5" class="piece" style="background-position: -151px -151px;"><b><big><big><span>5</span></big></big></b></div>
        <div id="8" class="piece" style="background-position: -151px -301px;"><b><big><big><span>8</span></big></big></b></div>
    </div>
</div>

Instructions Toggle Hints

Nolemonpledge
  • 139
  • 1
  • 2
  • 11

4 Answers4

0

Use Firebug, you can see in the network tab which part is slow.

You should extract your javascript and css in seperate files, they can be compressed then.

krackmoe
  • 1,743
  • 7
  • 29
  • 53
0

As other users suggested - if you are loading 3rd party content from the internet, you have to keep in mind that download times may vary on each page refresh.

Anyway, my advice is to move your custom js code into separate file and minify it when you finish the development process.

And the most important: place that file just before </body> tag.

The reason for doing so is that scripts at the head of a page are blocking the browser. It must stop processing the website until all of the scripts are downloaded and parsed. A great discussion about that matter is available on stackoverflow, you should go through it here.

Community
  • 1
  • 1
Mike Grabowski
  • 1,955
  • 16
  • 17
0

A get-request for http://botanicalapp.com/api/v1/plants/?photo=true is taking around 2-3.5 seconds so you're probably not going to be able to process it faster than that.

Chrome Developer Tools Network Tab

I would advice you to move the script tag containing your sites javascript to the bottom of the page. It doesn't have to reside in head and putting it right before the closing tag of body allows other external component on the page to download as quickly as possible before the scripts are loaded.

0

Nothing seems to make it better. I was wondering. Is there a way to put like a smoother looking loading screen to cover it up? Was looking into a js spinner but couldn't get that to work right. But could this be done?

Nolemonpledge
  • 139
  • 1
  • 2
  • 11