zxcvbnm
zxcvbnm

Reputation: 65

JQuery cannot properly access draggable elements dropped on another element (which is draggable)

I have problems accessing draggable elements which can be dropped on another element, which is a draggable element. What I want the code to do is to execute different instructions depending on the dropped element. For example, if I drop an element with the id "element1" on the target (which is the droppable element) certain instructions will be executed; if I drop an element with the id "element2" on the target (which is the droppable element) another set of instructions will be executed. For the example described in the last phrase, from what I know, to access element1's one parents, one may use $(ui.draggable).parents("#element1") ,to access element2's parents, one may use $(ui.draggable).parents("#element2"). By using the length property I should get the number of parents. Used in the drop event of the droppable element, these two sequences $(ui.draggable).parents("#element1").length, $(ui.draggable).parents("#element2").length it shoul be detected which element was dropped so that the proper instructions will be executed. In my application the droppable element is #up_spin_1s and the droppables are #electron_1 and #electron_1. So what I want is to execute different instructions depending on the dropped element. Only the instructions from the *if($(ui.draggable).parents("#electron_1").length){* block are executed, no matter what element is dropped.

Bellow is the discussed code:

$("#up_spin_1s").droppable({
    accept: "#electron_1, #electron_2",
    drop: function(event,ui) {
    if($(ui.draggable).parents("#electron_1").length){
    $("#exp_1s").html("1");
    $(this).append('<div id="electron_I"></div>');
    contoar++;
            if (contoar == limitare && n == 1) {

            alert("Primul electron al unui orbital este setat sa fie acela cu spinul up!"+"\n"+"Configuratie incheiata cu success!");
            $(this).droppable("disable");
    }

    }
    if($(ui.draggable).parents("#electron_2").length){
    $("#exp_1s").html("1");
    $(this).append('<div id="electron_II"></div>');
    contoar++;
            if (contoar == limitare && n == 1) {

            alert("Primul electron al unui orbital este setat sa fie acela cu spinul up!"+"\n"+"Configuratie incheiata cu success!");
            $(this).droppable("disable");
    }

    }

}
});

Bellow is the entire html code:

<html>

Repartiţia electronilor pe orbitali, straturi şi substraturi pentru primele 36 de elemente

function activateApp() {
    var infoSelected = document.getElementById("option_selected_text");
    var element= new Array();

    element[0]="";
    element[1] = "Hidrogen";
    element[2] = "Heliu";
    element[3] = "Litiu";
    element[4] = "Beriliu";
    element[5] = "Bor";
    element[6] = "Carbon";
    element[7] = "Azot";
    element[8] = "Oxigen";
    element[9] = "Fluor";
    element[10] = "Neon";
    element[11] = "Sodiu";
    element[12] = "Magneziu";
    element[13] = "Aluminiu";
    element[14] = "Siliciu";
    element[15] = "Fosfor";
    element[16] = "Sulf";
    element[17] = "Clor";
    element[18] = "Argon";
    element[19] = "Potasiu";
    element[20] = "Calciu";
    element[21] = "Scandiu";
    element[22] = "Titan";
    element[23] = "Vanadiu";
    element[24] = "Crom";
    element[25] = "Mangan";
    element[26] = "Fier";
    element[27] = "Cobalt";
    element[28] = "Nichel";
    element[29] = "Cupru";
    element[30] = "Zinc";
    element[31] = "Galiu";
    element[32] = "Germaniu";       
    element[33] = "Arsen";
    element[34] = "Seleniu";
    element[35] = "Brom";
    element[36] = "Kripton";


    var simbol = new Array();

    simbol[0] = "";
    simbol[1] = "H";
    simbol[2] = "He ";
    simbol[3] = "Li";
    simbol[4] = "Be";
    simbol[5] = "B";
    simbol[6] = "C";
    simbol[7] = "N";
    simbol[8] = "O";
    simbol[9] = "F";
    simbol[10] = "Ne";
    simbol[11] = "Na";
    simbol[12] = "Mg";
    simbol[13] = "Al";
    simbol[14] = "Si";
    simbol[15] = "P";
    simbol[16] = "S";
    simbol[17] = "Cl";
    simbol[18] = "Ar";
    simbol[19] = "K";
    simbol[20] = "Ca";
    simbol[21] = "Sc";
    simbol[22] = "Ti";
    simbol[23] = "V";
    simbol[24] = "Cr";
    simbol[25] = "Mn";
    simbol[26] = "Fe";
    simbol[27] = "Co";
    simbol[28] = "Ni";
    simbol[29] = "cu";
    simbol[30] = "Zn";
    simbol[31] = "Ga";
    simbol[32] = "Ge";      
    simbol[33] = "As";
    simbol[34] = "se";
    simbol[35] = "Br";
    simbol[36] = "Kr";

    var exponent = new Array();

    exponent[0] = document.getElementById("exp_1s");
    exponent[1] = document.getElementById("exp_2s");
    exponent[2] = document.getElementById("exp_2p");
    exponent[3] = document.getElementById("exp_3s");
    exponent[4] = document.getElementById("exp_3p");
    exponent[5] = document.getElementById("exp_4s");
    exponent[6] = document.getElementById("exp_3d");
    exponent[7] = document.getElementById("exp_4p");


    var electron = new Array();

    electron[0] = "#up_spin_1s";
    electron[1] = "#down_spin_1s";
    electron[2] = "#up_spin_2s";
    electron[3] = "#down_spin_2s";
    electron[4] = "#up_spin_2p_1";
    electron[5] = "#up_spin_2p_2";
    electron[6] = "#up_spin_2p_3";
    electron[7] = "#down_spin_2p_1";
    electron[8] = "#down_spin_2p_2";
    electron[9] = "#down_spin_2p_3";
    electron[10] = "#up_spin_3s";
    electron[11] = "#down_spin_3s";
    electron[12] = "#up_spin_3p_1";
    electron[13] = "#up_spin_3p_2";
    electron[14] = "#up_spin_3p_3";
    electron[15] = "#down_spin_3p_1";
    electron[16] = "#down_spin_3p_2";
    electron[17] = "#down_spin_3p_3";
    electron[18] = "#up_spin_4s";
    electron[19] = "#down_spin_4s";
    electron[20] = "#up_spin_3d_1";
    electron[21] = "#up_spin_3d_2";
    electron[22] = "#up_spin_3d_3";
    electron[23] = "#up_spin_3d_4";
    electron[24] = "#up_spin_3d_5";
    electron[25] = "#down_spin_3d_1";
    electron[26] = "#down_spin_3d_2";
    electron[27] = "#down_spin_3d_3";
    electron[28] = "#down_spin_3d_4";
    electron[29] = "#down_spin_3d_5";
    electron[30] = "#up_spin_4p_1";
    electron[31] = "#up_spin_4p_2";
    electron[32] = "#up_spin_4p_3";
    electron[33] = "#down_spin_4p_1";
    electron[34] = "#down_spin_4p_2";
    electron[35] = "#down_spin_4p_3";

    var tip_spin = new Array();

    tip_spin["up"] = "#electron_1";
    tip_spin["down"] = "#electron_2";


    var cont = false;

    var choosed = val.value;
    var n = parseInt(choosed);
    var tip_up = new RegExp("up");
    var tip_down = new RegExp("down");

    //tip_up.exec(electron[35]) va returna down;;;  

    var a = "#up_spin_1s";
    var b = "#down_spin_1s";
    var c = "#up_spin_2s";

    var d = "#electron_1";
    var e = "#electron_2";
    var f = "#electron_1";

    var contor = 0;
    var limita = 1;

    var contoar = 0;
    var limitare = 1;

$(infoSelected).html("Element: "+"<i>"+element[n]+"</i>"+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+"Simbol: "+"<i>"+simbol[n]+"</i>");


$( "#electron_1" ).draggable({
    revert: true    
});
$( "#electron_2" ).draggable({
    revert: true    
});


$("#up_spin_1s").droppable({
    accept: "#electron_1, #electron_2",
    drop: function(event,ui) {
    if(!$(ui.draggable).parents("#electron_2").length){
    $("#exp_1s").html("1");
    $(this).append('<div id="electron_I"></div>');
    contoar++;
            if (contoar == limitare && n == 1) {

            alert("Primul electron al unui orbital este setat sa fie acela cu spinul up!"+"\n"+"Configuratie incheiata cu success!");
            $(this).droppable("disable");
    }

    }
             if($(ui.draggable).parents("#electron_2").length){
    $("#exp_1s").html("1");
    $(this).append('<div id="electron_I"></div>');
    contor++;
            if (contor == limita && n == 1) {

            alert("Primul electron al unui orbital este setat sa fie acela cu spinul up!"+"\n"+"Configuratie incheiata cu success!");
            $(this).droppable("disable");
    }

    }

}
});


if(n>1){
for(i = 1 ; i <=35 ; i++)
{


$("#up_spin_1s").droppable({
    accept: "#electron_1, #electron_2",
    drop: function(event,ui) {
    if($(ui.draggable).parents("#electron_1").length){
    $("#exp_1s").html("1");
    $(this).append('<div id="electron_II"></div>');
    contoar++;
            if (contoar == limitare && n == 1) {

            alert("Primul electron al unui orbital este setat sa fie acela cu spinul up!"+"\n"+"Configuratie incheiata cu success!");
            $(this).droppable("disable");
    }

    }

    compute(electron[1],tip_spin["down"],electron[2],tip_spin["up"]);
}
});

}

}
else
{

for(i = 1 ; i <=35 ; i++){
$(electron[i]).droppable("disable");
}

}




}


function compute(z,w,r,s) {

var counter = 0;
var limit = 1;      
    var cur=0;
    var lim=1;
    $(z).droppable({
    accept: w,
    drop: function(event,ui) {
    $("#exp_1s").html("2");
            $(z).append('<div id="electron_II"></div>');
    cur++;
            if (cur == lim) {
            $(this).droppable("disable");
    }
    var curu = 0;
    var limi = 1;
    $(r).droppable({
    accept: s,
    drop: function(event,ui) {
    $("#exp_2s").html("1");
            $(r).append('<div id="electron_I"></div>');
    curu++;
            if (curu == limi) {
            $(this).droppable("disable");
    }
    }
    });

    }
    });






}







</script>

<div id="main">

  <a href="repartitie.html">Cum se repartizeaz&#259; electronii pe orbitali, straturi &#351;i substraturi </a>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  <a href="lectie.html"> Structura &#238;nveli&#351;ului electronic </a>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  <a href="#" onclick="#"> Help(?) </a> 

</div>


<div id="config_container">
 <div id="axis">
    <img src="images/axis.png">
 </div>



 <div id="orbital_container">
<div id="orbital_content">
<div class="orbital_label"> 4p<sup id="exp_4p"><div style="display: inline; color: #ffffff;">0</div></sup> </div>

<div class="electron_pear">
<div id="up_spin_4p_1" class="up_spin_4p_1"></div>
<div id="down_spin_4p_1" class="down_spin_4p_1"></div>
</div>

<div class="electron_pear">
<div id="up_spin_4p_2" class="up_spin_4p_2"></div>
<div id="down_spin_4p_2" class="down_spin_4p_2"></div>
</div>

<div class="electron_pear">
<div id="up_spin_4p_3" class="up_spin_4p_3"></div>
<div id="down_spin_4p_3" class="down_spin_4p_3"></div>
</div>

</div>

<div id="orbital_content">
<div class="orbital_label"> 3d<sup id="exp_3d"><div style="display: inline; color: #ffffff;">0</div></sup> </div>

<div class="electron_pear">
<div id="up_spin_3d_1" class="up_spin_3d_1"></div>
<div id="down_spin_3d_1" class="down_spin_3d_1"></div>
</div>

<div class="electron_pear">
<div id="up_spin_3d_2" class="up_spin_3d_2"></div>
<div id="down_spin_3d_2" class="down_spin_3d_2"></div>
</div>

<div class="electron_pear">
<div id="up_spin_3d_3" class="up_spin_3d_3"></div>
<div id="down_spin_3d_3" class="down_spin_3d_3"></div>
</div>

<div class="electron_pear">
<div id="up_spin_3d_4" class="up_spin_3d_4"></div>
<div id="down_spin_3d_4" class="down_spin_3d_4"></div>
</div>

<div class="electron_pear">
<div id="up_spin_3d_5" class="up_spin_3d_5"></div>
<div id="down_spin_3d_5" class="down_spin_3d_5"></div>
</div>

</div>

<div id="orbital_content">
<div class="orbital_label"> 4s<sup id="exp_4s"><div style="display: inline; color: #ffffff;">0</div></sup> </div>

<div class="electron_pear">
<div id="up_spin_4s" class="up_spin_4s"></div>
<div id="down_spin_4s" class="down_spin_4s"></div>
</div>

</div>


<div id="orbital_content">
<div class="orbital_label"> 3p<sup id="exp_3p"><div style="display: inline; color: #ffffff;">0</div></sup> </div>

<div class="electron_pear">
<div id="up_spin_3p_1" class="up_spin_3p_1"></div>
<div id="down_spin_3p_1" class="down_spin_3p_1"></div>
</div>

<div class="electron_pear">
<div id="up_spin_3p_2" class="up_spin_3p_2"></div>
<div id="down_spin_3p_2" class="down_spin_3p_2"></div>
</div>

<div class="electron_pear">
<div id="up_spin_3p_3" class="up_spin_3p_3"></div>
<div id="down_spin_3p_3" class="down_spin_3p_3"></div>
</div>

</div>


<div id="orbital_content">
<div class="orbital_label"> 3s<sup id="exp_3s"><div style="display: inline; color: #ffffff;">0</div></sup> </div>

<div class="electron_pear">
<div id="up_spin_3s" class="up_spin_3s"></div>
<div id="down_spin_3s" class="down_spin_3s"></div>
</div>

</div>

<div id="orbital_content">
<div class="orbital_label"> 2p<sup id="exp_2p"><div style="display: inline; color: #ffffff;">0</div></sup> </div>

<div class="electron_pear">
<div id="up_spin_2p_1" class="up_spin_2p_1"></div>
<div id="down_spin_2p_1" class="down_spin_2p_1"></div>
</div>

<div class="electron_pear">
<div id="up_spin_2p_2" class="up_spin_2p_2"></div>
<div id="down_spin_2p_2" class="down_spin_2p_2"></div>
</div>

<div class="electron_pear">
<div id="up_spin_2p_3" class="up_spin_2p_3"></div>
<div id="down_spin_2p_3" class="down_spin_2p_3"></div>
</div>

</div>

<div id="orbital_content">
<div class="orbital_label"> 2s<sup id="exp_2s"><div style="display: inline; color: #ffffff;">0</div></sup> </div>

<div class="electron_pear">
<div id="up_spin_2s" class="up_spin_2s"></div>
<div id="down_spin_2s" class="down_spin_2s"></div>
</div>

</div>

<div id="orbital_content">
<div class="orbital_label"> 1s<sup id="exp_1s"><div style="display: inline; color: #ffffff;">0</div></sup> </div>

<div class="electron_pear">
<div id="up_spin_1s" class="up_spin_1s"></div>
<div id="down_spin_1s" class="down_spin_1s"></div>
</div>

</div>

 </div>
 </div>

 <div id="control_container">
 <div id="settings_container">
 <div id="settings_content">
 <div class="z_text"> Z = </div>  
 <select id="val" name="val">
<option value="1" selected="selected">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
<option value="32">32</option>
<option value="33">33</option>
<option value="34">34</option>
<option value="35">35</option>
<option value="36">36</option>
 </select>
 <div id="electron_1"></div>
 <div id="electron_2"></div>
 <a href="javascript: void(0)" ><input type="button" name="Submit" value="Start" class="confirmed" onclick="activateApp();"/></a>
 <a href="javascript: void(0)" ><input type="button" name="Submit" value="Resetare" class="erase" onclick="#"/> </a> 


 </div>

 <div id="settings_content" style="margin-top: 15px;">
<div id="option_selected_text"></div>

 </div>

Any help would be very usefull!

Upvotes: 0

Views: 396

Answers (1)

DarthJDG
DarthJDG

Reputation: 16591

I'm not sure I understand it correctly, but here are some thoughts.

$(ui.draggable).parents("#element1"); in a drop event means "give me all parents of the currently dragged object with the id element1". Note that ui.draggable is already a jQuery object, there is no need to call the $ function.

You can use ui.draggable.parents("#element1").length to check if #element1 is among the parents of the currently dragged object (returning 1 or 0). Note that parents() does NOT return the currently dragged object, only it's ancestors starting with its direct parent.

Looking at your code, you're actually dragging #electron_1 and #electron_2. To check which one was dropped in your drop event, use if(ui.draggable.attr('id') == 'electron_1'){ /* Do stuff */ }.

I don't think that your if($(ui.draggable).parents("#electron_1").length){... ever worked, the reason you might think so is because I have found this line:

if(!$(ui.draggable).parents("#electron_2").length){

The above is always true, because the returned jQuery object will always have a length of 0.

Also I'm not sure if it's intentional, but setting revert:true on a draggable will cause it to always revert back to its original position, which might be confusing for users. You can use revert:"invalid" to only revert if it wasn't dropped on an accepting droppable. If you want to return your object to the starting position, it's better to do it manually on a successful drop, without using the default revert animation.

Upvotes: 2

Related Questions