views:

75

answers:

3

I found this site/tutorial/demo from another question here on SO.

Very nice and clean code. However I am having problems with it when running from localhost where I test all changes to my sites. I am running pretty much the exact same code (I have all mine in /lib not /js).

I've stepped through the code in FireBug and inspected the generated source and it is adding the script tags, but a breakpoint on the loaded function never triggers.

To test whether the files are being loaded and not registered, I am loading jquery and in the standard $(document).ready function have a simple alert but FireBug gives the error of '$ is not defined' which means that while loading.js updates the html file, the browser (FireFox, but IE8 exhibits the same behaviour) isn't loading the files.

UPDATE: I've enabled the Net tab. When the page is hard reloaded (via ctrl+f5) there are 9 requests, 8 of which is 304 and a 404 (which is the call to load logo.png which I never copied), the rest are ColorBox css files. None of the objects listed are js files that should be loaded via the loading.js file which is being loaded. All of the times are in low milliseconds and nothing seems out the ordinary.

UPDATE2: Here's the source:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>yensdesign.com - How to create a stylish loading bar as Gmail in jQuery</title>
    <link rel="stylesheet" href="css/loading.css" type="text/css" media="screen" />
    <script src="lib/loading.js" type="text/javascript"></script>
</head>
<body onload="start()">
    <div id="restart">

        <a href="http://www.yensdesign.com"&gt;&lt;img src="logo.jpg" alt="Go to yensdesign.com"/></a>
        <div id="button" onclick="restart()"><input type="submit" value="Restart me please!" /></div>
    </div>
    <div id="loadingZone">
        <div id="loadingSms">LOADING</div>
        <div id="infoProgress">0%</div>
        <br class="clear" />
        <div id="loadingBar">

            <div id="progressBar">&nbsp;</div>
        </div>
        <div id="infoLoading"></div>
    </div>
</body>
</html>

Note the change in name from general.css to loading.css. This is loading.css which apart from the name change is identical to general.css:

html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em,
font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody,
 tfoot, thead, tr, th, td {
border:0pt none;
font-family:inherit;
font-size:100%;
font-style:inherit;
font-weight:inherit;
margin:0pt;
padding:0pt;
vertical-align:baseline;
}
body{
background:#fff none repeat scroll 0%;
font-size: 12px;
font-family:tahoma,arial,sans-serif;
margin:0pt;
height:100%;
}
table {
border-collapse:separate;
border-spacing:0pt;
}
caption, th, td {
font-weight:normal;
text-align:left;
}
blockquote:before, blockquote:after, q:before, q:after {
content:"";
}
blockquote, q {
quotes:"" "";
}
a{
cursor: pointer;
text-decoration:none;
}
.clear{
clear:both;
}
#button{
text-align:center;
margin:50px 50px 150px 50px;
}
#restart{
display:none;
text-align:center;
}
#loadingZone{
margin:0 auto;
width:410px;
text-align:center;
}
#loadingBar{
border:1px solid #c2c2c2;
height:2px;
text-align:left;
line-height:0;
margin:0;
padding:0;
overflow:hidden; /*fix for IE 6*/
}
#progressBar{
height:2px;
line-height:0;
margin:0;
padding:0;
background:#b3f83d;
width:0%;
}
#loadingSms{
color:#6ea1fa;
float:left;
padding:10px 2px;
}
#infoProgress{
color:#6ea1fa;
float:right;
padding:10px 2px;
}
#infoLoading{
padding:10px;
color:#b9b9b9;
font-size:10px;
}

And finally loading.js. Note the changes to the line which adds the creates the script tag has been modified to reflect my directory layout.

/***************************/
//@Author: Adrian "yEnS" Mato Gondelle & Ivan Guardado Castro
//@website: www.yensdesign.com
//@email: [email protected]
//@license: Feel free to use it, but keep this credits please!                    
/***************************/


var LoadBar = function(){
    this.value = 0;
    this.sources = Array();
    this.sourcesDB = Array();
    this.totalFiles = 0;
    this.loadedFiles = 0;
};
//Show the loading bar interface
LoadBar.prototype.show = function() {
    this.locate();
    document.getElementById("loadingZone").style.display = "block";
};
//Hide the loading bar interface
LoadBar.prototype.hide = function() {
    document.getElementById("loadingZone").style.display = "none";
};
//Add all scripts to the DOM
LoadBar.prototype.run = function(){
    this.show();
    var i;
    for (i=0; i<this.sourcesDB.length; i++){
        var source = this.sourcesDB[i];
        var head = document.getElementsByTagName("head")[0];
        var script = document.createElement("script");
        script.type = "text/javascript";
        script.src = source
        head.appendChild(script);
    }    
};
//Center in the screen remember it from old tutorials? ;)
LoadBar.prototype.locate = function(){
    var loadingZone = document.getElementById("loadingZone");
    var windowWidth = document.documentElement.clientWidth;
    var windowHeight = document.documentElement.clientHeight;
    var popupHeight = loadingZone.clientHeight;
    var popupWidth = loadingZone.clientWidth;
    loadingZone.style.position = "absolute";
    loadingZone.style.top = parseInt(windowHeight/2-popupHeight/2) + "px";
    loadingZone.style.left = parseInt(windowWidth/2-popupWidth/2) + "px";
};
//Set the value position of the bar (Only 0-100 values are allowed)
LoadBar.prototype.setValue = function(value){
    if(value >= 0 && value <= 100){
        document.getElementById("progressBar").style.width = value + "%";
        document.getElementById("infoProgress").innerHTML = parseInt(value) + "%";
    }
};
//Set the bottom text value
LoadBar.prototype.setAction = function(action){
    document.getElementById("infoLoading").innerHTML = action;
};
//Add the specified script to the list
LoadBar.prototype.addScript = function(source){
    this.totalFiles++;
    this.sources[source] = source;
    this.sourcesDB.push(source);
};
//Called when a script is loaded. Increment the progress value and check if all files are loaded
LoadBar.prototype.loaded = function(file) {
    this.loadedFiles++;
    delete this.sources[file];
    var pc = (this.loadedFiles * 100) / this.totalFiles;
    this.setValue(pc);
    this.setAction(file + " loaded");
    //Are all files loaded?
    if(this.loadedFiles == this.totalFiles){
        setTimeout("myBar.hide()",300);
        //load the reset button to try one more time!
        document.getElementById("restart").style.display = "block";
    }
};
//Global var to reference from other scripts
var myBar = new LoadBar();

//Checking resize window to recenter :)
window.onresize = function(){
    myBar.locate();
};
//Called on body load
start = function() {
    myBar.addScript("lib/jquery-min.js");
    myBar.addScript("lib/jquery.colorbox-min.js");
    myBar.addScript("lib/jquery.pan-min.js");
    myBar.addScript("lib/raphael-min.js");
    myBar.addScript("lib/map.js");
    myBar.run();
};
//Called on click reset button
restart = function(){
    window.location.reload();
}; 

Any ideas of how to make a script that plainly works online work in localhost? Or a similar method to do a loading screen that does work in localhost?

+1  A: 

Without seeing the code, I'm guessing you're running the page from your file system, and the javascript paths are pointing at the root directory, something like /example.js

You should indeed use the NET tab of Firebug to diagnose if the files aren't being loaded, if it's greyed out, its disabled, you should be able to on the down arrow beside the "Net" title, and enable it.

SamStephens
The js files are point to the correct location. The generated source location is `<script src="lib/jquery-min.js" type="text/javascript">` and the original tag (that occurred near the end of the body) was `<script src="lib/jquery-min.js" type="text/javascript" charset="utf-8">`
graham.reeds
Updated answer with results of looking at the Net tab (which is to say nothing).
graham.reeds
+2  A: 

You said you moved your code to /lib instead of /js. Did you change the code to reflect this? Its hardcoded on line 34 to assume the files are there: script.src = "js/" + source. Also, if your firebug net tab is disabled, click the tab and an arrow should show up next to it. Click that arrow and select enable.

Edit in response to update:

I set it up on my localhost and I found out 2 things. First, this script kinda cheats it seems. Each of the scripts it loads has to call the "loaded" function to notify the loader that loading has been completed, so you're going to have to edit all the scripts you include to call that function if you want the progress bar to work right. That aside, it is actually loading all the files. In the firebug command line, $ returns a function which is part of the jquery.min.js file, so it is loading the files.

You said you put an alert in $(document).ready. Depending on where you put that, it makes sense that you'd get an error. If that script is run before loading.js has loaded jQuery, then you'll get an error. I'm not quite sure why you want or need a javascript loader, especially since its going to make this harder on you to do this, but if you want to use jQuery after the loading is complete, you might want to put all the jQuery dependant code in another script and load that with the loading.js. I tried this out and it worked fine.

Telanor
Yes I did that (hence the 'I am running pretty much the exact same code') line. I will see what FireBug says when the Net tab is enabled.
graham.reeds
Updated answer with results of looking at the Net tab (which is to say nothing).
graham.reeds
Yeah, I just found that out too. The reason is I have a lot of stuff that needs loading for the web-app to work (jquery, raphael, my own code plus a few ajax requests) and want to have a loading screen while this is happening and not a blank screen or just a spinning throbber.
graham.reeds
A: 

Okay, it appears I didn't quite read all the tutorial. It appears I need to modify the files it will be loading to contain a callback to the loading script. Not useful if I am loading files from a CDN or wanting to preload images/css.

Sorry for wasting your time guys.

graham.reeds