1 (edited by Ramex 2008-06-16 01:05:43)

Topic: nesuka for ciklo

na situacija tokia:
aš dinamiškai, pasinaudodamas ajax, "perkraunu" select'o lauikelius. kad įkraut naują info, man reik ištrinti seną. tam pasirašiau tokia funkciją:

function change_list (what) {
    var x=document.getElementById(what);
    x.disabled = false;
    var y = x.options.length;
    for (i=1;i<y;i++) {
        x.remove(i);
    }
}

ji man kuo puikiausiai veikė, kai šalinamų duomenų buvo mažai. nežinau nuo kiek tiksliai nebeveikia, bet esant 39 įrašam, tai priklausomai nuo narįšyklės, palieka kažkokį skaičių įrašų nepašalintų. aš ta problemą išsprendžiau į funkciją įtraukęs rekursiją:

function change_list (what) {
    var x=document.getElementById(what);
    x.disabled = false;
    var y = x.options.length;
    for (i=1;i<y;i++) {
        x.remove(i);
    }
    if (x.options.length > 1)
        change_list(what);
}

bet vistiek labai norėtūsi sužinot, kodėl ji springsta padaugėjus įrašų...

Su sąlyga, kad šūdo nebus...

Re: nesuka for ciklo

O kartais elementai tame objekte ne nuo nulio pradedami numeruoti? (-;

Ar ką nors debuginai?

Ar naudoji FireBug?

3 (edited by Ramex 2008-06-16 10:59:36)

Re: nesuka for ciklo

na nuo nulio, bet man nulinis elementas reikalingas :) su IE debuginau, jokių klaidų nėra. na pabandysiu tą  firebug.

Su sąlyga, kad šūdo nebus...

Re: nesuka for ciklo

firebug prie manosios funkcijos rašo tokį dalyką:

prototype - undefined

ką tai reiškia?

Su sąlyga, kad šūdo nebus...

Re: nesuka for ciklo

Ramex wrote:

bet man nulinis elementas reikalingas :)

Tai patikslink ką tu nori tuo ciklu pasiekti. Nes nelabai suprantu ar tu nori ištrinti visus select tipo lauko duomenis ir palikti tik nulinį, ar dar ką kito.

Ramex wrote:

ką tai reiškia?

Reiškia, kad objektas/kintamasis neaprašytas/neegzistuoja.

Re: nesuka for ciklo

na aš noriu ištrinti visus, išskyrus pirmąjį elementą. bet ne tame esmė, lygiai taip pat veikia, jei ir visus trinu. tiesiog viskas veikia, bet taip, lyg reiktų verst tą funkciją veikt. nes tarkim ta bėda išssiprendžia jei aš ją dukart iškviečiu. atrodo, kad po kažkiek įrašų ji nebeveikia, jei jos pakartotinai neiškvieti. gerai, o kaip sužinot, kas konkrečiai neegzistuoja, nes funkcija tai aprašyta. kinamieji taip pat paimami iš išorės iškviečiant tą funkciją. o duomenys nėra dinaminiai (konkrečiai šiai funkcijai).

Su sąlyga, kad šūdo nebus...

Re: nesuka for ciklo

Dėl ciklo tai realiai neturi būti tokio dalyko, kad funkcija nei iš šio nei iš to sustoja. Kada pas tave ta funkcija "change_list" yra kviečiama?

Dėl "prototype" klaidos" tai reikėtų pamatyti kodą, kur kintamasis/objektas/funkcija yra naudojami, kad kažką plačiau būtų galima pakomentuoti.

8 (edited by Ramex 2008-06-16 11:55:56)

Re: nesuka for ciklo

ir aš manau, kad taip netūrėtų būti. na viskas va taip:

var xmlhttp;
function changeList (type, value) {
    xmlhttp = null;
    try {
        xmlhttp = new XMLHttpRequest();
    } catch (e) {
        var progIds = ['MSXML2.XMLHTTP', 'Microsoft.XMLHTTP', 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0'];
        for (var iterator = 0; (iterator < progIds.length); iterator ++) {
            try {
                xmlhttp = new ActiveXObject(progIds[iterator]);
            } catch (e) {}
        }
    }
    
    if (xmlhttp!=null) {
        xmlhttp.onreadystatechange = function () {
            load_do(type);
        }
        url = 'http://localhost:8080/auto/classes/loader.php?id='+type+'&value='+value;
        xmlhttp.open("GET",url,true);
        xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlhttp.send(null);
    }
}


function change_list (what) {
    var x=document.getElementById(what);
    x.disabled = false;
    var y = x.options.length;
    for (i=1;i<y;i++) {
        x.remove(i);
    }
    if (x.options.length > 1)
        change_list(what);
}

function load_do (what) {
    change_list (what);
    change(what);
}

function change (what) {
// if "loaded"
    if (xmlhttp.readyState==4) {
  // if "OK"
        if (xmlhttp.status==200) {
    //operacijos su gautais duomenimis
    }
}
}

na nežinau, gal kai kas čia ir nelogiškai, bet kaip pirmas mano ajax scenarijus, tai neblogai ir svarbu veikia...
o iškviečiama yra funkcija changeList, su select'o event'u onchange

Su sąlyga, kad šūdo nebus...

Re: nesuka for ciklo

šiaip nelabai matau pas tave jokių elementų, kur figūruotų žodis "prototype", tai galiu tik spėti, kad arba tu ne viską čia parodei, arba klaida gali būti metama toje vietoje, kur kuriamas onreadystatechange metodas (nes jis yra prototype tipo, prototipinis). Tai gal vertėtų pažiūrėt ar tiktai gavus ready state yra kviečiama load_do() funkcija. Kitą vertus, kam iš vis kuriame funkciją, kurios nereikia, galima tiesiai į onreadystatechange irašyti change_list() ir change() funkcijų kvietimą.

O dėl select'o elementų trinimo, tai klausimas dar būtų kiek yra tas "didelis" kiekis, kurį maždaug pasiekus viskas "sustoja".

Ir kada pas tave yra kviečiama change funkcija?

10 (edited by Ramex 2008-06-16 14:15:50)

Re: nesuka for ciklo

na aš parodžiau viską. ir šiaip tame ir yra esmė, kad tokio kontrukcinio žodžio, kaip prototype aš net nenaudoju.
kaip jau sakiau, gal ir nelogiški funkcijų sąryšiai, bet viskas tik dėl to, kad veiktų. load_do() naudpoju tam, kad galėčiau funkcijai change_list() perduoti parametrą, nes kiek žinau įmanomas toks variantas:

 xmlhttp.onreadystatechange = change_list;

bet

 xmlhttp.onreadystatechange = change_list(type);

neveikia.
na tai juk "onreadystatechange" ir nurodo konkretų event'ą, kitaip funkcija net nebūtų kviečiama.
change() funkciją kviečia load_do() iškart po change_list();
na pas manes tame select'e būna 39 įrašai. ir po funkcijos vykdymo operoj lieka 4 įrašai, FF - 2, o IE - 1, neskaitant to pirmojo, kuris man reikalingas. pakartotinai įvykdžius veiksmą ir likusieji įrašai pasišalina

Su sąlyga, kad šūdo nebus...

Re: nesuka for ciklo

Pagal viską reikėtų daryti taip:

xmlhttp.onreadystatechange = function (what) {
    change_list (what);
    change(what);
}

čia aišku vėl kyla klausimai dėl what parametro. Kur ir kada jis būna matomas ir ar tuo metų yra pasiekiama jo reikšmė.Gali tekti tą what laikyti kaip globalų kintamąjį arba kaip objekto atributą.

12 (edited by Ramex 2008-06-16 14:25:11)

Re: nesuka for ciklo

na aš dabar bandau šį variantą, bet vat ir neina perduot šio parametro. tas what turi būti gaunamas iš aukštesnio lygio funkcijos changeList():

var xmlhttp;
function changeList (type, value) {
    xmlhttp = null;

    ...
    
    if (xmlhttp!=null) {
        xmlhttp.onreadystatechange = function (type) {
            change_list(type);
            change(type);
        }

bet gaunu klaidą, kad type yra NULL

Su sąlyga, kad šūdo nebus...

Re: nesuka for ciklo

Tai padaryk, kad ta reikšmė būtų globali visom funkcijom (-;

Re: nesuka for ciklo

minde wrote:

Tai padaryk, kad ta reikšmė būtų globali visom funkcijom (-;

ir kaip tai padaryti? dar neteko JS su tokiais dalykais susidurt =]

Su sąlyga, kad šūdo nebus...

Re: nesuka for ciklo

Reikėtų pasitikslinti dokumentacijoje, pradžiai pabandyk viršuje pamodifikuoti:

var xmlhttp, type;

16 (edited by Ramex 2008-06-16 14:53:45)

Re: nesuka for ciklo

na šis variantas irgi neveikia.
o tai nėra kokios funkcijos ar kokio modifikatoriaus kaip glob?
na tarkim veikia taip:

if (xmlhttp!=null) {
        xmlhttp.onreadystatechange = function () {
            change_list(type);
            change(type);
        }

bet vėl ne viskas pašalinama
ar dar bandžiau ir change_list(); funkciją iškelt auksčiau, kad būtų nepriklausoma nuo to onreadystatechange event'o, bet tas pats, tiksliau tada dar blogiau - dar daugiau įrašų lieka nepašalinti.

Su sąlyga, kad šūdo nebus...

Re: nesuka for ciklo

Aš kol kas siūlau susitvarkyti pradžiai su klaidom, kur kažkas neaprašyta.

Dėl nepilno listo pašalinimo tai turiu įtarimą, kad pas tave vyksta toks dalykas, kai objekto būsena keičiasi daugiau nei vieną kartą, todėl gaunasi kad dar nepasibaigus operacijom po pirmo iškvietimo jau vėl kalama ta pati funkcija. Gal būti, kad vyksta klaidos, kurias ir reikia apdoroti, kad suprastum, kur kas blogai vykdoma ir kodėl neištrina visų elementų.

Re: nesuka for ciklo

tas ir yra, kad klaidų kaip ir nėra  =] tik tas firebug prie visu mano funkcijų rašo "prototype - undefined". na as dar pasibandysiu, nes čia tikrai kažkokie marazmai...

Su sąlyga, kad šūdo nebus...

19 (edited by neworld 2008-06-17 13:53:53)

Re: nesuka for ciklo

O kodėl tu nedarai paprastesnio salinimo:

function change_list (what) {
    var x=document.getElementById(what);
    x.disabled = false;
    while (x.options.lenght>1) {
        x.remove(1);
    }
}

taip granatuotai pašalins visus įrašus, nes įtariu jog pas tave gaunasi taip:

tarkime yra 5 įraša, taigi for vykdomas 4 karts.

entry1
entry2
entry3
entry4
entry5

Pirma sykį ištirnamas įrašas kurio id yra 1, kadangi kiek žinau irasai visada numeruojami is eiles, taigi jie yra perindeksuojami ir taip gaunam visu id nuo 0 iki 4, o ne 0,2,3,4,5. Gaunam:

entry1
entry3
entry4
entry5

gerai dabar trinam irasa kurio id 2

entry1
entry3
entry5

jau trys įrašai, bet for ciklas tesiamas, trinam irasa kurio id yra 3

trecio iraso nebere, gaunama klaida ir viskas skriptas yra stabdomas.

Tik nesuprantu kodel pas tave prasideda nesamones kai buna daug irasu, o su mazai viskas tvarkoje. Manoji funkcija kuo puikiausiai susitvarko su 1100 irasu :)

20 (edited by Ramex 2008-06-17 14:25:13)

Re: nesuka for ciklo

matai, kad nebūtų paliavos su index'ais, tam aš ir įdėjau šią eilutę:

 var y = x.options.length;

nors kai gerai pagalvoju, kaži ar ji padeda. bet galėčiau tiesiog pradet nuo paskutinio įrašo, bet ir tada neaišku, kaip reaguos...
na pabandysiu tavąjį variantą

Su sąlyga, kad šūdo nebus...