Avatar billede pvtsommer Nybegynder
08. april 2006 - 23:03 Der er 12 kommentarer og
1 løsning

Javascript dragaround boks

Ja, jeg var lidt for hurtigt ude i tidligere emne, da jeg troede jeg havde løst problemet. Det havde jeg slet ikke. Så jeg prøver igen.

Det består i at der er to inputboksE (sliderX og sliderY) som skal opdateres med kordinaterne på boksen.

Ved at ændre lidt frem og tilbage i den, viser det sig at det er "y" som fejler, og at det er:

    this.oDownY = ye.clientY - pI(this.oSlid.style.top);

this.oSlid.style.top, som er problemet. Fjerner jeg denne, kører den som sådan egentlig ok, altså den virker, men man kan liiige trække den lidt for langt hele tiden (hvilket den - this.oSlid.style.top vel sørger for.

Hvad gør jeg galt der, og hvordan får jeg det rettet til?

(koden kommer i kommentar herunder).

Links:
Oprindeligt, kun med x-aksen:
- http://www.eksperten.dk/spm/638856
Et eksempel på hvordan det fungerer (x-aksen):
- http://brainstar.dk/stribe/
Tidligere spørgsmål jeg fik lukket for hurtigt:
- http://www.eksperten.dk/spm/699231
Avatar billede pvtsommer Nybegynder
08. april 2006 - 23:03 #1
/*  Handy wrapper funktioner  */
var d=document;
function gE(id){return d.getElementById(id)};
function pI(s){return parseInt(s)};
function gXe(e){e=e||window.event;if(!e.srcElement)e.srcElement=e.target;
if(typeof e.clientX=="undefined"){e.clientX=e.pageX;e.clientY=e.pageY}
if(!e.preventDefault)e.preventDefault=function(){this.returnValue=false};
return e};
function gYe(e){e=e||window.event;if(!e.srcElement)e.srcElement=e.target;
if(typeof e.clientY=="undefined"){e.clientY=y.pageYe.clientX=e.pageX;}
if(!e.preventDefault)e.preventDefault=function(){this.returnValue=false};
return e};
/********************************/

/*  Constructor for slider objektet  */
function SliderObject(sliderID, fieldXID, fieldYID) {
// Opret reference til objektet selv.
// - nødvendig ved callback fra event-handlers
    var me = this;
    this.oSlid = gE(sliderID); // Slider elementet
    this.oXField = gE(fieldXID); // X Feltet, der skal opdateres
    this.oYField = gE(fieldYID); // Y Feltet, der skal opdateres
    this.minXValue = 0; // Default X minimums værdi
    this.maxXValue = 650; // Default X  maximums værdi
    this.minYValue = 0; // Default Y minimums værdi
    this.maxYValue = 180 // Default Y maximums værdi
// Den samlede bredde af sliderens venstre- og højre-border
    this.borderXOffset = pI(this.oSlid.style.borderLeftWidth) + pI(this.oSlid.style.borderLeftWidth);
    this.borderYOffset = pI(this.oSlid.style.borderTopWidth) + pI(this.oSlid.style.borderTopWidth);
    this.oDownX = null; // Indeholder senere X-værdien for brugerens klik
    this.oDownY = null; // Indeholder senere Y-værdien for brugerens klik
// Sæt event-handler på slideren
    this.oSlid.onmousedown = function(e){me.mDown(e)};
    return this; // returner objektet
}
var _p = SliderObject.prototype;
_p.mDown = function(e) {
    var me = this; // Reference til objektet selv
    xe = gXe(e); // Skab et X-browser event-objekt
    ye = gYe(e); // Skab et X-browser event-objekt
// Gem documentets event-handlers til senere brug
    this.docEventCache = {"move":d.onmousemove, "up":d.onmouseup};
// Sæt event-handelers på dokumentet
    d.onmouseup = function(e){me.mUp(e)};
    d.onmousemove = function(e){me.mMove(e)};
// Gem venstre-værdien for brugerens klik - minus sliderens venstre-offset
    this.oDownX = xe.clientX - pI(this.oSlid.style.left);
    this.oDownY = ye.clientY - pI(this.oSlid.style.top);
}
_p.mMove = function(e) {
// Sæt max-værdien for sliderens left
    var x, maxXL = this.maxXValue-(this.oSlid.offsetWidth-this.borderXOffset);
    var y, maxYL = this.maxYValue-(this.oSlid.offsetTop-this.borderYOffset);
    xe = gXe(e); // Skab et X-browser event-objekt
    ye = gYe(e); // Skab et X-browser event-objekt
    x = xe.clientX - this.oDownX; // Udregn den nye venstre-værdi
    y = ye.clientY - this.oDownY; // Udregn den nye top-værdi
// Juster, hvis værdien er under min eller over max
// - sæt den nye værdi på slideren
    this.oSlid.style.left = ((x<this.minXValue)? this.minXValue : (x>maxXL)? maxXL : x) + "px";
    this.oSlid.style.top = ((y<this.minYValue) ? this.minYValue :  (y>maxYL)? maxYL : y) + "px";
}
_p.mUp = function() {
// Opdater elementet i formen
    this.oXField.value = pI(this.oSlid.style.left);
    this.oYField.value = pI(this.oSlid.style.top);
// Retabler dokumentets event-handlers
    d.onmouseup = this.docEventCache.up;
    d.onmousemove = this.docEventCache.move;
}

var oSlider = null;
window.onload = function(){
    oSlider = new SliderObject("alph_box", "sliderX", "sliderY");
    oSlider.maxXValue = 650;
    oSlider.maxYValue = 230;
}
Avatar billede pvtsommer Nybegynder
08. april 2006 - 23:04 #2
Håber I kan hjælpe...
Avatar billede mclemens Nybegynder
08. april 2006 - 23:54 #3
det kan vi ;)
... det var godt nok svær at finde
... ledte scripte igennem på kryds og tværs :/
(dog er 200 point for meget bare kast lidt ;) )

<span id="alph_box" style="border: 1px solid black; left: 142px;top:0px;">



her er et eksempel der virker:

<!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"><!-- Metas, der forhindrer toolbars ved mouseover på billeder -->

    <meta http-equiv="imagetoolbar" content="no">
    <meta http-equiv="imagetoolbar" content="false"><title>TITLE</title>
   
<style type="text/css">
body, html {
    height: 100%;
    margin: 0;
    padding: 0;
}
#sliderCont {
    position: relative;
}
#alph_box {
    position: absolute;
    width: 170px;
    height: 100px;
    left: 0;
    top: 0;
    background-color: #EFEFEF;
    filter: alpha(opacity=30);
    -moz-opacity: 0.3;
    opacity: 0.3;
}
.imageborder {
    border: 1px ridge #000000;
}
</style>
<script type="text/JavaScript">
/*  Handy wrapper funktioner  */
var d=document;
function gE(id){return d.getElementById(id)};
function pI(s){return parseInt(s)};
function gXe(e){e=e||window.event;if(!e.srcElement)e.srcElement=e.target;
if(typeof e.clientX=="undefined"){e.clientX=e.pageX;e.clientY=e.pageY}
if(!e.preventDefault)e.preventDefault=function(){this.returnValue=false};
return e};
function gYe(e){e=e||window.event;if(!e.srcElement)e.srcElement=e.target;
if(typeof e.clientY=="undefined"){e.clientY=y.pageYe.clientX=e.pageX;}
if(!e.preventDefault)e.preventDefault=function(){this.returnValue=false};
return e};
/********************************/

/*  Constructor for slider objektet  */
function SliderObject(sliderID, fieldXID, fieldYID) {
// Opret reference til objektet selv.
// - nødvendig ved callback fra event-handlers
    var me = this;
    this.oSlid = gE(sliderID); // Slider elementet
    this.oXField = gE(fieldXID); // X Feltet, der skal opdateres
    this.oYField = gE(fieldYID); // Y Feltet, der skal opdateres
    this.minXValue = 0; // Default X minimums værdi
    this.maxXValue = 650; // Default X  maximums værdi
    this.minYValue = 0; // Default Y minimums værdi
    this.maxYValue = 180 // Default Y maximums værdi
// Den samlede bredde af sliderens venstre- og højre-border
    this.borderXOffset = pI(this.oSlid.style.borderLeftWidth) + pI(this.oSlid.style.borderLeftWidth);
    this.borderYOffset = pI(this.oSlid.style.borderTopWidth) + pI(this.oSlid.style.borderTopWidth);
    this.oDownX = null; // Indeholder senere X-værdien for brugerens klik
    this.oDownY = null; // Indeholder senere Y-værdien for brugerens klik
// Sæt event-handler på slideren
    this.oSlid.onmousedown = function(e){me.mDown(e)};
    return this; // returner objektet
}
var _p = SliderObject.prototype;
_p.mDown = function(e) {
    var me = this; // Reference til objektet selv
    xe = gXe(e); // Skab et X-browser event-objekt
    ye = gYe(e); // Skab et X-browser event-objekt
// Gem documentets event-handlers til senere brug
    this.docEventCache = {"move":d.onmousemove, "up":d.onmouseup};
// Sæt event-handelers på dokumentet
    d.onmouseup = function(e){me.mUp(e)};
    d.onmousemove = function(e){me.mMove(e)};
// Gem venstre-værdien for brugerens klik - minus sliderens venstre-offset
    this.oDownX = xe.clientX - pI(this.oSlid.style.left);
    this.oDownY = ye.clientY - pI(this.oSlid.style.top);
}
_p.mMove = function(e) {
// Sæt max-værdien for sliderens left
    var x, maxXL = this.maxXValue-(this.oSlid.offsetWidth-this.borderXOffset);
    var y, maxYL = this.maxYValue-(this.oSlid.offsetTop-this.borderYOffset);
    xe = gXe(e); // Skab et X-browser event-objekt
    ye = gYe(e); // Skab et X-browser event-objekt
    x = xe.clientX - this.oDownX; // Udregn den nye venstre-værdi
    y = ye.clientY - this.oDownY; // Udregn den nye top-værdi
// Juster, hvis værdien er under min eller over max
// - sæt den nye værdi på slideren
    this.oSlid.style.left = ((x<this.minXValue)? this.minXValue : (x>maxXL)? maxXL : x) + "px";
    this.oSlid.style.top = ((y<this.minYValue) ? this.minYValue :  (y>maxYL)? maxYL : y) + "px";
}
_p.mUp = function() {
// Opdater elementet i formen
    this.oXField.value = pI(this.oSlid.style.left);
    this.oYField.value = pI(this.oSlid.style.top);
// Retabler dokumentets event-handlers
    d.onmouseup = this.docEventCache.up;
    d.onmousemove = this.docEventCache.move;
}

var oSlider = null;
window.onload = function(){
    oSlider = new SliderObject("alph_box", "sliderX", "sliderY");
    oSlider.maxXValue = 650;
    oSlider.maxYValue = 230;
}
</script></head><body>

<div style="margin: 50px;" onselectstart="return false">
<div id="sliderCont">
    <span id="alph_box" style="border: 1px solid black; left: 142px;top:0px;"><img src="" ondragstart="return false;" onmousedown="return false;" style="padding: 0px; margin-top: 10px;"></span>
    <img id="img_galleripic" src="123_files/stribe.jpg" style="width: 666px;" class="imageborder" ondragstart="return false" onmousedown="return false">
</div>
</div>

<form>

    <input id="sliderX" name="kaldMigHvadDuVil" value="Bør være type='hidden'" type="text">
    <input id="sliderY" name="kaldMigHvadDuVil" value="Bør være type='hidden'" type="text">
</form>

</body></html>
Avatar billede mclemens Nybegynder
08. april 2006 - 23:55 #4
(det var top:0px; der manglede)
Avatar billede mclemens Nybegynder
09. april 2006 - 00:01 #5
(dog er 200 point for meget bare kast lidt ;) ) -> 25point er fint nok ;)
Avatar billede pvtsommer Nybegynder
09. april 2006 - 12:25 #6
Orv... Jeg store idiot. Kom til at ændre koden så sliderX ikke virkede. Og det var ved at fjerne left: 0px... :S

Vender lige tilbage med point om lidt
Avatar billede pvtsommer Nybegynder
09. april 2006 - 13:24 #7
Jeg er så glad i dag! Jeg er så glad i dag! Du er simpelthen bare herlig! JEg smider gladeligt en 100 krone efter dig for at have fundet årets værste fejl :D - I så fald smid en mail på lars@businet.dk!!

Uff... nu kan jeg endelig fortsætte med mit projekt!!!!!!
Avatar billede mclemens Nybegynder
09. april 2006 - 13:58 #8
[ JEg smider gladeligt en 100 krone efter dig for at have fundet årets værste fejl :D - I så fald smid en mail på lars@businet.dk!! ]
- Nej tak, det er fint nok med point... det var næsten for mange :P
... men, takker for point :)
- held og lykke ;)
Avatar billede pvtsommer Nybegynder
09. april 2006 - 14:05 #9
Det var det slet ikke. Har ikke været aktiv herinde længe, men har dog læst jævnligt på forskellige emner, og ved at normalt er 200 bare noget man som "ny" smider for det ene spørgsmål man har. MEN! Når man så sidder fuldstændig fast, med noget så åndsvagt som at mangle top: 0px; - ja, så bliver man satme glad når det er lavet!
Avatar billede pvtsommer Nybegynder
09. april 2006 - 15:33 #10
Opdatering: Systemet fungerede perfekt! MEN! Den var ustabil i bunden hvis man trak den langt væk, og den fungerede af en eller anden grund ikke perfekt afhængigt af billedestørrelserne man ville indsætte.

Så jeg har lavet et andet system.

I stedet for:
var y, maxYL = this.maxYValue-(this.oSlid.offsetTop-this.borderYOffset);
bruger jeg nu:
    var y, maxYL = this.maxYValue-<?= $imageHeight; ?>;

imageHeight bliver så skrevet af PHP (men den kan man vel få på så mange andre måder).

Det gør systemet 100% perfekt, og nu er det bare 100% stabilt også.

Tak for hjælpen endnu engang (olebole, mclemens, m.v.)
Avatar billede mclemens Nybegynder
09. april 2006 - 17:30 #11
[ imageHeight bliver så skrevet af PHP (men den kan man vel få på så mange andre måder). ]
- ja muligvis også sådan her: (husk id="imgbillede" på billedet også ) ... ikke testet

var y, maxYL = this.maxYValue-document.getElementById("imgbillede").offsetHeight;
Avatar billede pvtsommer Nybegynder
09. april 2006 - 17:34 #12
^^ Overstående fungerer også. Og hermed er den erstattet ;)
Avatar billede mclemens Nybegynder
09. april 2006 - 18:07 #13
super ;)
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