[JS] Events & Drag (Was: functie veranderen in javascript)

Pagina: 1
Acties:

  • DutchTux
  • Registratie: April 2003
  • Laatst online: 01-04-2025

DutchTux

Plaatjeloos

Topicstarter
Ik zit een Window System aan het maken met Dhtml en Javascript.
Nou heb ik een script gemaakt dat je Dynamisch een Window kan laten maken.
Maar nu het volgende probleem is dat ik niet via Javascript een functie kan instellen voor onmousedown en onmouseup.
Ik heb geprobeert met object.onmousedown en object.onmouseup en met object.setattribute maar dat werkt ook niet
als ik het zonder " doet dan worden ze aangezet maar dat wil ik niet.

hier heb ik alle Javascripting, het probleem is alles dat met // voor zit. Dat werkt niet

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
var dragapproved=false
var ie5=document.all&&document.getElementById
var ns6=document.getElementById&&!document.all
var DragWindow

function iecompattest(){
return (document.compatMode!="BackCompat")? document.documentElement : document.body
}

function stopdrag(WindowID){
dragapproved=false;
document.getElementById(WindowID).onmousemove=null;
document.getElementById(WindowID).style.filter = "Alpha(Opacity=100)"
// document.getElementById("dwindowcontent").style.display="" //extra
}

function drag_drop(e){
if (ie5&&dragapproved&&event.button==1){
document.getElementById(DragWindow).style.left=tempx+event.clientX-offsetx+"px"
document.getElementById(DragWindow).style.top=tempy+event.clientY-offsety+"px"
}
else if (ns6&&dragapproved){
document.getElementById(DragWindow).style.left=tempx+e.clientX-offsetx+"px"
document.getElementById(DragWindow).style.top=tempy+e.clientY-offsety+"px"
}
}

function initializedrag(e,WindowID){
offsetx=ie5? event.clientX : e.clientX
offsety=ie5? event.clientY : e.clientY
// document.getElementById("dwindowcontent").style.display="none" //extra
tempx=parseInt(document.getElementById(WindowID).style.left)
tempy=parseInt(document.getElementById(WindowID).style.top)

dragapproved=true
DragWindow=WindowID
document.getElementById(WindowID).style.filter = "Alpha(Opacity=80)"
document.getElementById(WindowID).onmousemove=drag_drop
}

function OpenWindow(WindowID){
    document.getElementById(WindowID).style.display=""
}

function CloseWindow(WindowID){
    document.getElementById(WindowID).style.display="none"
}

function MakeWindow(WindowID, Title, ContentID) {
    this.newWindow = document.createElement("div");
    this.newWindow.setAttribute("id", WindowID);
    this.newWindow.setAttribute("onSelectStart","return false");
    this.newWindow.className = "WindowArea";
    this.newWindow.onSelectStart = "return false";
    this.newWindow.style.width = "320px";
    this.newWindow.style.height = "200px";
        
    this.newWindowTitle = document.createElement("div");
    this.newWindowTitle.className = "WindowTitle";
        
//  this.newWindowTitle.setAttribute("onMouseup", stopdrag(WindowID), false);   
//  this.newWindowTitle.onMouseDown = "initializedrag(event ," + WindowID + ")";
//  this.newWindowTitle.onMouseUp = "stopdrag(" + WindowID + ")";
//  this.newWindowTitle.onMouseDown = initializedrag(event , WindowID);
//  this.newWindowTitle.onMouseUp = stopdrag(WindowID);

    this.newWindowTitle.innerHTML = "[img]'gfx/close.gif'[/img] " + Title;
    this.newWindowTitle.onSelectStart = "return false"; 
    this.newWindow.appendChild(this.newWindowTitle);
    
    this.newWindowWorkspace = document.createElement("div");
    this.newWindowWorkspace.className = "WindowWorkspace";  
    this.newWindowWorkspace.innerHTML = ContentID;
    this.newWindow.appendChild(this.newWindowWorkspace);
    
    document.body.appendChild(this.newWindow);
}


En zo maak je een venster aan

code:
1
MakeWindow('TestWin','Testing Dynamic Window', 'Content not found!')


Kan me iemand me alsjeblieft met dit helpen zodat ik dynamisch gemaakte venster kan laten verschuiven in de pagina. _/-\o_

A random guy with a Computer.


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 22-06 13:51

Clay

cookie erbij?

de onmouse events moet je in lowercase definieren, en het zijn events, dus je moet er eenfunctie referentie aanhangen die bij dat event uitgevoerd moeten worden, ala:


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
window.onload = function() {
    var div = document.body.appendChild(document.createElement('div'));
    div.className = 'fiets';

    div.onmouseover = function(e) {
        this.style.backgroundColor = '#fffff0';
    }

    div.onmouseout = function(e) {
        this.style.backgroundColor = '#f0f0f0';
    }
}

ff zelf wat definieren voor .fiets

Je hangt er nu afwisselend Strings, en de uitkomst van functies aan, en die zijn niet uitvoerbaar voor het event (tenzij de functie een functie returnt dan), je doet dus nu in feite dit:

JavaScript:
1
2
test = "hoi()";
test();


Events errorren hier blijkbaar niet op, maar als je dit zo uitvoert errort het wel degelijk.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • DutchTux
  • Registratie: April 2003
  • Laatst online: 01-04-2025

DutchTux

Plaatjeloos

Topicstarter
Bedankt Clay, maar nu weet ik niet hoe ik "event" niet doorheen, zeg dat event niet gedefineerd is.
Hoe krijg ik dit voor elkaar?

Ik heb nu dit:
code:
1
2
3
4
5
6
7
    this.newWindowTitle.onmousedown = function(e) {
        initializedrag(event, WindowID);
    }

    this.newWindowTitle.onmouseup = function(e) {
        stopdrag(WindowID);
    }


voor de rest is niks verandert.

[edit] effe spell checked.

[ Voor 8% gewijzigd door DutchTux op 28-09-2003 12:17 ]

A random guy with a Computer.


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 22-06 13:51

Clay

cookie erbij?

event is in IE een globale variabele, die hoef je niet handmatig door te geven. Die e is voor moz (wat je zelf ook al gebruikt), die kan/moet je wel doorgeven.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • DutchTux
  • Registratie: April 2003
  • Laatst online: 01-04-2025

DutchTux

Plaatjeloos

Topicstarter
A jah, Op een of andere manier geef aan dat een argument niet gedefineerd is en mozilla zegt hij dat het geen error is.
Ik kan de Venster die ik gemaakt niet bewegen over de pagina.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
var dragapproved=false
var ie5=document.all&&document.getElementById
var ns6=document.getElementById&&!document.all
var DragWindow

function iecompattest(){
return (document.compatMode!="BackCompat")? document.documentElement : document.body
}

function stopdrag(WindowID){
dragapproved=false;
document.getElementById(WindowID).onmousemove=null;
document.getElementById(WindowID).style.filter = "Alpha(Opacity=100)"
// document.getElementById("dwindowcontent").style.display="" //extra
}

function drag_drop(e){
if (ie5&&dragapproved&&event.button==1){
document.getElementById(DragWindow).style.left=tempx+event.clientX-offsetx+"px" # - geeft error
document.getElementById(DragWindow).style.top=tempy+event.clientY-offsety+"px"
}
else if (ns6&&dragapproved){
document.getElementById(DragWindow).style.left=tempx+e.clientX-offsetx+"px"
document.getElementById(DragWindow).style.top=tempy+e.clientY-offsety+"px"
}
}

function initializedrag(e,WindowID){
offsetx=ie5? event.clientX : e.clientX
offsety=ie5? event.clientY : e.clientY
// document.getElementById("dwindowcontent").style.display="none" //extra
tempx=parseInt(document.getElementById(WindowID).style.left)
tempy=parseInt(document.getElementById(WindowID).style.top)
dragapproved=true
DragWindow=WindowID
document.getElementById(WindowID).style.filter = "Alpha(Opacity=80)"
document.getElementById(WindowID).onmousemove=drag_drop
}

function OpenWindow(WindowID){
    document.getElementById(WindowID).style.display=""
}

function CloseWindow(WindowID){
    document.getElementById(WindowID).style.display="none"
}

function MakeWindow(WindowID, Title, ContentID) {
    this.newWindow = document.createElement("div");
    this.newWindow.setAttribute("id", WindowID);
    this.newWindow.setAttribute("onSelectStart","return false");
    this.newWindow.className = "WindowArea";
    this.newWindow.style.width = "640px";
    this.newWindow.style.height = "480px";
    this.newWindow.OnSelectStart = function() { return false };
        
    this.newWindowTitle = document.createElement("div");
    this.newWindowTitle.className = "WindowTitle";
        
    this.newWindowTitle.onmousedown = function(e) {
        initializedrag(event, WindowID);
    }

    this.newWindowTitle.onmouseup = function() {
        stopdrag(WindowID);
    }

    this.newWindowTitle.innerHTML = "[img]'gfx/close.gif'[/img] " + Title;

    this.newWindow.appendChild(this.newWindowTitle);
    
    this.newWindowWorkspace = document.createElement("div");
    this.newWindowWorkspace.className = "WindowWorkspace";  
    this.newWindowWorkspace.innerHTML = ContentID;
    this.newWindow.appendChild(this.newWindowWorkspace);
    
    document.body.appendChild(this.newWindow);

}


Ik heb achter de regel een # gezet zodat je weet waar de error komt.

[ Voor 16% gewijzigd door DutchTux op 28-09-2003 13:23 ]

A random guy with a Computer.


  • McVirusS
  • Registratie: Januari 2000
  • Laatst online: 21-08 10:46
Probeer anders eens op die error regel de waarde die je wilt setten te echo-en (alert of window.status is handig daarvoor :P), krijg je dan wel juiste waarde terug? En wellicht is het een idee om om de berekening ( ) te zetten aangezien je nu numerieke en alfanumeriek waardes bij elkaar aan het optellen en aftrekken bent (gaat meestal wel goed maar netjes is anders).

[ Voor 14% gewijzigd door McVirusS op 28-09-2003 14:10 ]


  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 22-06 13:51

Clay

cookie erbij?

het zit denk ik in de parseint voor tempx en y. de style.left en style.top kan je in IE niet uitlezen als ze uit de css komen, dat geeft niets terug. met currentStyle.left en top kan het wel, maar daar doet moz niet aan. En je paast nog steeds de event mee in de mousedown op de title, met initalizedrag(e || event, WindowID); werkt dat ook al beter.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Een paar opmerkingen (positief bedoelt hoor ;) )
-Ik ben niet zo te spreken over de manier van coderen, inspringen en regels netjes met ; afsluiten maakt het al een stuk leesbaarder :)
-De manier van browsersniffing die gebruikt wordt is eigenlijk een beetje achterhaald, als je geen IE4 en NS4 ondersteuning in wilt/moet bouwen zou ik het gewoon volgens de DOM standaard doen, en in sommige gevallen gewoon kijken of bepaalde methoden / properties bestaan en daar je code op aanpassen.
-Waarom de lookups met getElementById als je binnen een eventhandler gewoon met het keyword this naar het element kan verwijzen?

klein voorbeeldje ter illustratie:

JavaScript:
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
function createElement() {

  var newDiv = document.createElement('div');
  newDiv.className = 'myClass';
  if (typeof document.addEventListener != 'undefined') {  // DOM level 2
    newDiv.addEventListener('mousedown', mouseHandler, true);
  } else if (typeof document.attachEvent != 'undefined') {  // IE 5 event model
    newDiv.attachEvent('onmousedown', mouseHandler);
  } else { // IE4 event model
    newDiv.onmousedown = mouseHandler;
  }

  if (typeof document.documentElement != 'undefined') {
    document.documentElement.appendChild(newDiv);
  } else {
    document.body.appendChild)newDiv);
  }

}

function mouseHandler(e) {

  if (typeof e == 'undefined' && typeof window.event != 'undefined') {
    e = window.event;
  }

  var x = e.clientX;
  var y = e.clientY;
  this.style.backgroundColor = 'red';

}


dit is wel heel uitgebreid en defensief geprogrammeerd, rekening houdend met de guidelines voor strict javascript compliance, maar het illustreerd wel dat je eigenlijk geen browsersniffing nodig hebt.
Verder zou ik het gebruik van innerHTML ook willen afraden als het enkel gaat om het toevoegen van een image of wat text aan een element, maak dan gewoon een textNode of een nieuw child-element aan binnen dat element mbv de DOM methods :)

Intentionally left blank


  • DutchTux
  • Registratie: April 2003
  • Laatst online: 01-04-2025

DutchTux

Plaatjeloos

Topicstarter
Ik denk dat je gelijk in dat heb.
Ik heb het script eigenlijk ook van een site vandaan en aangepast zodat het meer venster te gelijk kan gebruiken.

Ik zal het helemaal opnieuw proberen te schrijven maar dit als Reference gebruiken.
Messchien lost dit wel heel wat problemen op

A random guy with a Computer.


  • DutchTux
  • Registratie: April 2003
  • Laatst online: 01-04-2025

DutchTux

Plaatjeloos

Topicstarter
Heb nu alles helemaal hergeprogrameert en het werkt nu...Alleen een IE (Beetje hokkend maar het werkt)

In mozilla geeft hij een error: E has no properties aan in de functie BeginWindowMove.
Zover ik het kan zien is niks mis mee.

Weet iemand een oplossing voor?

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
var NWinX=32;
var NWinY=32;
var approved=false;
var offsetX=0;
var offsetY=0;
var tempX=0;
var tempY=0;
var DragWindow;

function WindowDrag(e) {
    if (typeof e == 'undefined' && typeof window.event != 'undefined') {
        e = window.event;
    }
    if (approved) {
        var Window = document.getElementById(DragWindow);
        Window.style.left=tempX+e.clientX-offsetX+"px"
        Window.style.top=tempY+e.clientY-offsetY+"px"
    }
}

function BeginWindowMove(WindowID, e) {
    if (typeof e == 'undefined' && typeof window.event != 'undefined') {
        e = window.event;
    }
    offsetX = e.clientX
    offsetY = e.clientY
    var Window = document.getElementById(WindowID);
    tempX=parseInt(document.getElementById(WindowID).style.left)
    tempY=parseInt(document.getElementById(WindowID).style.top)
    approved=true;
    Window.style.filter = "Alpha(Opacity=50)";
    DragWindow = WindowID;
    Window.onmouseover = WindowDrag;
}

function StopWindowMove(WindowID) {
    var Window = document.getElementById(WindowID);
    approved=false;
    Window.style.filter = "Alpha(Opacity=100)"; 
    Window.onmouseover = null;
}

function MakeWindow(WindowID, Title,ContentID) {
    var NewWindow = document.createElement("div");
    NewWindow.setAttribute("id", WindowID);
    NewWindow.className = "WindowArea";
    NewWindow.style.width = "320px";
    NewWindow.style.height = "200px";
    NewWindow.style.top = NWinY;
    NewWindow.style.left = NWinX;
    NewWindow.onSelectStart = function() { return false };  
    
    var NewWindowTitle = document.createElement('div');
    NewWindowTitle.className = "WindowTitle";   
    NewWindowTitle.innerHTML = Title
    NewWindowTitle.OnSelectStart = function() { return false };

    NewWindowTitle.onmousedown = function(e) {
        BeginWindowMove(WindowID);
    }
    NewWindowTitle.onmouseup = function() {
        StopWindowMove(WindowID);
    }

    NewWindow.appendChild(NewWindowTitle);
    NewWindow.setAttribute("onSelectStart","return false");
    NewWindow.OnSelectStart = function() { return false };
    
    var NewWindowContent = document.createElement('div');
    NewWindowContent.className = "WindowWorkSpace"; 
    NewWindowContent.innerHTML = ContentID
    
    NewWindow.appendChild(NewWindowContent);
                
    document.body.appendChild(NewWindow);
    
    NWinY = NWinY + 18;
    NWinX = NWinX + 18;
}

A random guy with a Computer.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

je moet het event ook wel doorgeven:

JavaScript:
1
2
3
4
5
6
NewWindowTitle.onmousedown = function(e) {
    BeginWindowMove(WindowID,e);
}
NewWindowTitle.onmouseup = function() {
    StopWindowMove(WindowID,e);
}


Verder is het niet slim om een variabele Window te noemen omdat het erg lijkt op het bestaande window.
Verder zou ik aanraden om consequent je regels met een ; af te sluiten en ook consequent " of ' te gebruiken, en ben je je ervan bewust dat style-filters IE-only zijn?
Ook als je bijvoorbeeld de top of left style-property zet, geef dan ook de maataanduiding aan (px) :)

[ Voor 50% gewijzigd door crisp op 29-09-2003 09:22 ]

Intentionally left blank


  • DutchTux
  • Registratie: April 2003
  • Laatst online: 01-04-2025

DutchTux

Plaatjeloos

Topicstarter
jah dat heb ik door...Verander wel later als alles een beetje goed wilt werken

A random guy with a Computer.

Pagina: 1