• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] JS divID per Drag u Drop in anderes Div und dann IDs auslesen

KeithKeith

New member
Hallo,
ich habe mal eine Frage :)
Wenn ich per Drag and Drop ein Bild aus deinem Div in einen anderen Div-Container ziehe und dort ablege, wie kann ich dann feststellen welches div in welchem Container liegt?

Sinn:
- Ich habe 5 Bilder und 10 Container
- Bsp.: Ich ziehe Bild 1 in Container 5 und lege es dort ab.
- Auslesen und per Mail absenden welches Bild in welchem Container liegt

geht das irgendwie?

Vielen Dank für Eure Hilfe und Hinweise

Gruß Keith
 
ich nehme an, dass das objekt beim verschieben im dom umgehängt wird. deshalb sollte die abfrage der nodes des containers auch zutage fördern, welche objekte in ihm stecken.
 
Hast du irgendetwas serverseitiges am Start? Wenn nicht, wird das Versenden von Mails etwas umständlich...
 
Ja, php ginge.
Ich müsste dann irgendwie fragen welche id in der jeweiligen divid "steckt".
is mir irgendwie noch etwas unklar wie ich da am besten vorgehen.
Gruß Keith
 
Weil ich mich nicht so besonders auskenne, mit JavaScript habe ich mir überlegt evtl immer nach dem ablegen eines Elements die id des abgelegten und des Containers in einer MySQL Tabelle zu speichern.
Bsp.: lege Bild 1 in Div 6 -> speicher in DB
HTML:
<!DOCTYPE HTML>
<html>
<head>
<style>
#divpflanzen {
    float: left;
    margin: 10px;
    padding: 10px;
    border: 1px solid black;
    width: 70px;
    height: 150px;
    overflow-x: scroll;
}
#divganzematrix {
    float: left;
    margin: 0px;
    padding: 0px;
    width: 210px;
    height: 60px;
}
#divreihe {
    float: left;
    margin: 0px;
    padding: 0px;
    width: 210px;
    height: 60px;
}
#div1 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div2 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div3 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div4 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div5 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div6 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div7 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div8 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div9 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div10 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div11 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div12 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div13 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div14 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div15 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
#div16 {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}

</style>
<script>
function allowDrop(ev) {
    ev.preventDefault();
}

function drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
}

function drop(ev) {
    ev.preventDefault();
    var data = ev.dataTransfer.getData("text");
    ev.target.appendChild(document.getElementById(data));
}
</script>

</head>
<body>

<h2>Drag and Drop</h2>

<div id="divpflanzen" ondrop="drop(event)" ondragover="allowDrop(event)">

<img src="gfx/1.png" draggable="true" ondragstart="drag(event)" id="drag1" width="50" height="50">
<img src="gfx/2.png" draggable="true" ondragstart="drag(event)" id="drag2" width="50" height="50">
<img src="gfx/3.png" draggable="true" ondragstart="drag(event)" id="drag3" width="50" height="50">
<img src="gfx/4.png" draggable="true" ondragstart="drag(event)" id="drag4" width="50" height="50">
<img src="gfx/5.png" draggable="true" ondragstart="drag(event)" id="drag5" width="50" height="50">
<img src="gfx/6.png" draggable="true" ondragstart="drag(event)" id="drag6" width="50" height="50">
</div>


<div id="divganzematrix">
<div id="divreihe">
<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div3" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div4" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
</div>
<div id="divreihe">
<div id="div5" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div6" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div7" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div8" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
</div>
<div id="divreihe">
<div id="div9" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div10" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div11" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div12" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
</div>
<div id="divreihe">
<div id="div13" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div14" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div15" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div id="div16" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
</div>
</div>

</body>
</html>
 
Jedes Einzelne Div zu beschreiben ist nicht nötig wenn alle das selbe style haben .
Bei css darf eine id nur einmal pro Dokument vorkommen daher wäre es besser die id divreihe in ein class zu ändern .
Dann genügt es über divganzematrix einzusteigen.
HTML:
<style>

#divganzematrix  .divreihe  div{  
    float: left;
    width: 50px;
    height: 50px;
    margin: 0px;
    padding: 0px;
    border: 1px solid black;
}
</style>

Das gilt dann für jedes Div in divreihe.
und wenn sich in einzelnen divs was ändert kannst du unterhalb also in Kaskade die speziellen Eigenschaften beschreiben.
soweit mal das css :)
 
OK - du holst dir also ein DIV, dessen Kinder du auslesen willst, und holst dir dann mittels .getElementsByTagName oder .getElementsByClassName() (Ich würden den ganzen <img> sowieso eine Klasse geben...) alle "gedroppten" Elemente. Durch die kannst du dann durchiterieren und hast damit die IDs.
 
@ Kieth ...soweit mal das css :).
ich hab hier ein Beispiel für drag n drop gemacht.
Dabei werden die Bilder nicht in die divs verschoben sondern kopiert und in einer Liste wird der Status
welches Bild wo liegt festgehalten.
Mit einem Doppelklick auf ein Bild wird es aus dem div und der Liste entfernt.
Die so entstandene Liste kannst du dann auswerten und per xhr an ein php mail-script versenden.
zur Zeit ist die Liste ein Array .Es kann aber leicht durch ein Object ersetzt werden.
 
Zuletzt bearbeitet von einem Moderator:
Leider ist die drag n drop API ist noch nicht touch tauglich.
Und einen schnellen Ersatz will ich nicht versprechen weil ich nicht weis ob
dazu Kollisionsabfragen nötig sind.
Mal guggen ;)
 
einen schnellen Ersatz will ich nicht versprechen weil ich nicht weis ob
dazu Kollisionsabfragen nötig sind.
ja mach dir keinen stress. war nur zur info, falls das jemand findet und gezielt touchfähigkeit braucht

wir haben dazu noch
http://forum.jswelt.de/tutorials-css-xhtml/62017-css-touchdevice.html

und vor kurzem war ein thread mit drag&drop mit touchfähigkeit aber ich finde ihn auf die schnelle nicht
@korbinian: du warst auch darin, findest du den noch?
 
Hallo Leute und frohe Weihnachten.
Ich hatte leider aus Gründen der WeihnachtsgeschenkevorbereitungfürmeineKinder keine Zeit zu schauen, ob es weitere Hilfe zu diesem Thema gibt und jetzt das!!
Ich bin echt von den Socken.
Wenn das mal kein Weihnachten ist :)
Vielen Dank Euch allen.
Ich muss das jetzt erst mal verarbeiten, verstehen und dann schau ich mal ob ich das auch für touchpads hinbekomme :)
Viele Grüße Keith

- - - Aktualisiert - - -

vielleicht könnte man das irgendwie anders lösen für touchscreens durch klicken?
klick auf bild und dann klick ins feld? man kann docj irgendwie das klickevent abfragen.
Gruß Keith
 
vielleicht könnte man das irgendwie anders lösen für touchscreens durch klicken?
klick auf bild und dann klick ins feld? man kann docj irgendwie das klickevent abfragen.
also ich habe mich leider bisher noch überhaupt nicht mit diesem ganzen touchzeugs beschäftigt. aber von der idee her müsste das dann so ähnlich gehn:
  1. nur für touch-geräte:
    Code:
    var isTouch = (('ontouchstart' in window) || (navigator.msMaxTouchPoints > 0));
    if(isTouch){
    - allerdings funktioniert das leider nicht zuverlässig:
  2. bei Klick auf Bild dieses in einem Puffer (entweder in einer Variable im übergeordneten scope oder z.b. im sessionStorage) speichern
    Code:
    //man müsste hier eigentlich durhciterieren und jedem element den Handler verpassen
    document.getElementById("irgendeinIMG").addEventListener("click", touchDrag);
  3. bei Klick in Feld schauen, ob im Puffer Element und dann einfügen
    Code:
    //hier auch durhciterieren und jedem element den Handler verpassen
    document.getElementById("irgendeinEinfuegFeld").addEventListener("click", touchDrop);
  4. mit den Funktionen dann so ähnlich:
    Code:
    var touchDrag = function(event){
      sessionStorage.setItem('draggedElement', event.target);
    };
    var touchDrop = function(event){
      let elemToDrop = sessionStorage.getItem('draggedElement');
      //elemToDrop einfügen
    };
 
@andreax:
Ich bin blutiger Anfänger, versuche mich aber mal durchzuschlagen :)
Wenn ich das richtig verstehem wird in der Funktion:
HTML:
function iterList()
{
var ct = document.getElementById('order');
ct.innerHTML = '';
for(var i in collector){if(collector[i] != '')ct.innerHTML += collector[i]+'<br>';}
}
beide Teile ausgegeben!
die Farbe und die ID im p-tag"order".
Ist das die richtige Stelle die "Werte" an ein phpsript zu übergeben?

so kann ich mir die werte mit alert ausgeben lassen:
HTML:
for(var i in collector){if(collector[i] != '')ct.innerHTML += collector[i]+'<br>';alert(collector[i]);}
d.h. die werte liegen in dem "i collector"-array, richtig?

Gruß-Keith
 
Zuletzt bearbeitet:
Ich bin blutiger Anfänger,...

Uhh das klingt aber gruselig :)

Um das Script besser zu verstehen habe ich es auf das wesentliche gekürzt und mit Kommentaren versehen
Und einige Änderungen :wie das zwischenspeichern von Werten in globalen vars sind weg, und die liste ist auch weg wird nun wie von kkapsner vorgeschlagen am ende über die dropzone Collection itteriert
HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" >
<style>
h3{width:100%;}
#divpflanzen {
    float: left;
    margin:0  10px 0 0;
    padding: 10px;
    border: 1px solid black;
    width: 50px;
    height: 310px;
  
}
#divpflanzen img
{
	float:left;
	width:50px;
	height:50px;
	margin-top:2px;
}
#divganzematrix {
    float: left;
    margin: 0px;
    padding: 0px;
    width: 210px;
    height: 60px;
}
.divreihe {
    float: left;
    margin: 0px;
    padding: 0px;
    width: 240px;
    height: 60px;
}
.divreihe div {
    float: left;
    width: 50px;
    height: 50px;
    margin: 0 0 0 5px;
    padding: 0px;
    border: 1px solid black;
	
}

</style>
</head>


<body>

<h2>Drag and Drop</h2>

<div id="divpflanzen" >
 <!-- anstelle des data-attributes nun wieder eine eindeutige id
	um auf das bild besser zugreifen zu können -->
<img src="http://forum.jswelt.de/images/1.jpg" draggable="true" id="blau" title="Ein blaues Bild" >
<img src="http://forum.jswelt.de/images/2.jpg" draggable="true" id="gelb" title="Ein gelbesBild">
<img src="http://forum.jswelt.de/images/3.jpg" draggable="true" id="dunkellila" title="Ein dunkel lilanes Bild">
<img src="http://forum.jswelt.de/images/4.jpg" draggable="true" id="gruen" title="Ein grünes Bild">
<img src="http://forum.jswelt.de/images/5.jpg" draggable="true" id="blasslila" title="Ein blass blaues Bild">
<img src="http://forum.jswelt.de/images/6.jpg" draggable="true" id="weiß" title="Ein weisses Bild">
</div>


<div id="divganzematrix" >
<div class="divreihe">
<!-- data-info soll den Bildnamen oder den Bildpfad speichern 
 so  gehts ohne Array und Globale Variablen und der Bilderliste-->
<div data-id="00"  ></div>  										
<div data-id="01" ></div>
<div data-id="02" ></div>
<div data-id="03" ></div>
</div>
<div class="divreihe">
<div data-id="04" ></div>
<div data-id="05" ></div>
<div data-id="06" ></div>
<div data-id="07" ></div>
</div>
<div class="divreihe">
<div data-id="08" ></div>
<div data-id="09" ></div>
<div data-id="10" ></div>
<div data-id="11" ></div>
</div>
<div class="divreihe">
<div data-id="12" ></div>
<div data-id="13" ></div>
<div data-id="14" ></div>
<div data-id="15" ></div>
</div>
</div>
<br style="clear:both"><br>
<button id="sndBtn" >Senden</button>
<script>

document.getElementById('sndBtn').addEventListener('click',sendHome,false);
//Referenze auf alle Divs in den divreihen in dropzones sammeln
var dropzones = document.querySelectorAll('#divganzematrix .divreihe div'); 
//Referenzen auf alle Images in divpflanzen in drgimg sammeln.
var drgimg = document.querySelectorAll('#divpflanzen img');
//bei Doppelclick Divs wieder leeren
for(var i = 0; i <dropzones.length; i++)
{	
dropzones[i].addEventListener('dblclick',verwerfen,false);
dropzones[i].setAttribute('data-info','-');
} 

//Eventlistener für alle divs in der dropzones collection setzen
//Diese Funktion wird aufgerufen wenn ein Image gezogen wird (siehe dragstart Listenerfunktion)
function setListeners(){ 
for(var i = 0; i <dropzones.length; i++)
{
	dropzones[i].addEventListener('drop',dropImage,false);
	dropzones[i].addEventListener('dragover',dragOver,false);
	dropzones[i].addEventListener('dragleave',dragLeave,false);
	
}}
function removeListeners(){ //wird ausgeführt nachdem das image im div angezeigt wird (siehe drop Listenerfunktion )
for(var i = 0; i <dropzones.length; i++)
{
	dropzones[i].removeEventListener('drop',dropImage,false);
	dropzones[i].removeEventListener('dragover',dragOver,false);
	dropzones[i].removeEventListener('dragleave',dragLeave,false);
}}

//Eventlistener für alle Images in der drgimg Collection setzen
for(var i = 0;i<drgimg.length;i++)
{
	drgimg[i].addEventListener('dragstart',drag,false);
}

//// Listener Funktionen/////////////
function dragOver(ev) {
    ev.preventDefault();
	ev.target.style.border = '1px dashed red';
}
function dragLeave(ev) { //anzeigen das die maus über ein dropable Element gezogen wird
    ev.preventDefault();
	ev.target.style.border = '1px solid #000';
}
function verwerfen(ev)//image info und dada-attributes wieder aus dem div entfernen
{
	this.style.background = 'none';
	this.setAttribute('data-info', '-');
}
function drag(ev) { //ein Image wurde zum ziehen aus gewählt und in data die ID speichern
	setListeners();
    ev.dataTransfer.setData("text", ev.target.id);
}


function dropImage(ev) {  //Image als Hintergrundbild im div anzeigen daten im data-info speichern 
							

    ev.preventDefault();
	var imInfo = document.getElementById(ev.dataTransfer.getData("text")); //eine Referenz auf das gezogene Image erstellen
	ev.target.style.background = 'url('+imInfo.src+') top left no-repeat'; // Image resource übergeben
    ev.target.style.backgroundSize = 'cover';  //Background-image an die Größe des div anpassen
	ev.target.setAttribute('data-info', imInfo.id); // kann aber auch der der Title oder ein anderes data-attribut gespeichert werden.
	ev.target.style.border = '1px solid #000'; // Hervorhebung wieder zurücknehmen
	removeListeners();//alle listener löschen um ein versehendliches draggen der divs zu verhindern
	
}
/////////////////////////Daten aus den divreihen auslesen um z B. an ein serverscript zu versenden

function getDivRowInfo()
{
var dataString = '?';
	for (var i = 0;i<dropzones.length;i++)
	{
		if(dropzones[i].dataset.info == '-')continue;
		console.log(dropzones[i].dataset.id);
		 dataString+= 'bildinfo='+dropzones[i].dataset.info+'-divid-'+dropzones[i].dataset.id+'"&';
	}
	return dataString;
}
function sendHome(){alert(getDivRowInfo());}

</script>
</body>
</html>
 
Zuletzt bearbeitet von einem Moderator:
Hi, die Pfade habe ich angepsst :)
Das ist wirklicfh der Hammer!
Darf ich dich noch wegen einiger Details fragen :) ?

Ich versuche jetzt mit:

HTML:
function sendHome(){alert(getDivRowInfo()); setRequest(getDivRowInfo());}
den String an ein phpScript zu übergeben.
Bis zum ersten "&" gelingt es mir auch, allerdings wird dann der String abgeschnitten!?!
HAste einen Tipp für mich warum das so ist? Höngt das evtl mit der Zeichenkodierung zusammen?

Hier noch das restlche Script:
HTML:
<script type="text/javascript">
  <!--
        var request = false;

        // Request senden
        function setRequest(value) {
                // Request erzeugen
                if (window.XMLHttpRequest) {
                        request = new XMLHttpRequest(); // Mozilla, Safari, Opera
                } else if (window.ActiveXObject) {
                        try {
                                request = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
                        } catch (e) {
                                try {
                                        request = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
                                } catch (e) {}
                        }
                }

                // überprüfen, ob Request erzeugt wurde
                if (!request) {
                        alert("Kann keine XMLHTTP-Instanz erzeugen");
                        return false;
                } else {
                        var url = "empfangen.php";
                        // Request öffnen
                        request.open('post', url, true);
                        // Requestheader senden
                        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                        // Request senden
                        request.send('name='+value);
                        // Request auswerten
                        request.onreadystatechange = interpretRequest;
                }
        }

        // Request auswerten
        function interpretRequest() {
                switch (request.readyState) {
                        // wenn der readyState 4 und der request.status 200 ist, dann ist alles korrekt gelaufen
                        case 4:
                                if (request.status != 200) {
                                        alert("Der Request wurde abgeschlossen, ist aber nicht OK\nFehler:"+request.status);
                                } else {
                                        var content = request.responseText;
                                        // den Inhalt des Requests in das <div> schreiben
                                        document.getElementById('content').innerHTML = content;
                                }
                                break;
                        default:
                                break;
                }
        }
  //-->
  </script>
und das zum empfangen:
HTML:
                                                         <?php
header('Content-Type: text/html; charset=utf-8'); // sorgt für die korrekte Kodierung
header('Cache-Control: must-revalidate, pre-check=0, no-store, no-cache, max-age=0, post-check=0'); // ist mal wieder wichtig wegen IE

$name = strtoupper($_POST['name']);
echo $name;
?>


Gruß Keith
 
Zuletzt bearbeitet:
Zurück
Oben