Jump to content
php.lv forumi

Dinamiski lauki


Gacha

Recommended Posts

Scripts ir šeit

Ir divas kolonas ar laukiem, kur kreisās puses laukus var mainīt vietām klikšķinot uz tiem, bet labās puses lauki ir domāti liekie lauki.

 

Problēma rodas tad, kad kāds elements no kreisās puses tiek pārbīdīts uz labu un mēģina to samainīt vietām ar kādu citu lauku.

 

Es domāju, ka problēma ir saistīta ar globāliem mainīgajiem. Kad izpētat kodu, tad pievēršat uzmanību šai rindai

var old_data = new cloneObject(allfields);

iekš funkcijas ch_item().

Link to comment
Share on other sites

Piebilde - nelabs kods izmantojot globālus mainīgos, pamēģini paklikšķināt tajā kreisajā pusē, kamēr notiek tā flašošana (tb mirkšķināšanās).

Kods kautkā liekās lieki sarežģīts. Kautkā slinkums mēģināt iebraukt tajā :) Neņem ļaunā, bet es būtu darījis apmēram šādi (skat beigās linku), ja saprotu tavu domu. Tb tev iekš DB ir kautkādas konstantes, tie elementi, un ir kautkādi izvēlētie elementi, kurus tad jūzeris var pamainīt. Nu tad man tie izvēlētie elementi glabājas selected[] masīvā, bet visi pārējie iekš items[] (kurš sākumā ir aizpildīts pilnībā)

 

skat kodu: http://paste.php.lv/1984

Edited by bubu
Link to comment
Share on other sites

Liels paldies bubu, par palīdzību :) Es jau zinu, ka kods nav labs, jo sākumā nebiju domājis taisīt visu tik sarežģītu, tapēc no sākuma nepiedomāju pie tā, bet vēlāk negribējās pārtaisīt un javascriptu nezinu tik labi cik tu, lai zinātu visus knifus.

 

Papētīšu tavu scriptu tā kārtīgāk un uztaisīšu savu līdz galam.

Link to comment
Share on other sites

Es centos pielikt vēl vienu funkciju tam visam, tā ka iezīmē kādu lauku kreisajā pusē un nospiež pēc tam uz kādu no labās puses, tad objekts tiek dzēsts no kreisās puses, bet nezinu visu to javascript sintaksi un ar veselību ar šodien galīgi sūdīgi, tapēc neizdevās.

 

Un nevaru izprast, kapēc kreisās puses laukus kārtojot, no augšas uz apakšu viss ir ok, bet otrādi gan kaut kas nestrādā.

 

paldies jau iepriekš :)

Link to comment
Share on other sites

Ja nu tā fīča vajadzīga manā kodā, tad jāpamaina add_item() funkcija:

function add_item(event) {
   var itemsDIV = document.getElementById('itemsDIV');
   var selectedDIV = document.getElementById('selectedDIV');
   if (lastElem=="") { // jāpārnes uz kreiso pusi
       var target = (event.currentTarget?event.currentTarget:event.srcElement);

       // pārvieto masīvos
       var obj = getItem(target.id);
       selected.unshift(obj[0]);
   
       // pārvieto uz ekrāna
       target = itemsDIV.removeChild(target);
       target = selectedDIV.insertBefore(target, document.getElementById(selected[1]));

       removeEvent(target, 'mousedown', add_item);
       addEvent(target, 'mousedown', ch_item);
   } else { // jāpārnes uz labo pusi
       var target = document.getElementById(lastElem);
       target.style.backgroundColor = '#FFF';        
       
       // pārvieto masīvos
       var idx = selected.indexOf(target.id);
       items.unshift([selected[idx]]);
       for (var i=idx; i<selected.length-1; i++)
           selected[i] = selected[i+1];
   
       // pārvieto uz ekrāna
       target = selectedDIV.removeChild(target);
       target = itemsDIV.insertBefore(target, document.getElementById(items[1][0]));

       removeEvent(target, 'mousedown', ch_item);
       addEvent(target, 'mousedown', add_item);
       lastElem = ""
   }
}

 

Un kas domāts ar to kārtošanu no augšas uz apakšu? Tipa, pie pievienošanas no labās puses elementiem tos liek nevis kreisajā pusē augšā, bet apakšā? tad add_items() fjā šīs divas rindiņas:

       selected.unshift(obj[0]);
       target = selectedDIV.insertBefore(target, document.getElementById(selected[1]));

aizstāj ar:

       selected.unpop(obj[0]);
       target = selectedDIV.appendChild(target);

Link to comment
Share on other sites

Kārtējo reizi paldies bubu :) Es izmēģināju un tas strādā, un kad jutīšos, kā cilvēks arī izpētīšu, kā tas strādā.

 

un ar to kārtošanu ir domāts nevis tas ko saprati, bet tad kad tu kreisā pusē uzspied uz vienu elementu, un tad uz otru, tie maina kārtību. Šo darbību veicot: ja lastElem ir lielāks par target, tad viss ok, bet ja target ir lielāks, tad nestrādā korekti, cerams, ka šoreiz izteicos mazliet skaidrāk :rolleyes:

Link to comment
Share on other sites

Es laikam nesaprotu ideju tai pārbīdei.. Cik biju no tava koda sapratis, tad augšējais elements tiek ielikts apakšējā elementa vietā, bet visi elementi, kas bija pa vidu, tie tiek pārbīdīti par vienu uz augšu. Vai kautkā citādi vajadzēja?

 

Edited: pamēģini šādu ch_items() fju. Tā vajag?

function ch_item(event) {
   var target = (event.currentTarget?event.currentTarget:event.srcElement);
   
   if (lastElem == '') {                  // pirmā reize
       lastElem = target.id;
       target.style.backgroundColor = '#CCC';        
   } else if (lastElem == target.id) {    // otrā reize uz tā paša elementa
       lastElem = '';
       target.style.backgroundColor = '#FFF';        
   } else {                            // otrā reize uz cita elementa
       document.getElementById(lastElem).style.backgroundColor = '#FFF';        
       
       // atrod elementu indeksus
       var idx1 = selected.indexOf(lastElem);
       var idx2 = selected.indexOf(target.id);

       var selectedDIV = document.getElementById('selectedDIV');
       var child1 = document.getElementById(lastElem);  // ņems ārā
       var child2 = document.getElementById(target.id); // liks pirms šī elementa

       var tmp = null;                     // aiz kā ielikt izņemto elementu
       var first = selected[idx1];         // pārbīdīšanā pārrakstīsies pirmais elements

       if (idx1<idx2) {
           tmp = child2.nextSibling;       
           for (var i=idx1; i<idx2; i++)   // pārbīda masīvā
               selected[i] = selected[i+1];
       } else {
           tmp = child2;                   
           for (var i=idx1; i>idx2; i--)   // pārbīda masīvā
               selected[i] = selected[i-1];
       }
       selected[idx2] = first;             // atjauno pirmo elementu
       
       // pārbīda uz ekrāna
       child1 = selectedDIV.removeChild(child1);
       if (tmp)
           selectedDIV.insertBefore(child1, tmp);
       else
           selectedDIV.appendChild(child1);
       
       // sāk flešošanu
       lastElem = '';
       flash(0, selected[idx1], selected[idx2]);
   }
}

Edited by bubu
Link to comment
Share on other sites

Tnx, tagad viss ir ok un strādā pareizi, liels paldies :)

 

Es nekad nebiju strādājis ar html izveidi čerez javascript (visi tie node un childnode), tapēc man šis bija kas jauns un tapēc ar nezināju, kur un kas, bet labi ir tas, ka te ir izpalīdzīgi cilvēki.

Edited by Gacha
Link to comment
Share on other sites

×
×
  • Create New...