Avatar billede funkyloonie Nybegynder
02. marts 2005 - 18:58 Der er 11 kommentarer og
1 løsning

Dragge et div

Hej

Jeg har forgæves forsøgt at lave et eksempel med at dragge et div til en anden position på siden. Her er et simpelt eksempel men ingen af events raises. Hvad gør jeg forkert?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>           
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Image Intelligent</title>

<style type='text/css'>
#selection {
    border: 1px solid rgb(0,0,0);
    background-color: rgb(200,200,200); 
    position:absolute;
    overflow: hidden;
    width: 50px;
    height: 50px;
    left: 200px;
    top: 100px;
}
</style>
</head>
<body>
    </div>
    <div id="selection" onDrag="window.status='test';" onDragStart="alert(test');">
    </div>   
</body>
</html>
Avatar billede elskermad.dk Nybegynder
02. marts 2005 - 19:04 #1
undskyld jeg spørg (vil også gerne lære lidt :D) hvad er at dragge?
Avatar billede funkyloonie Nybegynder
02. marts 2005 - 19:45 #2
Drag N' Drop. Flytte elementer vha. musen.
Avatar billede roenving Novice
03. marts 2005 - 12:03 #3
-- det er ret omstændigt at gøre det rigtigt, men du kan jo kigge på et script =maddog= lavede for nogle år siden:

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

<html>
<head>
<title>=maddog=s dragmanager</title>
<meta name="Generator" content="Stone's WebWriter 4">
<style type="text/css">
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 funkyloonie Nybegynder
03. marts 2005 - 12:06 #4
ok. det vil jeg lege lidt med. Smid et svar.

Hvad med onDragStart, er den ikke funktionel ?
Avatar billede roenving Novice
03. marts 2005 - 12:10 #5
U'r welcome '-)

-- og jeg har ikke for alvor beskæftiget mig med dragging, så de finere hjørner er jeg slet ikke bekendt med !-)
Avatar billede roenving Novice
03. marts 2005 - 12:48 #6
-- Tak for point ;~}
Avatar billede funkyloonie Nybegynder
03. marts 2005 - 12:51 #7
Tak for hjælpen!! ;-)
Avatar billede olebole Juniormester
03. marts 2005 - 12:57 #8
<ole>

'ondragstart' event'en hører hjemme i MS' proprietære DOM:
    http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/events/ondragstart.asp

- læg mærke til de andre drag/drop events i menuen til venstre

/mvh
</bole>
Avatar billede funkyloonie Nybegynder
03. marts 2005 - 13:33 #9
når du siger at den hører hjemme i MS' proprietære DOM mener ud så den kun virker i IE?
Avatar billede olebole Juniormester
03. marts 2005 - 13:39 #10
yups  :)
Avatar billede funkyloonie Nybegynder
03. marts 2005 - 13:41 #11
OK. Så glemmer jeg alt om den da jeg gerne vil have de andre browsere med ;-)
Avatar billede olebole Juniormester
03. marts 2005 - 14:04 #12
;o)
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