Avatar billede darkcow Nybegynder
11. september 2006 - 22:54 Der er 3 kommentarer

Div resize problem i JavaScript

Er løbet ind i et mindre problem angående det nedenstående script. "Vinduerne" det skaber kan dragges, lukkes, og resizes. Men der opstår en fejl når jeg først flytter mit vindue og derefter forsøger at resize det. Dette har holdt mig vågen alt for lang tid , så besluttede mig for at prøve at søge hjælp her.

På forhånd tak, Jens.

P.S. Scriptet virker lige pt, kun i delvist i firefox (min beta gik ned og har først lige installeret det gamle igen). Men ellers fuldt funktionelt i IE 7.0, udover den ovenstående fejl.
<html>
    <head>
        <title>
            test
        </title>
        <script type="text/javascript">
            var windowContainer;
            var currentlyFocused;
            var currentDrag;
            var currentDragStartPosX;
            var currentDragStartPosY;
            var currentResize;
           
            window.onload = function ()
            {
                windowContainer = document.getElementById("windowContainer");
            }
           
            document.onmousemove = function ()
            {
                if(currentDrag != null)
                {
                    currentDrag.style.top = event.clientY - currentDragStartPosY;
                    currentDrag.style.left = event.clientX - currentDragStartPosX;
                }
               
                if(currentResize != null)
                {
                    currentResize.style.width = event.clientX  - currentResize.style.left;
                    currentResize.style.height = event.clientY - currentResize.style.top;
                }
            }
           
            function windowMouseUp(window)
            {
               
            }
           
            function windowMouseDown(window)
            {
                windowFocus(window);
            }
           
            function windowStartResize(window)
            {
                currentResize = window;
            }
           
            function windowRemove(window)
            {
                windowContainer.removeChild(window);
            }
           
            function windowStopResize(window)
            {
                currentResize = null;
            }
           
            function windowStartDrag(window)
            {
                currentDrag = window;
                currentDrag.style.filter = "alpha(opacity=50);";
                currentDragStartPosX = event.offsetX;
                currentDragStartPosY = event.offsetY;
            }
           
            function windowStopDrag(window)
            {
                currentDrag.style.filter = "alpha(opacity=100);";
                currentDrag = null;
            }
           
            function windowFocus(window)
            {
                if(currentlyFocused != null)
                {
                    currentlyFocused.style.zIndex = 0;
                    currentlyFocused.style.borderColor = "black";
                }
               
                window.style.borderColor = "green";
                window.style.zIndex = 100;
                currentlyFocused = window;
            }
        </script>
        <style>
            div.window {
                height: 200px;
                width: 200px;
                border: solid black 1px;
            }
           
            #one {
                background-color: #FF00FF;
                position: absolute;
                top: 10px;
                left: 10px;
            }
           
            #two {
                background-color: #FF0000;
                position: absolute;
                top: 20px;
                left: 20px;
            }
        </style>
    </head>
    <body>
        <div id="windowContainer">
            <div class="window" id="one" onmousedown="windowMouseDown(this);" onmouseup="windowMouseUp(this);">
                <div onmousedown="windowStartDrag(this.parentNode);" onmouseup="windowStopDrag(this.parentNode);" style="background-color:black; width:100%; height: 20px;">&nbsp;</div>
                <div onclick="windowRemove(this.parentNode);" style="background-color:blue; position:absolute; right:0px; top:0px; width: 20px; height:20px;">&nbsp;</div>
                <div onmousedown="windowStartResize(this.parentNode);" onmouseup="windowStopResize(this.parentNode);" style="width: 20px; height: 20px; right: 0px; bottom:0px; background-color: black; position: absolute;"></div>
            </div>
            <div class="window" id="two" onmousedown="windowMouseDown(this);" onmouseup="windowMouseUp(this);">
                <div onmousedown="windowStartDrag(this.parentNode);" onmouseup="windowStopDrag(this.parentNode);" style="background-color:black; width:100%; height: 20px;">&nbsp;</div>
                <div onclick="windowRemove(this.parentNode);" style="background-color:blue; position:absolute; right:0px; top:0px; width: 20px; height:20px;">&nbsp;</div>
                <div onmousedown="windowStartResize(this.parentNode);" onmouseup="windowStopResize(this.parentNode);" style="width: 20px; height: 20px; right: 0px; bottom:0px; background-color: black; position: absolute;"></div>
            </div>
        </div>
    </body>
</html>
Avatar billede olebole Juniormester
12. september 2006 - 14:50 #1
<ole>

Scriptet er skrevet som et IE-only-script - og er fyldt med alvorlige fejl ... det er ret skuffende, hvis det virkelig virker i IE  :o|

'window' er et reserveret ord i JavaScript - at anvende det som variabel-navn er at sætte vand over til problemer  :)

Style-værdier som f.eks. 'top', 'left', 'width' og 'height' skal _altid_ efterfølges af en enhed ... f.eks. 'px':
    ELEMENT.style.width = event.clientX + "px";

Et udtryk som dette:
    currentResize.style.left

- vil altid returnere et tal med en enhed ... f.eks: '125px'. Derfor giver det ikke mening at lægge det sammen med et tal. Udtrykket skal først parses som integer:
    currentResize.style.width = (event.clientX - parseInt(currentResize.style.left)) + "px";

- men med mindre, du eksplicit har sat en left-værdi på elementets style-objekt, returnerer:
    currentResize.style.left
- intet ... hvorfor udtrykket:
    parseInt(currentResize.style.left)
- i så fald vil udløse en fejl.

Måden, du bruger opacitet på, kan kun bruges i IE - og det samme gælder din behandling af events. I det hele taget er der ikke mange huller mellem fejlene  :)

/mvh
</bole>
Avatar billede darkcow Nybegynder
12. september 2006 - 16:06 #2
Tak for det hurtige svar:)

Har opdateret koden så den nu ser sådan ud:

<html>
    <head>
        <title>
            test
        </title>
        <script type="text/javascript">
            var windowContainer;
            var currentlyFocused;
            var currentDrag;
            var currentDragStartPosX;
            var currentDragStartPosY;
            var currentResize;
            var currentResizeNewWidth;
            var currentResizeNewHeight;
           
            document.onmousemove = function (e)
            {
                if(e!=null)
                {
                    event = e;
                }
                if(currentDrag != null)
                {
                    currentDrag.style.top = (event.clientY - currentDragStartPosY) + "px";
                    currentDrag.style.left = (event.clientX - currentDragStartPosX) + "px";
                }
               
                if(currentResize != null)
                {
                    var nW = event.clientX - currentResize.offsetLeft + 2;
                    var nH = event.clientY - currentResize.offsetTop + 2;
                    currentResize.style.width = nW + "px";
                    currentResize.style.height = nH + "px";
                }
            }
           
            window.onload = function ()
            {
                var body = document.childNodes[0].childNodes[1];
                if(body.hasChildNodes)
                {
                    var children = body.childNodes;
                    var i = 0;
                    while(i < children.length)
                    {
                        var child = children[i];
                        if(child.className == "window")
                        {
                            child.onmouseup = function ()
                            {
                                windowMouseUp(this);
                            }
                            child.onmousedown = function ()
                            {
                                windowMouseDown(this);
                            }
                            nodes = child.childNodes;
                            var j = 0;
                            while(j < nodes.length)
                            {
                                node = nodes[j];
                                switch(node.className)
                                {
                                    case "topBar":
                                        node.onmouseup = function ()
                                        {
                                            windowStopDrag(this.parentNode);   
                                        }
                                        node.onmousedown = function ()
                                        {
                                            windowStartDrag(this.parentNode);
                                        }
                                        break;
                                    case "closeButton":
                                        node.onclick = function ()
                                        {
                                            windowRemove(this.parentNode);
                                        }
                                        break;
                                    case "resizeButton":
                                        node.onmouseup = function ()
                                        {
                                            windowStopResize(this.parentNode);
                                        }
                                        node.onmousedown = function ()
                                        {
                                            windowStartResize(this.parentNode);
                                        }
                                        break;
                                }
                                j++;
                            }
                        }
                        i++;
                    }
                }
            }
           
            function windowMouseUp(window)
            {

            }
           
            function windowMouseDown(window)
            {
                windowFocus(window);
            }
           
            function windowStartResize(window)
            {
                currentResize = window;
            }
           
            function windowStopResize(window)
            {
                currentResize = null;
            }
           
            function windowRemove(window)
            {
                window.parentNode.removeChild(window);
            }
           
            function windowStartDrag(window)
            {
                currentDrag = window;
                currentDrag.style.filter = "alpha(opacity=50);";
                currentDragStartPosX = event.offsetX;
                currentDragStartPosY = event.offsetY;
            }
           
            function windowStopDrag(window)
            {
                currentDrag.style.filter = "alpha(opacity=100);";
                currentDrag = null;
            }
           
            function windowFocus(window)
            {
                if(currentlyFocused != null)
                {
                    currentlyFocused.style.zIndex = 0;
                    currentlyFocused.style.borderColor = "black";
                }
               
                window.style.borderColor = "green";
                window.style.zIndex = 100;
                currentlyFocused = window;
            }
           
            function debugAdd(text)
            {
                debugDiv = document.getElementById("debug");
                debugDiv.innerHTML = debugDiv.innerHTML + text + "<br />";
            }
        </script>
        <style>
            div.window {
                height: 200px;
                width: 200px;
                border: solid black 1px;
            }
           
            div.topBar {
                background-color:black;
                width:100%;
                height: 20px;
            }
           
            div.closeButton {
                background-color:blue;
                position:absolute;
                right:0px;
                top:0px;
                width: 20px;
                height:20px;
            }
           
            div.resizeButton {
                width: 20px;
                height: 20px;
                right: 0px;
                bottom:0px;
                background-color: black;
                position: absolute;
            }
           
            #one {
                background-color: #FF00FF;
                position: absolute;
                top: 10px;
                left: 10px;
            }
           
            #two {
                background-color: #FF0000;
                position: absolute;
                top: 20px;
                left: 20px;
            }
           
        </style>
    </head>
    <body>
        <div id="debug">
        </div>
        <div class="window" id="one">
            <div class="topBar">&nbsp;</div>
            <div class="closeButton">&nbsp;</div>
            <div class="resizeButton"></div>
        </div>
        <div class="window" id="two">
            <div class="topBar">&nbsp;</div>
            <div class="closeButton">&nbsp;</div>
            <div class="resizeButton"></div>
        </div>
    </body>
</html>

Hvis du har tid og lyst, ville jeg være taknemmelig hvis du ville forklare mig hvor jeg gør fejlen med events, er meget ny til alt det her med javascript :)

V.H. Jens.
Avatar billede horsmark Nybegynder
18. september 2006 - 13:09 #3
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