Avatar billede lkoudal Nybegynder
03. juli 2003 - 15:58 Der er 11 kommentarer

drag-drop: SVÆR opgave

hej. jeg har en rigtig svær en. dette drejer sig om drag-drop i javascript til en php løsning jeg arbejder på.

jeg har spurgt om dette tidligere, og svarene jeg fik var gode, og sendte mig i den rigtige retning, der er bare flere ting i projektet som gjorde min tidlige løsning upraktisk. Se spørgsmålet her: http://www.eksperten.dk/spm/363290

Siden jeg endte med at hente kode/information fra var
Inside Technique : Adding Drag and Drop
http://www.siteexperts.com/tips/styles/ts28/page1.asp

jeg har sat en eksempel side op, med en tidligere version, så folk kan se hvad jeg mener.

Siden kan ses her:

http://www.storyboard.dk/test3.html

Som folk nok kan forstå, så har jeg fjernet al funktionalitet, så der ikke er nogen kode der går ind og leger med resten af mit system. Jeg har maksimeret de 2 første div's, så folk kan forstå meningen.


problemerne er som følger:

- man har ikke mulighed for at markere tekst i felterne, javascript betragter det som en start på en drag, og flytter hele skidtet.
- man kan dragge horizontalt også


Systemet skal kunne tillade at man drag-dropper et felt over på, hvad jeg kalder, en divider, som i photoshop, som så tricker noget php kode jeg har, der flytter rundt på felternes placering.

Det jeg ønsker er:

- Et javascript system der tillader drag-drop på felter, som har mulighed for at detecte når man drag-dropper over på et andet felt.

- Mulighed for at detecte en drag-over, så jeg kan skifte farve på en "divider" så det giver en visuel bekræftigelse på at man er ved at flytte et felt, til en ny placering.

- Begrænsning af drag-drop, dvs. man kan kun flytte vertikalt  (y-aksen) ikke horizontalt.

- Selv med drag-drop tilføjet, er det stadig muligt at markere tekst i felterne med musen.

- En fed detalje, hvis muligt: man skal flytte "kassen" et par pixels, inden den reagerer, så folk ikke kan komme til at trykke på den ved at ramme ved siden af maksimer/minimer knapppen, og så komme til at flytte den lidt.


Jeg håber der er folk der kan hjælpe mig med dette problem. I javascript er jeg mere eller mindre helt til rotterne, så pseudo-kode er nok desværre ikke nok, jeg har brug for lidt mere reel kode, til at hjælpe mig fremad.

Spørgsmålet er sat til maksimum point, jeg har virkelig brug for hjælp.


På forhånd tak,

Lars Koudal
Avatar billede roenving Novice
03. juli 2003 - 16:25 #1
Jeg har ikke haft fat i hjørnet med editerbare celler, men måske kan du bruge noget fra den funktionalitet, jeg har i denne celle-byt-rundt-ting:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>Byt celler</TITLE>
<META NAME="Generator" CONTENT="Stone's WebWriter 3.5">
<META NAME="description" CONTENT="Jes' Turneringsmager - byt kampdage">
<META NAME="keywords" CONTENT="turnering,deltagere,kampe,kampdage">
<META NAME="robots" CONTENT="index,follow">
<META HTTP-EQUIV="Content-Language" CONTENT="da">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-store">
<STYLE TYPE="text/css">
.tdname{
border:red 1px solid;
}
.tdkampe{
border:red 1px solid;
}
.dkampe{
background:'url(../transparent.gif)' 400px 25px repeat;
position:relative;
height:25px;
width:400px;
display:block;
}
.fkampe{
position:absolute;
background-color:grey;
border:#7f7f7f 1px dotted;
height:25px;
width:400px;
display:block;
z-index:3;
}
.dname{
background:'url(../transparent.gif)' 100px 25px no-repeat;
position:relative;
height:25px;
width:100px;
display:block;
}
.tdmellemrum{
background:'url(../transparent.gif)';
position:relative;
height:8 px;
font-size:4px;
border:transparent 0px;
}
</STYLE>
<SCRIPT LANGUAGE="javascript" TYPE="text/javascript">
var nede = false;
var x = y = 0;
var stTop = 0;
var stHeight = 0;
var numDivs = 0;
var flytDivs = new Array();

function traek(obj) {
  if (nede) {
  //alert(stTop+"\n"+stHeight+"\n"+event.clientY+"\n"+y+"\n"+""+"\n"+obj.lastElm);
    //obj.style.left = event.clientX - x;
    var newTop = event.clientY - y - 3;
    //first can't move up, last can't move down
    if((newTop<stTop&&obj.num==0)||(newTop>stTop&&obj.num==numDivs)){return false;
    }else{
        //movement only allowed until 60% then a swap occurs
        if(0.6*stHeight>Math.abs(stTop-newTop)){
            obj.style.top = newTop;
            return false;
        }else{
            swapElms(obj,newTop)
          }
    }
  }
}
function swapElms(obj,newTop){
    //Swapping values and relations
  var newNum = oldNum = obj.num;
    if (newTop>stTop)newNum++;
        else newNum--;
  var swap = flytDivs[newNum];
  var newPar = swap.par;
    var newSib = swap.sib;
  swap.par = obj.par;
  swap.sib = obj.sib;
    swap.num = obj.num;
    obj.par = newPar;
  obj.sib = newSib;
    obj.num = newNum;
    flytDivs[oldNum] = swap;
    flytDivs[newNum] = obj;
  swap.sib.innerHTML = obj.sib.innerHTML;
  obj.sib.innerHTML = obj.innerHTML;
    swap.style.top = getPos(swap.par).y;
  stTop = getPos(obj.par).y;
  obj.style.top = stTop;
  alert('Poster byttet rundt!');
}
function getPos(elm) {
    for(var zx=zy=0;elm!=null;zx+=elm.offsetLeft,zy+=elm.offsetTop,elm=elm.offsetParent);
    return {x:zx,y:zy}
}
function initMove(obj){
    stTop=getPos(obj.par).y;
    stHeight=obj.par.scrollHeight;
    x=event.offsetX;
    y=event.offsetY;
    nede=true;
    obj.innerHTML = obj.sib.innerHTML;
}
function initFlytDiv(){
    var b = document.body;
    for(i=0;document.getElementById("tdkampe"+i);i++){
        //document.body.innerHTML+='<DIV CLASS="fkampe" ID="fkampe'+i+'" onMouseDown="initMove(flytDivs[this.num]);" onMouseUp="nede=false;" onMouseOut="nede=false;" onMouseMove="traek(this);" onSelectStart="return false;" ></DIV>'
        var d = document.getElementById("fkampe"+i);
        var p = document.getElementById("tdkampe"+i);
        d.style.top = getPos(p).y;
        d.style.left = getPos(p).x;
        d.par = p;
        d.sib = document.getElementById("kampe"+i);
        d.num = i;
        flytDivs[i] = d;
        numDivs = i;
    }
}
</SCRIPT>
</HEAD>
<BODY ONRESIZE ONLOAD="initFlytDiv()">
<TABLE CELLPADDING="0" CELLSPACING="0" COLS="2" STYLE="border-collapse:collapse"><!--  STYLE="border:black 1px solid;border-collapse:collapse" -->
    <TR>
        <TD CLASS="tdname" onSelectStart="return false;"><DIV CLASS="dname" ID="dato0">&nbsp;</DIV></TD>
        <TD CLASS="tdkampe" ID="tdkampe0" onSelectStart="return false;"><DIV CLASS="dkampe" ID="kampe0">&nbsp;0</DIV></TD>
    </TR>
    <TR>
        <TD CLASS="tdmellemrum" COLSPAN="2" onSelectStart="return false;">&nbsp;</TD>
    </TR>
    <TR>
        <TD CLASS="tdname" onSelectStart="return false;"><DIV CLASS="dname" ID="dato1">&nbsp;</DIV></TD>
        <TD CLASS="tdkampe" ID="tdkampe1" onSelectStart="return false;"><DIV CLASS="dkampe" ID="kampe1">&nbsp;1</DIV></TD>
    </TR>
    <TR>
        <TD CLASS="tdmellemrum" COLSPAN="2" onSelectStart="return false;">&nbsp;</TD>
    </TR>
    <TR>
        <TD CLASS="tdname" onSelectStart="return false;"><DIV CLASS="dname" ID="dato2">&nbsp;</DIV></TD>
        <TD CLASS="tdkampe" ID="tdkampe2" onSelectStart="return false;"><DIV CLASS="dkampe" ID="kampe2">&nbsp;2</DIV></TD>
    </TR>
    <TR>
        <TD CLASS="tdmellemrum" COLSPAN="2" onSelectStart="return false;">&nbsp;</TD>
    </TR>
    <TR>
        <TD CLASS="tdname" onSelectStart="return false;"><DIV CLASS="dname" ID="dato3">&nbsp;</DIV></TD>
        <TD CLASS="tdkampe" ID="tdkampe3" onSelectStart="return false;"><DIV CLASS="dkampe" ID="kampe3">&nbsp;3</DIV></TD>
    </TR>
    <TR>
        <TD CLASS="tdmellemrum" COLSPAN="2" onSelectStart="return false;">&nbsp;</TD>
    </TR>
    <TR>
        <TD CLASS="tdname" onSelectStart="return false;"><DIV CLASS="dname" ID="dato4">&nbsp;</DIV></TD>
        <TD CLASS="tdkampe" ID="tdkampe4" onSelectStart="return false;"><DIV CLASS="dkampe" ID="kampe4">&nbsp;4</DIV></TD>
    </TR>
    <TR>
        <TD CLASS="tdmellemrum" COLSPAN="2" onSelectStart="return false;">&nbsp;</TD>
    </TR>
    <TR>
        <TD CLASS="tdname" onSelectStart="return false;"><DIV CLASS="dname" ID="dato5">&nbsp;</DIV></TD>
        <TD CLASS="tdkampe" ID="tdkampe5" onSelectStart="return false;"><DIV CLASS="dkampe" ID="kampe5">&nbsp;5</DIV></TD>
    </TR>
    <TR>
        <TD CLASS="tdmellemrum" COLSPAN="2" onSelectStart="return false;">&nbsp;</TD>
    </TR>
    <TR>
        <TD CLASS="tdname" onSelectStart="return false;"><DIV CLASS="dname" ID="dato6">&nbsp;</DIV></TD>
        <TD CLASS="tdkampe" ID="tdkampe6" onSelectStart="return false;"><DIV CLASS="dkampe" ID="kampe6">&nbsp;6</DIV></TD>
    </TR>
</TABLE>
<DIV CLASS="fkampe" ID="fkampe0" onMouseDown="initMove(this);" onMouseUp="nede=false;" onMouseOut="nede=false;" onMouseMove="traek(this);" onSelectStart="return false;" ></DIV>
<DIV CLASS="fkampe" ID="fkampe1" onMouseDown="initMove(this);" onMouseUp="nede=false;" onMouseOut="nede=false;" onMouseMove="traek(this);" onSelectStart="return false;" ></DIV>
<DIV CLASS="fkampe" ID="fkampe2" onMouseDown="initMove(this);" onMouseUp="nede=false;" onMouseOut="nede=false;" onMouseMove="traek(this);" onSelectStart="return false;" ></DIV>
<DIV CLASS="fkampe" ID="fkampe3" onMouseDown="initMove(this);" onMouseUp="nede=false;" onMouseOut="nede=false;" onMouseMove="traek(this);" onSelectStart="return false;" ></DIV>
<DIV CLASS="fkampe" ID="fkampe4" onMouseDown="initMove(this);" onMouseUp="nede=false;" onMouseOut="nede=false;" onMouseMove="traek(this);" onSelectStart="return false;" ></DIV>
<DIV CLASS="fkampe" ID="fkampe5" onMouseDown="initMove(this);" onMouseUp="nede=false;" onMouseOut="nede=false;" onMouseMove="traek(this);" onSelectStart="return false;" ></DIV>
<DIV CLASS="fkampe" ID="fkampe6" onMouseDown="initMove(this);" onMouseUp="nede=false;" onMouseOut="nede=false;" onMouseMove="traek(this);" onSelectStart="return false;" ></DIV>
</BODY>
</HTML>
Avatar billede roenving Novice
03. juli 2003 - 16:28 #2
Og det skal siges, at jeg lige her tidligere idag kiggede lidt på drag-events, mouse-events og select-events

-- det skulle være muligt at kunne negere dine drag-events ved hjælp af en kombination af disse ...

-- dog nok ikke en nem opgave (og browser-kompatibilitet er så svær at holde styr på !-)
Avatar billede lkoudal Nybegynder
03. juli 2003 - 16:41 #3
Tak for en hurtig kommentar, der er helt klart noget jeg kan arbejde lidt med. jeg modtager dog gerne stadig folks forslag, da jeg har meget arbejde endnu.

I mellemtiden leger jeg lidt med din kode, og ser hvad jeg kan lege med ud fra den. Tak for det.

Jeg vidste foriøvrigt at jeg havde glemt noget. Browser-kompatibilitet er ret tidligt blevet sat til IE only. Det har sine grunde, og jeg håber ikke folk vil tage det som et oplæg til debat, blot en konstatering :-)

På forhånd tak.
Avatar billede =maddog= Nybegynder
03. juli 2003 - 17:53 #4
Jeg har udviklet følgende dragmanager til IE og NS/Moz. Den kan kalde funktioner ved drags og låse i horisontal og vertikal retning samt sætte bounds så der kun kan dragges indenfor et afgrænset område.

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; } );
    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() {
    document.zIndex = 0;                     
    if (!window.Element) {
    document.onmousedown = this.grabElement;
    document.onmousemove = this.dragElement;
    document.onmouseup = this.releaseElement;
    } else {
    window.onmousedown = this.grabElement;
    window.onmousemove = this.dragElement;
    window.onmouseup = this.releaseElement;
    }
}
DragManager.prototype.update = function() {
    if (!window.Element) {
    document.registeredElements = this.registeredElements;
    } else {
    window.registeredElements = this.registeredElements;
    }
}


Du må lige sige til hvis den ikke er helt overskuelig. funktionerne der kaldes hedder invokeOnXXXX, man sætter vertikal og horisontal lås med
_object.verticalLock=true;
_object.horizontalLock=true;
man sætter en bound med
_object.bottomBound=500; //bemærk en int, ikke "500px"
..osv..
man låser objektet med
_object.isAnchored=true;
Avatar billede roenving Novice
03. juli 2003 - 18:34 #5
>>=maddog=

-- det ser umiddelbart godt ud, den ryger lige ned i værktøjskassens inbox ,-)

-- men jeg læste en kommentar om, at man _altid_ burde definere både getters og setters og så selvfølgelig sætte dem til tomme funktioner for readOnly's ...

-- jeg kunne forstille mig, at begrundelsen er, at de ikke skulle give fejlmeddelelser på funktionen, men på syntaks-fejlen/funktionaliteten hvis man f.eks. glemte et = i en sammenligning ...
Avatar billede roenving Novice
03. juli 2003 - 18:37 #6
Hov !-)

... selvfølgelig sætte setters til tomme funktioner for readOnly's ...
Avatar billede lkoudal Nybegynder
03. juli 2003 - 22:50 #7
Hej =maddog=. Tak for koden, den lyder umiddelbart til at kunne en hel del af hvad jeg har behov for, jeg må dog indrømme, at jeg er lidt lost med hvordan jeg rent faktisk aktiverer den korrekt. Du er milevidt foran mig hvad angår javascript, det kan jeg da tydeligt se. Havde du mulighed for at lave et kort, simpelt eksempel? På forhånd tak! :-)
Avatar billede =maddog= Nybegynder
04. juli 2003 - 09:23 #8
Jeg har en lille test-side her. Bemærk at et af dine krav, nemlig kravet til markering af tekst ikke er opfyldt i denne test, af den simple grund at det er upraktisk. Det er nu ikke svært at genaktivere. Du skal blot fjerne return false; i dragElement, og så får event'et lov til lystigt at boble ned til andre eventhandlers.
Med hensyn til getter og setter så har jeg aldrig hørt at det er et krav begge er defineret. Jeg har aldrig set noget på skrift, men jeg har set meget professionelle gamle Mozilla scripts hvor der er ensidig definition. Et eventuelt link til en kilde ville være rart.

<!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.top;
        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);
   
    // Sluttelig kan vi låsei vertikal eller horisontal retning (og i princippet i begge retninger selvom det virker meningsløs)
    // Denne gang opretter vi en div til formålet
    myObj = document.createElement("DIV");
    myObj.style.width="100px";
    myObj.style.height="100px";
    myObj.style.backgroundColor="silver";
    myObj.appendChild(document.createTextNode("I'm locked vertically"));
    document.body.appendChild(myObj);
    myObj.verticalLock=true;
    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 roenving Novice
04. juli 2003 - 13:10 #9
>>=maddog=

Ha, jeg synes jo nok, jeg kendte den, for du har brugt eksemplet i et andet spm, hvor jeg checkede den, men beklageligvis fik jeg ikke smidt den i en inbox, så derfor har jeg ikke fået checket den ud ,-)

Men det ser stadig ud til at være kanon *gg*
Avatar billede =maddog= Nybegynder
04. juli 2003 - 13:35 #10
jamen jeg ser ingen problemer i at genbruge ting :D
det er jo grunden til at man ofrer lidt eksta tid til at sidde og programmere objekt-orienteret. Man kan genbruge sin kode og det er super.
Du er velkommen til både at bruge det i dine egne ting, samt anvende det til svar her på E. Jeg har ikke ejer-fornemmelser, og alt hvad jeg poster her er ikke beskyttet af nogen som helst ophavsret. Det hænder jo (alt for sjældent) man laver noget men får penge for - så skal man lige passe på med ikke at forære det gratis til andre.
Avatar billede roenving Novice
04. juli 2003 - 15:07 #11
Genbrug er en dejlig ting ;O)

-- No offense, nærmest at du heller ikke skulle blive fornærmet, fordi jeg tidligere havde haft en kommentar på den ,-)
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