[JS] div positie in IE, NS en ...

Pagina: 1
Acties:

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
En nu wil ik wel es van het eeuwige gezeur af zijn. Hoe krijg ik deze code voor zo veel mogelijk browsers werkend?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  function getLeft(obj) {
    if (IE) return obj.style.pixelLeft;
  }

  function getTop(obj) {
    if (IE) return obj.style.pixelTop;
  }

  function setLeft(obj, left) {
    if (IE) obj.style.pixelLeft = left +'px';
  }

  function setTop(obj, top) {
    if (IE) obj.style.pixelTop = top +'px';
  }

Thanx, me.

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 08:15

RM-rf

1 2 3 4 5 7 6 8 9

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  function getLeft(obj) {
    if (IE) return obj.style.pixelLeft;
   if (DOM) return parseInt(obj.style.left)
    if (NS4) return obj.left
  }

  function getTop(obj) {
    if (IE) return obj.style.pixelTop;
   if (DOM) return parseInt(obj.style.top)
    if (NS4) return obj.top
  }

  function setLeft(obj, left) {
    if (IE || DOM) obj.style.top = left +'px';
    if (NS4)  obj.moveTo(left, obj.top)
  }

  function setTop(obj, top) {
    if (IE || DOM) obj.style.top = top +'px';
    if (NS4)  obj.moveTo(left, obj.top)
  }

niet geheel net, mogelijk is het beter met offsetLeft en offsetTop te werkn, maar meen dat daar problemen waren rondom margins etc.

verder kun je op ppk's http://www.xs4all.nl/~ppk/ kijken naar zijn werk op het findPos scriptje en zijn miniDOM, wel leuke methodes, alhoewel niet helemaal uitgekristaliseerd.

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Ik snap er geen knikker van waarom de code niet werkt in NS. Kun je in NS geen objecten aan een funtie mee geven ofzo?

Verwijderd

Op vrijdag 19 april 2002 16:41 schreef Graveheart het volgende:
Ik snap er geen knikker van waarom de code niet werkt in NS. Kun je in NS geen objecten aan een funtie mee geven ofzo?
Ik geef je een wat grotere kans op een zinnig antwoord als je een stuk code post van hoe je het aanroept, welke objecten je meegeeft, etc...

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Op vrijdag 19 april 2002 16:51 schreef Blues het volgende:

[..]

Ik geef je een wat grotere kans op een zinnig antwoord als je een stuk code post van hoe je het aanroept, welke objecten je meegeeft, etc...
Eh, doe es iets:
code:
1
2
3
4
5
6
7
8
9
10
function getLeft(obj) {
  obj = eval(obj);
  if (IE) return obj.style.pixelLeft;
  if (DOM) return parseInt(obj.style.left)
  if (NS4) return obj.left
}
.
.
.
<div id='layer1' onClick='getLeft(this.id);'>

Verwijderd

code:
1
<div onclick="..."

NS4 kent het onclick event niet voor DIVs. Dat moet je anders oplossen, sorry.

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 08:15

RM-rf

1 2 3 4 5 7 6 8 9

Op vrijdag 19 april 2002 17:17 schreef Graveheart het volgende:

[..]

Eh, doe es iets:
code:
1
2
3
4
5
6
7
function getLeft(obj) {
  obj = eval(obj);
  if (IE) return obj.style.pixelLeft;
  if (DOM) return parseInt(obj.style.left)
  if (NS4) return obj.left
}
<div id='layer1' onClick='getLeft(this.id);'>
verder kent netscape this.id niet als object, enkel als string (overigens msie op deze manier ook niet, dacht ik)
netscape zal dat met document.layers[this.id] moeten doen (zou ook wel eens kunnen zijn dat ns4x de name ipv de id nodig heeft)
ik meen dat netscape wel onmousedown ipv onclick kende voor een layer

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Hmm, was misschien niet zo'n goed voorbeeld, maar het ligt geloof ik niet aan het door geven van het object.
code:
1
<input type='text' name='test' onClick='this.value=klik;'>

Deze werkt wel.
code:
1
<input type='text' name='test' onClick='test.value=klik;'>

En deze werkt niet :?

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

test.value ?

test zal die proberen te zoeken in het window-object en window.test bestaat niet. Bovendien is 'test' een gereserveerde naam in JavaScript (en meeste andere talen) en is het niet aan te raden deze te gebruiken.

"this.form.test.value" zou gewoon moeten werken al is het een omweg natuurlijk...

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
test.value in Explorer werkt prima. In netscape doet hij het ook niet met een andere naam.

En de textbox zit niet in een form.
document.all.test.value werkt ook niet.

Ik heb de naam in test1 veranderd btw.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Op maandag 22 april 2002 09:36 schreef Graveheart het volgende:
test.value in Explorer werkt prima. In netscape doet hij het ook niet met een andere naam.
Yup.. IE registreert formelementen wel in het window-object als je geen <FORM> gebruikt. Fout van IE en jouw code.
En de textbox zit niet in een form.
Das dus de fout. FORM-elementen moeten in een <FORM>.

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Het gaat hier boven (de oorspronkelijke vraag) allemaal om div. Hier zou ik dus document.layers[this.id] moeten gebruiken?

Ik geef hier wel het object mee en niet het id, wat zou het dan moeten zijn?

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Op maandag 22 april 2002 09:54 schreef Graveheart het volgende:
Het gaat hier boven (de oorspronkelijke vraag) allemaal om div. Hier zou ik dus document.layers[this.id] moeten gebruiken?

Ik geef hier wel het object mee en niet het id, wat zou het dan moeten zijn?
Als je al het object meegeeft hoef je toch helemaal niks meer te doen?
function getLeft(obj) {
//obj = eval(obj); <- Bullshit
if (IE) return obj.style.pixelLeft;
if (DOM) return parseInt(obj.style.left)
if (NS4) return obj.left
}
[...]
<div id='layer1' onmousedown='getLeft(this)'>

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Op maandag 22 april 2002 10:11 schreef Bosmonster het volgende:

[..]

Als je al het object meegeeft hoef je toch helemaal niks meer te doen?
[..]
Ik doe het met een omweggetje. Ik geef het id mee aan een functie, in die functie zet ik hem om naar een object met eval() en daarna roep ik die functie getLeft() aan, maar dat werkt niet :(

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Op maandag 22 april 2002 23:29 schreef Graveheart het volgende:

[..]

Ik doe het met een omweggetje. Ik geef het id mee aan een functie, in die functie zet ik hem om naar een object met eval() en daarna roep ik die functie getLeft() aan, maar dat werkt niet :(
Waarom heb ik het gevoel dat je niet luistert? |:( Er wordt een voorbeeld gegeven van hoe het (ongeveer) wel kan.

eval(obj.id) werkt niet. Mogelijk wel in IE door de soepelheid van interpretatie van deze browser, maar STANDAARD is het niet. Wat het namelijk letterlijk zegt is dit:

eval("test") -> window.test

NETSCAPE 4 ONDERSTEUNT GEEN INLINE EVENTS VOOR LAYERS!!!

Netscape 4 engine is jaartje of 6 oud ofzo en dat is nogal een tijd op internet :P Op deze manier werkt het wel in NS4:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<html>
<head>
<style type="text/css">
#layer1{position:absolute}
</style>
<script>
function getLeft(obj) {
//obj = eval(obj); <- Bullshit
if (document.all) return obj.style.pixelLeft;
if (document.getElementById) return parseInt(obj.style.left)
if (document.layers) return obj.left
}

function doNS4mousedown(){
    alert(getLeft(document.layers['layer1']));
    return false;
}

function initNS4Events(){
    if(document.layers){
        document.layers['layer1'].document.captureEvents(Event.MOUSEDOWN);
        document.layers['layer1'].document.onmousedown = doNS4mousedown;
    }
}

</script>
</head>
<body onload="initNS4Events()">
<div id='layer1' onmousedown='alert(getLeft(this))'>bla</div>
</body>
</html>

Maar daar moet je nu toch echt zelf wat van kunnen maken.. i.p.v. alleen maar zeggen "het werkt niet"...

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
Waarom heb ik het gevoel dat je niet luistert? Er wordt een voorbeeld gegeven van hoe het (ongeveer) wel kan.
Je geeft wel een voorbeeld, maar op deze manier werk je anders. Ik moet het met id doen, anders werkt hij op een andere plek niet. Ik gebruik ook setTimeout en daarin roep ik een functie aan waar ik ook dit object aan mee moet geven. Objecten mee geven kan niet aan een functie in setTimeout, vandaar dat ik het met id doe. De manier die jij aan geeft gaat dus niet lukken en daarom krijg jij het gevoel dat ik niet luister.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Kleine aanpassing dan:

obj = eval(_obj)

moet worden iets als:
code:
1
2
3
4
var obj = _obj;
if (IE) obj=document.all[obj]
if (DOM) obj=document.getElementById(obj)
if (NS4) obj=document.layers[obj]

Basics

  • Fles
  • Registratie: Augustus 2001
  • Laatst online: 06-04-2023
* Fles wordt heel verdrietig van netscape... :'(
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  function start(layerid)
  {
    if (IE) layer = document.all[layerid];
    if (DOM) layer = document.getElementById(layerid);
    if (NS) layer = document.layers[layerid];

    start_x = getLeft(layer);
    start_y = getTop(layer);

    position_layers();

    if (start_x != end_x && start_y != end_y)
    {
    current_x = start_x;
    current_y = start_y;

    speed_x = (end_x - current_x) / steps;
    speed_y = (end_y - current_y) / steps;

    current_step = 0;
    move(layerid);
    }
  }

Dit is de functie die ik als eerste aanroep.
Als ik direct "document.write('start functie');" neer zet, komt er netjes een blanke pagina met deze tekst.
Als ik het na de eeste drie regels doe, waar hij met het id een object maakt, doet hij he-le-maal NIX. Hij gaat gewoon niet verder door de funtie.

In Internet Explorer werkt hij prima en in Opera ook, maar Netscape blijft weigeren.
Pagina: 1