Avatar billede adflicto Nybegynder
18. juni 2003 - 17:51 Der er 29 kommentarer og
1 løsning

layer der følger mus

hvad skal jeg gøre for at vise musen's x- og y-koordinat, for derefter at sætte et layer til at følge de kordinater.
nogen der har ideer?
Det giver jo gode point :D
Avatar billede webcreator Nybegynder
18. juni 2003 - 17:55 #1
Øh ? Hvorfor 1 point ??
Avatar billede roenving Novice
18. juni 2003 - 17:55 #2
alert(event.clientX+" "+event.clientY);
Avatar billede roenving Novice
18. juni 2003 - 17:56 #3
f.eks. på en onmousemove
Avatar billede skovenborg Nybegynder
18. juni 2003 - 18:25 #4
"Det giver jo gode point :D" - WAUV, 1 point, ja det er bestemt mange. :-)
Avatar billede roenving Novice
18. juni 2003 - 18:27 #5
adflicto har jo ikke fået samlet så mange på den uge han har været her ...
Avatar billede skovenborg Nybegynder
18. juni 2003 - 18:36 #6
Okay, godt ord igen. Nå, men for at følge op på roenvings løsning:
<script language="javascript">
function move_layer(x,y)
{
lager = document.getElementById("boks");
lager.style.top = y+10;
lager.style.left = x+10;
}
</script>
</head>
<body onMouseMove="move_layer(event.clientX,event.clientY);">
<span id="boks" style="position:absolute;left:0px;top:0px;width:100px;height:100px;background:#ff0000;"></span>
Avatar billede roenving Novice
18. juni 2003 - 18:42 #7
>>skovenborg

-- enkelt og effektivt
Avatar billede adflicto Nybegynder
19. juni 2003 - 00:20 #8
jeg gir roenving ret., jeg har næsten kun været her 1 uge. og jeg er ikke den helt store super nørd til javascript (eller for den sags skyld noget andet programmering(hvis man kan kalde det det), på nær HTML self. :D)
så det er rart når "super nørder" som jer (forstå det ret) kan give en god forklaring :D
-AdfliCto
Avatar billede skovenborg Nybegynder
19. juni 2003 - 00:27 #9
det lærer du nok med tiden. Vi har jo alle været begyndere engang herinde :-)

Kunne du det script jeg viste eller skal der lidt mere til?
Avatar billede adflicto Nybegynder
19. juni 2003 - 00:36 #10
ej det er ok, vil lige sidde og leje lidt med den et stykke tid. (et par uger) :D så lærer man det :D, det var egentlig bare en lille tanke jeg sad og legede med...
-AdfliCto
Avatar billede adflicto Nybegynder
19. juni 2003 - 00:37 #11
gider ikke engang sige "svar hvis du vil ha point" :D
Avatar billede roenving Novice
19. juni 2003 - 00:40 #12
Jeg måtte jo lige fare i bogen for at finde clientX og clientY, men skovenborg gad udføre arbejdet, så det må helt klart være ham der har fortjent gevinsten ...
Avatar billede roenving Novice
19. juni 2003 - 00:50 #14
'lidt' skovenborg

-- der er da læsestof til 14 dage ...
Avatar billede adflicto Nybegynder
19. juni 2003 - 00:59 #15
dar væ jar igen gi' roenving rart... :D jo tak skovenborg...
Avatar billede =maddog= Nybegynder
19. juni 2003 - 01:00 #16
du får det bedste resultat hvis du laver en global manager til at administrere drags. Min egen er ikke x-browser endnu, så det vil jeg ikke poste her med mindre jeg bliver direkte opfordreret. Den er også meget vidtfavnende, fordi den automatisk kalder objektets invokeOn__EVENT__ funktion hvis en sådan er defineret.
Til en start kan du bruge følgende for at få NS6/Moz til at genkende clientX/clientY
    if  (window.Node) {
        // Først extender vi Moz/NS så vi undgår codebranching
        Event.prototype.__defineGetter__("clientX", function() { return this.pageX; } );
        Event.prototype.__defineGetter__("clientY", function() { return this.pageY; } );
    }
Avatar billede roenving Novice
19. juni 2003 - 01:01 #17
-- forøvrigt er der kun to af de links som viser besøgt hos mig -- og det er ikke M$-links *g*
Avatar billede skovenborg Nybegynder
19. juni 2003 - 01:02 #18
roenving>> Jeg har heller ikke tænkt mig at han skulle læse alle manualerne, men mere slå op i dem, hvis han for brug for en bestemt funktion eller andet.
Avatar billede roenving Novice
19. juni 2003 - 01:04 #19
>>=maddog=

-- er den endnu ikke til at der er en standard ...

for medmindre jeg bliver pisket til det vil jeg da absolut undgå __defineGetter__ og __defineSetter__
Avatar billede =maddog= Nybegynder
19. juni 2003 - 01:09 #20
jeg pisker dig. det er bedre end en branch, og du kan få IE kode (der ikke er standard) til at virke med NS/Moz syntax (der er standard).
der er selvfølgelig visse farer. f.x. at MS gør verden en tjeneste og overholder standarderne, men ikke __defineGetter__. Chancen for det første er en til en million. Chancen for det sidste er en til en milliard.
Avatar billede skovenborg Nybegynder
19. juni 2003 - 01:10 #21
Lægger lige et svar, hvis du fik lyst til at acceptere og lukke spørgsmålet :-)
Avatar billede skovenborg Nybegynder
19. juni 2003 - 01:12 #22
ha, MS tror jo selv de er standarden - så chancen er mere 1 til alt for mange
Avatar billede roenving Novice
19. juni 2003 - 01:14 #23
>>=maddog=

ROTFLMAO

-- selvfølgelig har du ret, og een af de ting jeg ihvertfald ikke har fundet en bare nogenlunde fornuftig løsning på er eventhåndtering -- måden at gøre det på er jo grundlæggende forskellig fra browser til browser ...

-- en ting er, at Netscape tager det anderledes end IE, og jeg kan også leve med (parallelt med de andre forskelle) at NN4 er sig selv, men at man skal lave detection på om man bruger IE5, IE5.5 eller IE 6 eller om det er IE5.0 eller 5.1 til MAC -- gaaab ...
Avatar billede =maddog= Nybegynder
19. juni 2003 - 01:29 #24
Der er en anden fordel. Du kan med (rimelig) ro udvikle til IE og bagefter extende dig fra de fleste problemer med at føre det over til NS kompatibilitet. Der er jo rart at i det mindste en af de to store browsere er objekt-orienteret.
Jeg vil helst ikke sniffe browsere længere. Det ender alligvel galt. Det er bedre at løbende teste om det du vil gøre er understøttet. Men det er efter min bedste overbevisning en diskussion der nærmer sig religiøse proportioner.
Jeg er en privat person. Jeg er ikke uddannet som programmør og jeg er ikke ansat til at udvikle. Det er derfor begrænset hvad jeg har af ressourcer til rådighed. Jeg har simpelhen ikke mulighed for at debugge ordentligt i særlig mange browsere.
På den anden side er JavaScript 1.5 til NS/Moz (gecko browsere) så hamrende sejt og nærmest fuldstændigt efter standarden. I princippet er eneste non-standard funktioner __defineGetter__ og __defineSetter__ fordi de andre alle kan dannes ud fra standarden og derfor leves med disse.
Derfor laver så vidt muligt tingene så de virker i disse to browsere. Det meste jeg laver er eksperimentelt og næsten altid objekt-orienteret.
Avatar billede roenving Novice
19. juni 2003 - 01:38 #25
Jeg må jo så indrømme at jeg endnu er for doven til at gå _hele_ den vej ...

-- egentlig er det ganske rart (og smart !-) at man med __define-metoderne kan prototype næsten hvadsomhelst -- og jeg bliver heller ikke overrasket når jeg selv får behovet ...

-- jeg er også efter bl.a. gode råd fra folk som Danny Goodman (Javascript Bible) og f.eks. olebole her på E* helt holdt op med at sniffe browsere, men engang imellem er det nødvendigt at sniffe egenskaber eller metoder, og så må man jo gøre det ...

-- men det jeg mente med at jeg skulle piskes var, at de jo netop var så smarte, at de definerede nogle prototyping-metoder som ikke kunne kollidere med fremtidige standarder -- hvor længe skal vi vente på ECMA og W3C på det område ?-|
Avatar billede =maddog= Nybegynder
19. juni 2003 - 03:57 #26
Ok. Det lader til at der ikke er andre konkrete forslag på banen. Her er i hvert fald en der (så vidt jeg har testet) dur i IE og NS6+

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title>Pure Test</title>
<style>
div { position:relative; cursor:default; }
</style>
<script type="text/javascript">
if  (window.Node) {
    // Moz extensions
    Event.prototype.__defineGetter__("clientX", function() { return this.pageX; } );
    Event.prototype.__defineGetter__("clientY", function() { return this.pageY; } );
    Event.prototype.__defineGetter__("offsetX", function () { return this.layerX; } );
    Event.prototype.__defineGetter__("offsetY", function () { return this.layerY; } );
    Event.prototype.__defineGetter__("srcElement", function () {
        var node = this.target;
        while (node.nodeType != 1) node = node.parentNode;
        return node;
    });
}

function DragManager() {
    this.registeredElements = new Array();
   
    this.register = function(element) {
        // see if any removed element slots are available
        for (i=0;i!=this.registeredElements.length;i++) {
            if(this.registeredElements[i]==null) {
                this.registeredElements[i]=element;
                return;
            }
        }
        // Otherwise expand the register by one
        this.registeredElements[this.registeredElements.length]=element;
        // update
        this.update();
        // mark the element so we don't register twice
        element.markedForDrag = true;
    }
    this.remove = function(element) {
        // locate and remove the element if present.
        for (i=0;i!=this.registeredElements.length;i++) {
            if(this.registeredElements[i]==element)
                this.registeredElements[i]=null;
        }
        this.update();
        // demark the element
        element.markedForDrag = false;
    }
    this.grabElement = function(e) {
        // See if the source is registered and select if so
        if(e)event=e;
        for (i=0;i!=this.registeredElements.length;i++) {
            if(this.registeredElements[i]==event.srcElement) {
                this.selected=event.srcElement;
                break;
            }
        }
        if (this.selected!=null) {
            this.selected = (this.selected.proxy)?this.selected.proxy:this.selected;
            this.selected.style.zIndex = this.zIndex++;
            this.offsetX = event.clientX-(isNaN(parseInt(this.selected.style.left))?0:parseInt(this.selected.style.left));
            this.offsetY = event.clientY-(isNaN(parseInt(this.selected.style.top))?0:parseInt(this.selected.style.top));
            if (this.selected.invokeOnGrab!=null)
              this.selected.invokeOnGrab(event);
        }
    }
    this.dragElement = function(e) {
        if(e)event=e;
        if(this.selected) {
            if(this.selected.isAnchored) return;
            theoreticalLeft = event.clientX-this.offsetX;
            theoreticalTop = event.clientY-this.offsetY;
            if(!this.selected.verticalLock) {
                if (this.selected.topBound!=null||this.selected.topBound==0)
                  theoreticalTop=(theoreticalTop<this.selected.topBound)?this.selected.topBound:theoreticalTop;
                if (this.selected.bottomBound!=null||this.selected.bottomBound==0)
                    theoreticalTop=(theoreticalTop>this.selected.bottomBound)?this.selected.bottomBound:theoreticalTop;
                this.selected.style.top = theoreticalTop+"px";
                if (this.selected.invokeOnMove)
                  this.selected.invokeOnMove(event);
            }

            if(!this.selected.horizontalLock) {
                if (this.selected.leftBound||this.selected.leftBound==0)
                  theoreticalLeft=(theoreticalLeft<this.selected.leftBound)?this.selected.leftBound:theoreticalLeft;
                if (this.selected.rightBound||this.selected.rightBound==0)
                    theoreticalLeft=(theoreticalLeft>this.selected.rightBound)?this.selected.rightBound:theoreticalLeft;
                this.selected.style.left = theoreticalLeft+"px";
                if (this.selected.invokeOnMove)
                  this.selected.invokeOnMove(event);
            }

        }
        return false; // avoid event propagation downwards.
    }
    this.releaseElement = function(e) {
        if(e)event=e;
        if(this.selected) {
            if (this.selected.invokeOnRelease)
                this.selected.invokeOnRelease(event);
            this.selected=null;
        }
           
    }
}
DragManager.prototype.init = function() {
    if (!window.Element) {
        document.zIndex = 0;                     
        document.onmousedown = this.grabElement;
        document.onmousemove = this.dragElement;
        document.onmouseup = this.releaseElement;
        this.owner = document;
    } else {
        window.zIndex = 0;                     
        window.onmousedown = this.grabElement;
        window.onmousemove = this.dragElement;
        window.onmouseup = this.releaseElement;
        this.owner = window
    }
}
DragManager.prototype.update = function() {
    if (!window.Element) {
        document.registeredElements = this.registeredElements;
    } else {
        window.registeredElements = this.registeredElements;
    }
}   

onload = function() {
    // DragManager tilbyder en masse drag funktionalitet.
    // Først skal vi oprette en DragManager. Der bør være en DragManager pr. window/document object
    // selvom den i princippet kan afregistreres og registrere sig i en iframe.
    myDrag = new DragManager();
    myDrag.init(); // binder den til document (for IE) eller window (for NS)
    // Goody. Lad os få fingre i en div at lege med
    myObj = document.getElementById("Nr1");
    myDrag.register(myObj); // tilføjer myObj til myDrags register over objekter, der skal kunne trækkes
   
    // Det virker jo fint, men vi kan mere. Hvad med at få en div inden i en anden div til at flytte hele moletjavsen
    myObj = document.getElementById("Nr3");
    // Nu har vi det objekt der TRÆKKES. Det objekt der FLYTTES erklæres som oObject.proxy
    myObj.proxy = document.getElementById("Nr2");
    myDrag.register(myObj);
   
    // Nogle gange er det nødvendigt at layers kun kan flyttes inden for et afgrænset område. Det gør vi ved at erklære
    // følgende varible: topBound, bottomBound, leftBound og rightBound.
    // Det er et vidunder til virtuelle scrollbars.
    myObj = document.getElementById("Nr4");
    myObj.leftBound = 0;  // kan ikke flyttes mere end 0 pixels til venstre
    myObj.rightBound = 300;  // kan ikke flyttes mere end 300 pixels til højre
    myObj.topBound = 0;  // kan ikke flyttes mere end 0 pixels til op
    myObj.bottomBound = 300; // ken ikke flyttes mere end 300 pixels nedad
    myDrag.register(myObj);
   
    // Endeligt kan det nogle gange være rart at kunne udføre et eller andet under klik, drag eller slip.
    // Dette gøres ved at tilføje funktionerne invokeOnGrab, invokeOnMove og invokeOnRelease
    myObj = document.getElementById("Nr5");
    myObj.invokeOnGrab=function(e) { this.innerHTML="You got me."; }
    myObj.invokeOnRelease=function(e) { this.innerHTML=(this.wasAborted)?"Hah. Got away.":"Awaiting your command"; }
    myObj.invokeOnMove=function(e) {
        this.innerHTML="Venstre: "+this.style.left+" Top: "+this.style.left;
        if (parseInt(this.style.left)>400) {
            // Vi fjerner objektet fra manageren med remove
            // Bemærk at vi først "slipper" objektet når musen løftes
            this.wasAborted=true;
            myDrag.remove(this);
            // Det løser vi med:
            myDrag.owner.onmouseup();
        }
    }
    myDrag.register(myObj);
}
</script>
</head>

<body>
<h1>Nogle DIV's at lege med. Bemærk de er RELATIVE</h1>
<div id="Nr1">En Div, der kan trækkes</div>
<div id="Nr2">
    <div id="Nr3">En Div, der trækker en anden Div</div>
    En Div, der trækkes
</div>
<div id="Nr4">En Div, der ikke kan slippe væk</div>
<div id="Nr5">Sladrehanken</div>

</body>
</html>
Avatar billede =maddog= Nybegynder
19. juni 2003 - 04:06 #27
ah, jeg glemte lige. Du kan binde et objekt så det kun kan flyttes horisontalt eller vertikalt med:
oObject.horizontalLock=true;
og/eller
oObject.verticalLock=true;
hvilket VIRKELIG er rart hvis man skal lave en pseudo scrollbar. At låse begge retninger er lidt nonsens; så vil man ikke kunne bevæge objektet overhovedet.
Avatar billede adflicto Nybegynder
20. juni 2003 - 17:03 #28
der har du dine point skovenborg :D ,
Avatar billede skovenborg Nybegynder
20. juni 2003 - 18:41 #29
wauuuv, tak!!!
Og held og lykke med dit javascript programmering :-)
Avatar billede adflicto Nybegynder
09. april 2004 - 13:10 #30
jo tak
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