graham.reeds
graham.reeds

Reputation: 16476

Script not working in localhost

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">
<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"><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?

Upvotes: 2

Views: 18425

Answers (3)

graham.reeds
graham.reeds

Reputation: 16476

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.

Upvotes: 0

Telanor
Telanor

Reputation: 4429

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.

Upvotes: 2

SamStephens
SamStephens

Reputation: 5861

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.

Upvotes: 2

Related Questions