Avatar billede kasperlh Nybegynder
15. maj 2005 - 11:31 Der er 8 kommentarer og
1 løsning

custom scrollbar og preload

Hej Eksperter -

Jeg var netop blevet glad for en custom scrollbar (http://rod.rant-on.net/dhtml/scroller1.html), som jeg ved en tidligere lejlighed har fundet her på siden, da jeg opdager at den ikke fungerer sammen med mit sædvanlige preload script (http://javascript.internet.com/page-details/preload-page.html).

Oprindeligt troede jeg egentligt, at det kun var et spørgsmål om at stable nogle onload, men det ser ikke ud til at være tilfældet.

Hvordan modificerer jeg preloaderen, således at den fungerer sammen med scrollbaren? Jeg er desværre ikke den fødte scripter, så jeg ville sætte stor pris på en pædagogisk forklaring af en evt. løsning, eller hvorfor det evt. ikke kan lade sig gøre.

mvh.
Kasper
Avatar billede roenving Novice
15. maj 2005 - 12:29 #1
Kan du ikke vise os det sted, hvor det konflikter ?-)
Avatar billede kasperlh Nybegynder
15. maj 2005 - 13:06 #2
Jeg ville ønske at jeg kunne præcisere hvor konflikten opstår, men jeg er desværre ikke en dygtig nok scripter til at kunne give et særligt kvalificeret bud.

Hvad jeg imidlertid kan sige er, at begge scripts fungerer upåklageligt hver for sig, og at det virker til at rækkefølgen af de to onload kommandoer bestemmer hvilken funktion der virker. Jeg kan dog ikke få onload = ” *** ; *** ;” til at virke. Yderligere vises loading layer’et under div scroller containeren når der loades… så måske konflikten skyldes fejl i rækkefølgen af lag - 

mvh.
Kasper
Avatar billede roenving Novice
15. maj 2005 - 13:21 #3
Du kan ikke skrive:

<body onload="detEne()" onload="detAndet()">

eller:

window.onload = detEne;
window.onload = detAndet;

-- så du må:

<body onload="detEne();detAndet();">

eller:

window.onload = function(){
  detEne();
  detAndet();
}

-- men det jeg mente med at vise det, var at du skulle vise koden, når den var sat sammen, f.eks. ved at linke til det !-)

-- for de to scripts virker jo ganske åbenbart de to steder, du henviser til, så det giver ingen mulighed for at forstå dit problem !o]
Avatar billede kasperlh Nybegynder
15. maj 2005 - 13:44 #4
Godt ord igen - jeg er vist lidt ved siden af mig selv - :)

Da jeg desværre ikke har mulighed for at uploade siden nogen steder, følger der en sammenskrevet version her - undskyld det roder, men jeg tænkte det var lettest hvis der ikke var eksterne filer -


<html>
<head>
<title>none</title>

<style type="text/css">
body {
    margin: 0px; font-size: 11px; color: #666666; font-family: tahoma, verdana, arial, sans-serif; background-color: #FFFFFF
}
.clContent {
    position: relative; top: 0px; left: 0px; width: 100%;
}
#scrollContainer1 {
    position: absolute; top: 10px; left: 10px; width: 720px; height: 460px; background-color: #FFFFFF; overflow: hidden;
}
#scrollUp1 {
    position: absolute; top: 10px; left: 740px; width: 10px; height: 10px; background-color: #999999; font-size: 1px;
}
#scrollDown1 {
    position: absolute; top: 460px; left: 740px; width: 10px; height: 10px; background-color: #999999; font-size: 1px;
}
#scrollBar1 {
    position: absolute; top: 0px; left: 0px; width: 10px; height: 30px; background-color: #999999; font-size: 1px;
}
#scrollTrack1 {
    position: absolute; top: 30px; left: 740px; width: 10px; height: 420px; background-color: #CCCCCC; font-size: 1px;
}
</style>

<style type="text/css">
#divLoading {
position:absolute;
width:100%;
height:100%;
top:0;
left:0;
background-color:white;
layer-background-color:white;
font-family:arial,helvetica;
z-index:100
}
</style>

<script type="text/javascript" language="JavaScript">
// BrowserCheck
NS4 = document.layers && !document.getElementById;
IE4 = document.all && !document.getElementById;
brow5 = document.getElementById;
function hideLoading(div){
    div = "divLoading";
    if (NS4) {
        document[div].visibility = 'hidden';
    }else if (IE4) {
        document.all[div].style.visibility = 'hidden';
    }else if (brow5) {
        document.getElementById(div).style.visibility = 'hidden';
    }

}
onload=hideLoading;
</script>

<script type="text/JavaScript">
// measure page width and height (the viewable canvas area)
function getViewport()
{
    if (document.documentElement && document.documentElement.scrollLeft) this.scrollX = document.documentElement.scrollLeft;
    else if (document.body && document.body.scrollLeft) this.scrollX = document.body.scrollLeft;
    else if (window.scrollX) this.scrollX = window.scrollX;
    else if (window.pageXOffset) this.scrollX = window.pageXOffset;
    else this.scrollX = 0;
    if (document.documentElement && document.documentElement.scrollTop) this.scrollY = document.documentElement.scrollTop;
    else if (document.body && document.body.scrollTop) this.scrollY = document.body.scrollTop;
    else if (window.scrollY) this.scrollY = window.scrollY;
    else if (window.pageYOffset) this.scrollY = window.pageYOffset;
    else this.scrollY = 0;
    if (document.documentElement && document.documentElement.clientWidth) this.width = document.documentElement.clientWidth;
    else if (document.body && document.body.clientWidth) this.width = document.body.clientWidth;
    else if (window.innerWidth) this.width = window.innerWidth;
    else this.width = 0;
    if (document.documentElement && document.documentElement.clientHeight) this.height = document.documentElement.clientHeight;
    else if (document.body && document.body.clientHeight) this.height = document.body.clientHeight;
    else if (window.innerHeight) this.height = window.innerHeight;
    else this.height = 0;
    return this;
}

// event listeners
// object      = the object to attach the event handler to
// eventType    = the type of event to listen for
// functionName = the handler function to execute when the event is fired
// capture      = use event capture?
function addEvent(object, eventType, functionName, capture)
{
    if (object.addEventListener)
    {
        object.addEventListener(eventType, functionName, capture);
        return true;
    }
    else if (object.attachEvent)
    {
        var ae = object.attachEvent("on" + eventType, functionName);
        return ae;
    }
    else { object["on" + eventType] = functionName; }
}

function removeEvent(object, eventType, functionName, capture)
{
    if (object.removeEventListener)
    {
        object.removeEventListener(eventType, functionName, capture);
        return true;
    }
    else if (object.detachEvent)
    {
        var re = object.detachEvent("on" + eventType, functionName);
        return re;
    }
    else { object["on" + eventType] = null; }
}

function fixEvent(e, currentTarget)
{
    if (!e) e = event;
    if (!e.target) e.target = e.srcElement;
    if (!e.currentTarget) e.currentTarget = currentTarget;
    if (typeof e.layerX == "undefined") e.layerX = e.offsetX;
    if (typeof e.layerY == "undefined") e.layerY = e.offsetY;
    if (typeof e.clientX == "undefined") e.clientX = e.pageX;
    if (typeof e.clientY == "undefined") e.clientY = e.pageY;
    if (!e.stopPropagation) e.stopPropagation = function() { this.cancelBubble = true; }
    if (!e.preventDefault) e.preventDefault = function() { this.returnValue = false; }
    return e;
}

// browser check
function browserCheck()
{
    this.ua = navigator.userAgent.toLowerCase();
    this.dom = document.getElementById ? 1 : 0;
    this.op7 = (this.dom && this.ua.indexOf("opera 7") > -1 || this.ua.indexOf("opera/7") > -1) ? 1 : 0;
    this.ie5 = (this.dom && this.ua.indexOf("msie 5") > -1) ? 1 : 0;
    this.ie6 = (this.dom && this.ua.indexOf("msie 6") > -1) ? 1 : 0;
    this.moz = (this.dom && this.ua.indexOf("mozilla") > -1 && this.ua.indexOf("gecko") > -1) ? 1 : 0;
    return this;
}

// browser check variable
var bw = browserCheck();

// returns a random number between x and y (integers)
function rand(x, y) { return (Math.round(Math.random() * (y - x)) + x); }

//basic
// object constructor
function createObjectById(id)
{
    this.el = document.getElementById ? document.getElementById(id) : null;
    if (!this.el) throw new Error("Element with " + id + " id not found.");
    this.css = this.el.style;
    this.i = createObjectById.registry.length;
    createObjectById.registry[this.i] = this;
    this.w = this.el.offsetWidth ? this.el.offsetWidth : 0;
    this.h = this.el.offsetHeight ? this.el.offsetHeight : 0;
    this.x = this.el.offsetLeft ? this.el.offsetLeft : 0;
    this.y = this.el.offsetTop ? this.el.offsetTop : 0;
    this.o = 100;
}

// global reference to the dhtml object
createObjectById.registry = [];

// update object values
createObjectById.prototype.update = function()
{
    this.w = this.el.offsetWidth ? this.el.offsetWidth : 0;
    this.h = this.el.offsetHeight ? this.el.offsetHeight : 0;
    this.x = this.el.offsetLeft ? this.el.offsetLeft : 0;
    this.y = this.el.offsetTop ? this.el.offsetTop : 0;
}

// visibility
createObjectById.prototype.show = function() { this.css.visibility = "visible"; }
createObjectById.prototype.hide = function() { this.css.visibility = "hidden"; }

// display
createObjectById.prototype.display = function(d) { this.css.display = d; }

// colors
createObjectById.prototype.fg = function(f) { this.css.color = f; }
createObjectById.prototype.bg = function(b) { this.css.backgroundColor = b; }

// set layer opacity (in percent, between 0 and 100)
createObjectById.prototype.setOpacity = function(o)
{
    if (typeof this.css.MozOpacity != "undefined") { this.css.MozOpacity = (o / 100); this.o = o; }
    else if (this.el.filters) { this.css.filter = "alpha(opacity=" + o + ")"; this.o = o; }
}

// moves a layer to (x, y) pixels
createObjectById.prototype.moveTo = function(x, y)
{
    if (x != null && typeof x == "number")
    {
        x = Math.round(x);
        this.x = x;
        this.css.left = x + "px";
    }
    if (y != null && typeof y == "number")
    {
        y = Math.round(y);
        this.y = y;
        this.css.top = y + "px";
    }
}

// resize layer to (width, height) pixels
createObjectById.prototype.setSize = function(w, h)
{
    if (w != null && typeof w == "number")
    {
        if (w < 0) w = 0;
        w = Math.round(w);
        this.css.width = w + "px";
    }
    if (h != null && typeof h == "number")
    {
        if (h < 0) h = 0;
        h = Math.round(h);
        this.css.height = h + "px";
    }
    this.update();
}

// clips layer to specific dimensions; (top, right, bottom, left) in pixels
createObjectById.prototype.clipTo = function(t, r, b, l)
{
    if (t < 0) t = 0; if (r < 0) r = 0; if (b < 0) b = 0; if (l < 0) l = 0;
    this.css.clip = "rect(" + t + "px, " + r + "px, " + b + "px, " + l + "px)";
}

// write content to layer
createObjectById.prototype.write = function(text)
{
    if (typeof this.el.innerHTML != "undefined")
    {
        this.el.innerHTML = text;
        this.update();
    }
}

//scrollbar
scroller = {
    scrollables: 1, // set the number of scrollable scrollContent
    step: 30, // set the timeout between each scroll
    speed: 5, // set the scroll speed
    wheelSpeed: 15, // set the scroll speed when using the mouse wheel
    wheelScrolled: false,
    timer: 0,
    contentY: 0,
    dragY: 0,
    clickY: 0,

    mouseDown: function(e)
    {
        e = fixEvent(e);
        var canvas = new getViewport();
        var mouseY = e.clientY + canvas.scrollY;
        var target = (e.target.nodeType == 3 || e.target.tagName.toLowerCase() == 'img') ? e.target.parentNode : e.target;
        scroller.wheelScrolled = false;
        for (var i = 1; i <= scroller.scrollables; i++)
        {
            if (target.id == scroller.bar[i].el.id)
            {
                scroller.bar[i].grab = true;
                scroller.clickY = mouseY - scroller.bar[i].y;
                e.preventDefault();
            }
            else if (target.id == scroller.track[i].el.id)
            {
                if (scroller.content[i].h > scroller.container[i].h)
                {
                    scroller.track[i].grab = true;
                    scroller.dragY = e.layerY - (scroller.bar[i].h / 2);
                    if (scroller.dragY < 0) scroller.dragY = 0;
                    if (scroller.dragY > scroller.track[i].h - scroller.bar[i].h) scroller.dragY = scroller.track[i].h - scroller.bar[i].h;
                    scroller.contentY = 0 - (scroller.dragY * (scroller.content[i].h - scroller.container[i].h) / Math.round(scroller.track[i].h - scroller.bar[i].h));
                    scroller.content[i].moveTo(0, scroller.contentY);
                    scroller.bar[i].moveTo(0, scroller.dragY);
                    e.preventDefault(e);
                }
            }
            else if (target.id == scroller.up[i].el.id)
            {
                scroller.up[i].grab = true;
                scroller.scroll(i, scroller.speed);
                e.preventDefault();
            }
            else if (target.id == scroller.down[i].el.id)
            {
                scroller.down[i].grab = true;
                scroller.scroll(i, -scroller.speed);
                e.preventDefault();
            }
        }
    },

    mouseUp: function(e)
    {
        for (var i = 1; i <= scroller.scrollables; i++)
        {
            scroller.bar[i].grab = false;
            scroller.track[i].grab = false;
            scroller.up[i].grab = false;
            scroller.down[i].grab = false;
        }
        clearTimeout(scroller.timer);
    },

    mouseMove: function(e)
    {
        for (var i = 1; i <= scroller.scrollables; i++)
        {
            if (scroller.bar[i].grab && scroller.content[i].h > scroller.container[i].h)
            {
                e = fixEvent(e);
                var canvas = new getViewport();
                var mouseY = e.clientY + canvas.scrollY;
                scroller.dragY = mouseY - scroller.clickY;
                if (scroller.dragY < 0) scroller.dragY = 0;
                if (scroller.dragY > scroller.track[i].h - scroller.bar[i].h) scroller.dragY = scroller.track[i].h - scroller.bar[i].h;
                scroller.contentY = 0 - (scroller.dragY * (scroller.content[i].h - scroller.container[i].h) / Math.round(scroller.track[i].h - scroller.bar[i].h));
                scroller.content[i].moveTo(0, scroller.contentY);
                scroller.bar[i].moveTo(0, scroller.dragY);
                e.preventDefault();
            }
        }
    },

    scroll: function(num, speed)
    {
        if (scroller.content[num].y < 0 || scroller.content[num].y > -scroller.content[num].h + scroller.container[num].h)
        {
            scroller.contentY = scroller.content[num].y + speed;
            if (scroller.contentY < -(scroller.content[num].h - scroller.container[num].h)) scroller.contentY = -scroller.content[num].h + scroller.container[num].h;
            else if (scroller.contentY > 0) scroller.contentY = 0;
            scroller.content[num].moveTo(0, scroller.contentY);
            scroller.dragY = 0 - (scroller.content[num].y * Math.round(scroller.track[num].h - scroller.bar[num].h) / (scroller.content[num].h - scroller.container[num].h));
            scroller.bar[num].moveTo(0, scroller.dragY);
            if (!scroller.wheelScrolled) scroller.timer = setTimeout('scroller.scroll(' + num + ', ' + speed + ')', scroller.step);
        }
    },

    wheelScroll: function(e)
    {
        e = fixEvent(e);
        var el = e.target;
        if (el.id.slice(0, el.id.length - 1) != 'scrollContent')
        {
            do el = el.parentNode;
            while (el.tagName.toLowerCase() != 'div' || el.id.slice(0, el.id.length - 1) != 'scrollContent')
        }
        var i = el.id.charAt(el.id.length - 1);
        if (window.event.wheelDelta <= -120)
        {
            scroller.wheelScrolled = true;
            scroller.scroll(i, -scroller.wheelSpeed);
        }
        else if (window.event.wheelDelta >= 120)
        {
            scroller.wheelScrolled = true;
            scroller.scroll(i, scroller.wheelSpeed);
        }
        e.preventDefault();
    },

    init: function()
    {
        scroller.container = new Array();
        scroller.content = new Array();
        scroller.bar = new Array();
        scroller.up = new Array();
        scroller.down = new Array();
        scroller.track = new Array();
        for (var i = 1; i <= scroller.scrollables; i++)
        {
            scroller.container[i] = new createObjectById('scrollContainer' + i);
            scroller.content[i] = new createObjectById('scrollContent' + i);
            scroller.bar[i] = new createObjectById('scrollBar' + i);
            scroller.bar[i].grab = false;
            scroller.track[i] = new createObjectById('scrollTrack' + i);
            scroller.track[i].grab = false;
            scroller.up[i] = new createObjectById('scrollUp' + i);
            scroller.up[i].grab = false;
            scroller.down[i] = new createObjectById('scrollDown' + i);
            scroller.down[i].grab = false;
            if (bw.ie6) addEvent(scroller.content[i].el, 'mousewheel', scroller.wheelScroll, false);
        }
        addEvent(document, 'mousemove', scroller.mouseMove, false);
        addEvent(document, 'mousedown', scroller.mouseDown, false);
        addEvent(document, 'mouseup', scroller.mouseUp, false);
    }
}
onload = scroller.init;
</script>
</head>

<body>
<div id="divLoading"><table width=100% height=100% border=0><tr><td width=100% height=100% align=center valign=middle><h2>Please wait...</h2></td></tr></table></div>
<div id=scrollContainer1>
<div class=clContent id=scrollContent1>
<table width="200" height="800" border="0" cellpadding="0" cellspacing="0">
  <tr>
    <td>***CONTENT***</td>
  </tr>
</table>
</div></div>
<div id=scrollUp1></div>
<div id=scrollDown1></div>
<div id=scrollTrack1>
<div id=scrollBar1></div></div>

</body>
</html>
Avatar billede roenving Novice
15. maj 2005 - 13:56 #5
Fjern begge onload-linjerne, og skriv i stedet allersidst i script-blokken:

window.onload = function(){
  hideLoading();
  scroller.init();
}

-- og du har helt ret i, at det kommer an på rækkefølgen, for den sidste overskriver simpelthen referencen !-)
Avatar billede kasperlh Nybegynder
15. maj 2005 - 14:07 #6
Perfekt!
- tak for hjælpen - hvis du opretter et svar er pointene dine

mvh.
Kasper
Avatar billede roenving Novice
15. maj 2005 - 14:08 #7
Velbekomme '-)
Avatar billede roenving Novice
15. maj 2005 - 14:48 #8
-- og tak for point ;~}
Avatar billede kasperlh Nybegynder
15. maj 2005 - 14:56 #9
det er mig der takker :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester