Firefox removeChild bug
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.
■ 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>
hát
szép
Mondjuk elárulhatod, hogy te vagy FF volt hibás
vmi
node
<node />
De, lehet.
Küldj neki valódi XHTML-t, na azt nem fogadja el az IE.
Ez nem XHTML
<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.Hmm
és mit adjak meg headerben text/html vagy application/xml+xhtml(vagy ilyesmi rémlik)
XHTML
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.
De akkor minek?