ugrás a tartalomhoz

Firefox removeChild bug

inf · 2007. Május. 8. (K), 08.07
Sziasztok, az alábbi kód körülbelül arra szolgál majd, hogy Ajaxal küldjek el adatokat szerver oldalra. Szóval kb ez a rész felelős azért, hogy különböző adatokból querystringet gyártsak. Nah most kb az a lényeg, hogy elsőnek létrehozok egy postData objectet, ahhoz hozzápakolok változókat, aztán mindezt átalakítom ha onsubmit van az űrlapon. A postData létrehozása kb úgy megy majd, hogy ha leszedi az oldalt az ajax, akkor belenéz, és ha talál olyan taget, hogy <postdata />, akkor végrehajtja az ahhoz tartozó scriptet, ami kb azt jelenti, hogy a szülő formban létrehoz egy form.data=new postData() objectet, ehhez hozzárakja az alapbeállításokat az inputokhoz. Az inputok frissítése az kb úgy fog menni, hogy ha onblur esemény játszódik le vmelyik elemnél, akkor automatikusan frissül a postData-ban az érték, szóval eseménykezelőt rakok onblurra.
Nah röviden ennyit az egészről, a problémám az ott van a dologban, hogy egyrészt nem frissül ez az egész, vmiért az onbluros dolog nem fut le, másrészt pedig firefox alatt egyszerűen eltűnik az egész form tartalma a removeChild egy hibája miatt, azt konkrétan viszont nem tudom megmondani, hogy mi lehet ez a hiba, és hogyan lehetne kijavítani, ehhez kérem a segítségeteket.
<?xml version="1.0" encoding="iso-8859-2"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>JS test</title>
<script language="javascript" type="text/javascript">

function postData()
{
 this.container={};

 this.set=function (k,v)
 {
  this.container[k]=v;
 };

 this.get=function (k)
 {
  return this.container[k];
 };

 this.input=function (element)
 {
   switch (element.type.toLowerCase())
   {
    case "hidden": case "text": case "textarea":
     this.container[element.name]=element.value;
     break;
    case "checkbox": case "radio":
     if (element.checked)
      this.container[element.name]=element.value;
     break;
    case "select-one": 
     if (element.selectedIndex!=-1)
     {
      var option=element.options[element.selectedIndex];
      this.container[element.name]=(option.value || option.text);
     }
     break;
    case "select-multiple":
      this.container[element.name]=[];
      for (var j=0; j<element.options.length; j++)
       if (element.options[j].selected)
        this.container[element.name].push(element.options[j].value || element.options[j].text);
     break;
    case "submit": case "image": case "button": default:
     break;
   }
 }

 this.form=function (form)
 {
  if (form.elements)
   for (var i=0; i<form.elements.length; i++)
    this.input(form.elements[i]);
 }

 this.merge=function (obi)
 {
  if (obi instanceof postData)
   obi=obi.container;
  if (typeof obi=="object")
   for (var i in obi)
    this.container[i]=obi[i];
 }

 this.encode=function ()
 {
  var q=[];
  for (var i in this.container)
  {
   var name=encodeURIComponent(i);
   var value=this.container[i];
   if (typeof value=="object")
   {
    if (value instanceof Array)
    {
     for (var j=0; j<value.length; j++)
      q.push(name+encodeURIComponent("[]")+"="+encodeURIComponent(value[j]));
    }
    else
    {
     if (value instanceof postData)
     value=value.container;
     for (var j in value)
      q.push(name+encodeURIComponent("['"+j+"']")+"="+encodeURIComponent(value[j]));
    }
   }
   else
   {
    q.push(name+"="+encodeURIComponent(value));
   }
  }
  return q.join("&");
 }

 this.decode=function (s)
 {
  var q=s.split("&");
  for (var i=0; i<q.length; i++)
  {
   var e=q[i].split("=");
   var name=decodeURIComponent(e[0]);
   var value=decodeURIComponent(e[1]);
   var match=(/^(.*)\[(.*)\]$/).exec(name);
   if (match!= null && match.length>1)
   {
    name=match[1];
    var key=match[2];
    if (typeof this.container[name]!="object") this.container[name]=key==""?[]:{};
    if (this.container[name] instanceof Array) this.container[name].push(value);
    else this.container[name][key.slice(1,-1)]=value;
   }
   else
   {
    this.container[name]=value;
   }
  }
 }

}

function toScript(collection,handler){
 while(collection.length){
  handler.call(collection[0]);
  collection[0].parentNode.removeChild(collection[0]);
 }
}




function init()
{
 toScript(document.getElementsByTagName("postdata"),function (){
  var form=this.parentNode;
  if (form.elements)
  {
   form.data=new postData();
   form.data.form(form);
   for (var i=0; i<form.elements; i++)
    form.elements[i].onblur=function (){this.form.data.input(this)};
  }
 });

}

</script>
</head>
<body onload="init()">
<form action="" method="get" onsubmit="document.getElementById('aa').innerHTML=this.data.encode();return false;">
<postdata />

<input name="text" type="text" value="txt" />
<input name="hidden" type="hidden" value="hddn" />
<input name="password" type="password" value="psswrd" />
<input name="radio" type="radio" value="radio1" />
<input name="radio" type="radio" value="radio2" />
<input name="radio" type="radio" value="radio3" />

<select name="selectm" multiple="multiple" size="3">
<option value="selectm1">1</option>
<option value="selectm2">2</option>
<option value="selectm3">3</option>
<option value="selectm4">4</option>
<option value="selectm5">5</option>
</select>

<select name="select">
<option value="select1">1</option>
<option value="select2">2</option>
<option value="select3">3</option>
<option value="select4">4</option>
<option value="select5">5</option>
</select>



<textarea name="textarea" rows="10" cols="20">
txtr11
txtr22
txtr33
</textarea>

<input name="button" type="button" value="button" />
<input name="image" type="image" value="image.jpg" />
<input name="submit" type="submit" value="submit" />
<input name="reset" type="reset" value="reset" />


</form>

<div id="aa"></div>
</body>
</html>
 
1

hát

inf · 2007. Május. 8. (K), 08.30
a megoldás megvan a dologra, de azért nem teszem közzé, aki ért hozzá annyira, annak meg úgysem kéne a kód :)
2

szép

virág · 2007. Május. 8. (K), 12.49
Igazán szép tőled + ez egy nagyon értelmes fórumbejegyzés lett így. Te tudod, nekem végülis 8.
3

Mondjuk elárulhatod, hogy te vagy FF volt hibás

Jano · 2007. Május. 8. (K), 13.04
Azt azért elárulhatod, hogy FF-ban volt-e a hiba vagy inkább mégis te pucoltad ki a formot?!
4

vmi

inf · 2007. Május. 22. (K), 12.16
az egyik hiba az ez:

for (var i=0; i<form.elements; i++)
a másik pedig, hogy így nem lehet megadni ismeretlen nodet:

<node />
csak így:

<node></node>
elég hamar rájöttem másnap, miután kipihentem magam... érdekes, hogy firefox nem úgy kezeli az xhtml-t, mint kéne. ie simán elfogadja azt ami firefoxnak nem jó
6

node

attlad · 2007. Jún. 2. (Szo), 00.42
így nem lehet megadni ismeretlen nodet:
<node />

De, lehet.

ie simán elfogadja azt ami firefoxnak nem jó

Küldj neki valódi XHTML-t, na azt nem fogadja el az IE.
5

Ez nem XHTML

attlad · 2007. Jún. 2. (Szo), 00.29
Hát úgy tűnik, hogy nem XHTML-t használtál, tehát pl. HTML MIME típussal küldted ki a fenti kódot. Így a Firefox HTML-ként kezeli a dolgokat, ahogy a doksiban írják. HTML-ben amit írtál: <postdata /> csak egy nyitó tag, így az utána lévő dolgok ennek a gyerekei lesznek, ha távolítod akkor azok is mennek vele.
7

Hmm

inf · 2007. Jún. 2. (Szo), 11.36
Hmm lehet, nem tiszta annyira ez az xhtml, nem elég a doctype hozzá?
és mit adjak meg headerben text/html vagy application/xml+xhtml(vagy ilyesmi rémlik)
8

XHTML

attlad · 2007. Jún. 2. (Szo), 12.15
nem elég a doctype hozzá?

Nem.

Ez kéne típusnak: application/xhtml+xml. De ezzel a Explorert ki is zárnád, mert az buta az XHTML értelmezéséhez..

Btw. XHTML-ben így nem is ágyazhatsz be JavaScriptet ahogy fent van, CDATA szekcióba kell tenni, ha beágyazottan van és nem külső fájlban.
9

De akkor minek?

inf · 2007. Jún. 2. (Szo), 15.12
itt azért nem csak ennyit írnak.