![]() ![]() |
Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 25.09.2009 Ostrzeżenie: (0%)
|
Witam.
Mam taki zasadniczy problem z drag and dropem. Tworze w tym momencie strone, na ktorej uzytkownik bedzie mial kilka "guzikow" i bedzie mogl je przesuwac w dowolne miejsce ekranu, potem te ustawienia bede zapisywal do bazy danych i je odczytywal. Zanim jednak dotre do tego etapu mam podstawowy problem. W celu zrobienia samego drag and dropa korzystam z dwoch skryptow : Pierwszy: Kod <script language="JavaScript" type="text/javascript"> <!-- // this is simply a shortcut for the eyes and fingers function $(id) { return document.getElementById(id); } var _startX = 0; // mouse starting positions var _startY = 0; var _offsetX = 0; // current element offset var _offsetY = 0; var _dragElement; // needs to be passed from OnMouseDown to OnMouseMove var _oldZIndex = 0; // we temporarily increase the z-index during drag var _debug = $('debug'); // makes life easier InitDragDrop(); function InitDragDrop() { document.onmousedown = OnMouseDown; document.onmouseup = OnMouseUp; } function OnMouseDown(e) { // IE is retarded and doesn't pass the event object if (e == null) e = window.event; // IE uses srcElement, others use target var target = e.target != null ? e.target : e.srcElement; var topelement = e.target ? 'HTML' : 'BODY'; _debug.innerHTML = target.className == 'drag' ? 'draggable element clicked' : 'NON-draggable element clicked'; // for IE, left click == 1 // for Firefox, left click == 0 if ((e.button == 1 && window.event != null || e.button == 0) && (target.className == 'drag' )) { // grab the mouse position _startX = e.clientX; _startY = e.clientY; // grab the clicked element's position _offsetX = ExtractNumber(target.style.left); _offsetY = ExtractNumber(target.style.top); // bring the clicked element to the front while it is being dragged _oldZIndex = target.style.zIndex; target.style.zIndex = 10000; // we need to access the element in OnMouseMove _dragElement = target; // tell our code to start moving the element with the mouse document.onmousemove = OnMouseMove; // cancel out any text selections document.body.focus(); // prevent text selection in IE document.onselectstart = function () { return false; }; // prevent IE from trying to drag an image target.ondragstart = function() { return false; }; // prevent text selection (except IE) return false; } } function ExtractNumber(value) { var n = parseInt(value); return n == null || isNaN(n) ? 0 : n; } function OnMouseMove(e) { if (e == null) var e = window.event; // this is the actual "drag code" _dragElement.style.left = (_offsetX + e.clientX - _startX) + 'px'; _dragElement.style.top = (_offsetY + e.clientY - _startY) + 'px'; _debug.innerHTML = '(' + _dragElement.style.left + ', ' + _dragElement.style.top + ')'; } function OnMouseUp(e) { if (_dragElement != null) { _dragElement.style.zIndex = _oldZIndex; // we're done with these events until the next OnMouseDown document.onmousemove = null; document.onselectstart = null; _dragElement.ondragstart = null; // this is how we know we're not dragging _dragElement = null; _debug.innerHTML = 'mouse up'; } } //--> </script> Drugi: Kod <script language="JavaScript1.2"> <!-- var ie=document.all; var nn6=document.getElementById&&!document.all; var isdrag=false; var x,y; var dobj; function movemouse(e) { if (isdrag) { dobj.style.left = nn6 ? tx + e.clientX - x : tx + event.clientX - x; dobj.style.top = nn6 ? ty + e.clientY - y : ty + event.clientY - y; return false; } } function selectmouse(e) { var fobj = nn6 ? e.target : event.srcElement; var topelement = nn6 ? "HTML" : "BODY"; while (fobj.tagName != topelement && fobj.className != "dragme") { fobj = nn6 ? fobj.parentNode : fobj.parentElement; } if (fobj.className=="dragme") { isdrag = true; dobj = fobj; tx = parseInt(dobj.style.left+0); ty = parseInt(dobj.style.top+0); x = nn6 ? e.clientX : event.clientX; y = nn6 ? e.clientY : event.clientY; document.onmousemove=movemouse; return false; } } //document.onmouseclick=readme; document.onmousedown=selectmouse; document.onmouseup=new Function("isdrag=false"); //--> </script> W obu wypadkach dodalem do CSSa styl : .dragme{position: relative} (albo drag w wypadku skryptu pierwszego). Problem tkwi w tym, że chciałbym aby za pomocą tego skryptu dało się przenosić też inne klasy niż "dragme". I tak jeżeli do skryptu numer 1 dodam: Kod if ((e.button == 1 && window.event != null || e.button == 0) && (target.className == 'drag' [b]|| target.className == 'mojaklasa')[/b]) to obiekt (np div) typu mojaklasa spokojnie daje sie dragndropowac. W wypadku skryptu numer dwa jezeli dodaje ten sam warunek w tym miejscu: Kod if (fobj.className=="dragme" [b]|| fobj.className=="mojaklasa"[/b]) i jeszcze uzupelnie warunek we wczesniejszym while'u: Kod while (fobj.tagName != topelement && fobj.className != "dragme" [b]|| fobj.className != "mojaklasa"[/b]) { fobj = nn6 ? fobj.parentNode : fobj.parentElement; } to skrypt przestaje dzialac zarowno na dragme jak i na mojaklasa. Dlaczego tak sie dzieje ? Poza tym skrypt numer jeden ma zasadnicza wade, ktora jest rozwiazana w skrypcie drugim ale nie mam pomyslu jak to przeniesc... jezeli w jakims divie klasy drag o wymiarach np. 50x100 umieszcze obrazek 50x100 to juz mi tego diva nie da sie dragndropowac. Z kolei w skrypcie nr 2 jestem w stanie to zrobic, ALE nie moge dla zadnej innej klasy niz dragme. Moze ktos pomoc (IMG:style_emoticons/default/questionmark.gif) |
|
|
|
![]() ![]() |
|
Aktualny czas: 25.12.2025 - 00:11 |