Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: link + problem z childNodes
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
dziadoo
Witam,
Mam mały problem. Otóż tworzę takiego sobie diva:
Kod
var lp_div_kosz = document.createElement('div');
    var tx = document.createTextNode(l_p)
    Page_updater.appendChild(lp_div_kosz, tx);
    
    var nazwa_a_kosz = document.createElement('a');
    var tx2 = document.createTextNode(nazwa_kosz);
    Page_updater.appendChild(nazwa_a_kosz, tx2);
    
    var cena_div_kosz = document.createElement('div');
    var tx3 = document.createTextNode(cena_kosz);
    Page_updater.appendChild(cena_div_kosz, tx3);
    
    var usun_prod_ico = Page_updater.createElement('form', {action:''});
    var form_div1 = document.createElement('div');
    var usun_but = Page_updater.createNoEndTagElement('input', {type:'button', Class:'remove_ico', value:'', onclick:'javascript:Koszyk.usun(this.parentNode);'});
    Page_updater.appendChild(form_div1, usun_but);
    Page_updater.appendChild(usun_prod_ico, form_div1);
    
    var change_quant = Page_updater.createElement('form', {action:'', id:'ch_f_prod'+id_kosz});
    var form_div2 = document.createElement('div');
    var change_inp = Page_updater.createNoEndTagElement('input', {type:'text', Class:'change_quant', value:ilosc_kosz, onblur:'javascript:Koszyk.zmien_ilosc(this.parentNode, this.value);'});
    Page_updater.appendChild(form_div2, change_inp);
    Page_updater.appendChild(change_quant, form_div2);

funkcje Page_updater to troszkę zmodyfikowane wersje funkcji wbudowanych takie jak createElement czy appendChild. Ale nie w tym problem.
Tak stworzonego diva dodaję sobie do stronki(xhtml 1.1 lub jeśli IE to 1.0)
Następnie jeśli potrzeba to usuwam tego diva a dokładnie jego wnętrzności. I tu powstaje problem. Gdyż stworzona przeze mnie wersja removeChildren która własnie ma usuwać wnętrzności diva zostawiając jego "głowę" wariuje.
Kod
Page_updater.removeChild = function()
{
    if(this.removeChild.arguments.length = 1)
    {
        var argum = document.getElementById(this.removeChild.arguments[0]);
        for(var i = 0; i < argum.childNodes.length; i++)
        {
            if(argum.childNodes.item(i))
            {
                argum.removeChild(argum.childNodes.item(i));
            }
        }
        return argum;
    }
    else
    {
        return null;
}

Wariacja polega na tym że metoda childNodes widzi wszystkie tagi poprawnie poza tagiem <a> który jak sprawdziłęm alertem zamiast <a>cośtamcośtamcośtam</a> wyświetla cośtamcośtamcośtam.
W ten sposób nie mam dostępu do tego elementu i nie jest usuwany.
Div wygląda tak
  1. <div id='prod1'>
  2. <div>1</div>
  3. <a>costamcostam</a>
  4. <div>120.00</div>
  5. <form>
  6. <div>
  7. <input ..... />
  8. </div>
  9. </form>
  10. </div>

Czy ma ktoś jakieś pojęcie o co chodzi i czemu tak się dzieje. Bede dźwięczny za pomoc. Pozdrawiam.
nevt
co to jest ?

<div>1<div>
dziadoo
Już poprawiłem. Literówka. Pisałem to z palca nie kopiowałem ze strony. Ma być
<div>1</div>.
Oznacza liczbę porządkową tak gwoli ścisłości
nevt
chyba tutaj masz problem:
Kod
for(var i = 0; i < argum.childNodes.length; i++)
{
   if(argum.childNodes.item(i))
   {
      argum.removeChild(argum.childNodes.item(i));
   }
}

kiedy usuwasz potomków z kolekcji wszystko ci się rozjeżdża... zaczynasz indeksować poza kolekcją i pętla ci się kończy, chociaż nie usunąłeś wszystkich elementów. żeby tego uniknąć, to najprościej jest potomków usuwać od końca, spróbuj tak:
Kod
var count = argum.childNodes.length;
for(var i = count; i > 0; i--)
    argum.removeChild(argum.childNodes.item(i-1));

powodzenia.
dziadoo
nevt jesteś wielki (tak z przesadą troszkę ale..). Dzięki za pomoc. Zrobiłem tak
Kod
Page_updater.removeChild = function()
{
    if(this.removeChild.arguments.length = 1)
    {
        var argum = document.getElementById(this.removeChild.arguments[0]);
        var count = argum.childNodes.length;
        for(var i = count; i >= 0; i--)
        {
            if(argum.childNodes[i])
            {
                argum.removeChild(argum.childNodes[i]);
            }
        }
        return argum;
    }
    else
    {
        return null;
        }
}

i śmiga jak trzeba. Jeszcze raz dzięki.

Sprawdziłem pod IE7 i poprawiłem tak żeby tam też śmigało jakby ktoś kiedyś coś takiego potrzebował.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.