Door
Sietsko Bos
op 23-05-2020 20:22
gewijzigd op 23-05-2020 21:04
3.410 views
Ik heb een script op het internet gevonden die ik graag wil gebruiken.
Het gaat om het verbinden van divs.
Wat ik begrijp uit het javascript is dat de verbonden divs opgeslagen worden in de _lines
Kan iemand me vertellen hoe ik dat na een submit terug kan krijgen in een array in php?
<form id="form1" name="form1" method="post">
<div id="parentNodes_11">
<div class="nodes">
<div class="group1">
<div class="node">auto<span class="node1" data-connect="false" data-id="0" data-use="false"></span></div>
<div class="node">fiets <span class="node2" data-connect="false" data-id="1" data-use="false"></span></div>
<div class="node">water <span class="node3" data-connect="false" data-id="2" data-use="false"></span></div>
<div class="node">zwem <span class="node4" data-connect="false" data-id="3" data-use="false"></span></div>
</div>
<div class="group2">
<div class="node">broek <span class="node5" data-connect="false" data-id="0" data-use="false"></span></div>
<div class="node">band <span class="node6" data-connect="false" data-id="1" data-use="false"></span></div>
<div class="node">wiel <span class="node7" data-connect="false" data-id="2" data-use="false"></span></div>
<div class="node">kraan <span class="node8" data-connect="false" data-id="3" data-use="false"></span></div>
</div>
<div class="clearfix"></div>
</div>
</div>
<input name="submit" type="submit" id="submit" formmethod="POST" value="Verzenden">
</form>
<script type="text/javascript">
(function($) {
$.fn.connect = function(param) {
var _canvas;
var _ctx;
var _lines = new Array(); //This array will store all lines (option)
var _me = this;
var _parent = param || document;
var _lengthLines = $(_parent + ' .group1 .node').length;
var _selectFirst = null;
//Initialize Canvas object
_canvas = $('<canvas/>')
.attr('width', $(_me).width())
.attr('height', $(_me).height())
.css('position', 'absolute');
$(_parent).prepend(_canvas);
//$(_canvas).insertBefore(_parent);
this.drawLine = function(option) {
//It will push line to array.
_lines.push(option);
this.connect(option);
};
....... het javascript gaat hier verder
<script type="text/javascript">
$(document).ready(function() {
$('#parentNodes_11 .nodes').connect('#parentNodes_11');
});
</script>
Omdat TS aangeeft dat ie weinig ervaring heeft met Javascript lijkt mij het handigst om een verborgen veld
op te nemen met id en name '_lines', en dit voor het verzenden te voorzien van de inhoud van _lines (in JSON notatie):
$("#submit"). on("click", function(e){
e.preventDefault(); // blokkeren verzenden form
if (_lines.length !== 4) {
alert('Niet alle verbindingen zijn gemaakt');
return false;
}
$('#_lines').val(JSON.stringify(_lines));
$('#form1').submit();
});
_lines is alleen bekend binnen $.fn.connect, daarbuiten bestaat deze variabele niet.
Elke browser heeft tegenwoordig geintegreerde "Developer Tools". Deze zijn te vinden onder de F12-functietoets. Een van de tabs heet "Console". Hier kun je via JavaScript info in dumpen via console.log(). Dit is een heel handig middel om inzicht te krijgen in de toestand van gebruikte variabelen. Zo kun je met console.log(_lines); de inhoud van _lines inspecteren.
Waarschijnlijk krijg je op dit moment in je submit-routine een foutmelding dat _lines niet is gedefinieerd omdat je _lines probeert te gebruiken buiten het gebied waarbinnen deze geldig is (de zogenaamde scope).
Hmm beetje jammer, dacht dat ik een compleet werkend script had gevonden.
Is het mogelijk om het script (al of niet betaald) werkend te maken, of zou er een nieuw script gemaakt moeten worden?
Ik kwam nog een probleempje tegen want de divs staan nu linksboven in de hoek.
Als ik die bijvoorbeeld in het midden van het scherm zet kloppen de lijnen die verbinden ook niet meer.
Hmm beetje jammer, dacht dat ik een compleet werkend script had gevonden.
Is het mogelijk om het script (al of niet betaald) werkend te maken, of zou er een nieuw script gemaakt moeten worden?
Dit lijkt mij (simpelweg) een kwestie van het op de goede plek zetten van de code. Maar voordat je wat dan ook verstuurt naar PHP kan de console dus informatie verschaffen of je _lines te pakken hebt. Zo kun je dit stap voor stap bouwen.
Sietsko Bos op 25/05/2020 08:20:01
Ik kwam nog een probleempje tegen want de divs staan nu linksboven in de hoek.
Als ik die bijvoorbeeld in het midden van het scherm zet kloppen de lijnen die verbinden ook niet meer.
Dit is een probleem in de opmaak-hoek, dit kun je het beste in afzondering oplossen.
Mja het probleem is dus een beetje dat alle informatie weliswaar in _lines zit, maar deze variabele bestaat alleen binnen de connect() functie.
Vandaar dus mijn eerdere voorstel om de informatie wat permanenter op te slaan in de nodes zelf (die vervolgens overal beschikbaar en opvraagbaar is). Je zou bijvoorbeeld een attribuut data-connected-to kunnen toevoegen aan de eerste group. Deze houdt dan een referentie bij van de node waarmee deze verbonden is. Of je zou dit zelfs aan beide zijden kunnen doen zodat je een soort dubbel gelinkte lijst hebt.
Op het moment dat je de toestand submit lees je alle nodes van de eerste group uit waar het attribuut data-connect op true staat (verbonden is met een andere node).
Voeg dus bijvoorbeeld aan alle nodes van group1 het attribuut toe:
Op een soortgelijke wijze zou je de nodes uit group1 ook kunnen bijhouden in group2 als je aan group2 ook die "data-connected-to" attributen toevoegt. Maar je hebt in principe maar een van de twee nodig.
De bovenstaande code kun je al testen of alles goed verloopt met behulp van de Inspector-tool in de Developer Tools tab.
Vervolgens heb je dus een routine nodig die de nodes uit group1 afloopt en data-connected-to van de huidige node uitleest op het moment dat data-connected gelijk is aan "true".
-- volgt wellicht later, of probeer het zelf uit als oefening --
$("#submit"). on("click", function(e){
_nodes = $('.group1 .node span');
entries = new Array();
_nodes.each(function(idx, el){
target = $(el).attr('data-connect_to');
if (typeof target !== 'undefined') {
entries.push({'source' : $(el).data('id'), 'target' : target});
}
});
if (entries.length != _nodes.length) {
alert('Niet alle verbindingen zijn gemaakt');
return false;
}
$('#_lines').val(JSON.stringify(entries));
return true;
});
});
Sietsko Bos op 25/05/2020 08:20:01
Ik kwam nog een probleempje tegen want de divs staan nu linksboven in de hoek.
Als ik die bijvoorbeeld in het midden van het scherm zet kloppen de lijnen die verbinden ook niet meer.
Het canvas element dat wordt aangemaakt wordt geplaatst in de div #parentNodes_11, deze moet je dus positioneren.
Echter, omdat je floated elementen hebt moet je de code waar de verbindingen getekend worden ook wat aanpassen:
_top_node = _left_node.parent().parent().parent().parent();
_adj_x = _top_node.offset().left;
_adj_y = _top_node.offset().top;
//Get Left point and Right Point
_left.x = _left_node.offset().left + _left_node.outerWidth()-_adj_x;
_left.y = _left_node.offset().top + (_left_node.outerHeight() / 2) - _adj_y;
_right.x = _right_node.offset().left-_adj_x;
_right.y = _right_node.offset().top + (_right_node.outerHeight() / 2) - _adj_y;