JSFiddle - React, Tailwind, and code Playground

by markdup

HTML

<body>
	<section id="leftbox">
		<ul>
			<li draggable="true" class="listitem"></li>
			<li draggable="true" class="listitem"></li>
			<li draggable="true" class="listitem"></li>
			<li draggable="true" class="listitem"></li>
		</ul>
	</section>
	<section id="rightbox">
		<div class="itemDropper"></div>
		<div class="itemDropper"></div>
	</section>
    <p style="float: left;">
        1. Zuerst wird mit mouse_is_inside definiert, dass die Maus nicht auf einem angeklickten li liegt.<br />
        2. Ein angeklicktes li erkennt man daran, dass es die Klasse 'active' bekommt.<br />
        3. Wird nun ĂĽber eines dieser li.active gehovert, so wird die Variable mouse_is_inside auf true gestellt.<br />
        4. Geht die Maus runter, wird sie auf false gestellt.<br />
        <br />
        5. Bei einem Klick irgendwo, wenn mouse_is_inside false ist, sollten alle li.active auf li.listitem gestellt werden.<br />
        -- Das funktioniert jedoch nicht, es werden immer welche ausgelassen.<br />
        <br />
        Alles andere funktioniert perfekt. Es geht nur darum, dass wenn daneben geklickt wird, die li entmarkiert werden sollen.
    </p>
</body>

CSS

html, body {
	height: 100%;
	width: 100%;
    font-family: calibri, tahoma, sans-serif;
}

section {
	float: left;
	width: 600px;
	height: 240px;
	border: 2px solid limegreen;
}

ul {
list-style: none;
}

ul li {
	width: 400px;
	height: 15px;
	background: grey;
	border-radius: 3px;
	box-shadow: 0 0 5px rgba(0,0,0,.2);
	margin-bottom: 5px;
}

div.itemDropper {
	height: 200px;
	width: 200px;
	border: 2px solid grey;
    display: inline-block;
}

.listitem:hover {
	background: #666;
}

.listitem.active {
	background: #444;
}

JavaScript

function hasClass(element, cls) {
	return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}
function insertActive(elem) {
	items = '';
	item = document.getElementsByClassName('listitem');
	for (i = 0; i < item.length; i++) {
		(function(index){
			if (hasClass(item[i], 'active')) {
				items += (items !== '') ? ', '+index : index;
			}
		})(i);
	}
	activeItems = document.getElementsByClassName('listitem active');
	if (activeItems.length == 0) {
		items = theone;
	}
	elem.innerHTML = items;
	//
	//
	// AJAX-Call an Tabelle um Daten reinzuspeichern
	//
	//
}
var theone = '';
// -------------------------------------------------- 1. --------------------------------------------------
var mouse_is_inside = false;

// -------------------------------------------------- 5. --------------------------------------------------
document.onclick = function() {
	if (!mouse_is_inside) {
		activeItems = document.getElementsByClassName('listitem active');
		for (a = 0; a < activeItems.length; a++) {
			activeItems[a].className = 'listitem'; // komisches Verhalten, es bleibt immer eines oder es bleiben zwei markiert
            // die Schleife wird aber richtig oft ausgefuehrt, Beweis:
            console.log(a);
            // das wird so oft ausgefuehrt wie es li.active-Elemente gibt (activeItems.length)
		}
	}
};
function doFirst() {
	var dragIcon = document.createElement('img');
	dragIcon.src = 'logo.png';
	dragIcon.width = 100;
	dropper = document.getElementsByClassName('itemDropper');
	for (i = 0; i < dropper.length; i++) {
		dropper[i].addEventListener('dragenter', function(e) { e.preventDefault(); }, false);
		dropper[i].addEventListener('dragover', function(e) { e.preventDefault(); }, false);
		dropper[i].addEventListener('drop', function() { insertActive(this); }, false);
	}
	item = document.getElementsByClassName('listitem');
	for (i = 0; i < item.length; i++) {
		item[i].addEventListener('dragstart', function(e) { e.dataTransfer.setDragImage(dragIcon, -10,...