narlot Posted November 25, 2009 Report Share Posted November 25, 2009 Есть скрипт - 1.пхп, в котором задается массив: <script language="javascript"> var formElements=new Array(); </script> в этом же скрипте зовется функция: <input type="text" name="email" onChange="CheckFunc(this.value,2,formElements,9);" /> которая находится в файле ajax.js и выглядит так: function CheckFunc(id,f,mass,n){ xmlhttp=GetXmlHttpObject(); if (xmlhttp==null){ alert ("Error"); return; } var url="functions3.php"; url=url+"?id="+id; url=url+"&flag="+f; if(f==2){ xmlhttp.onreadystatechange=function(){stateChanged2(n,mass);}; } xmlhttp.open("GET",url,true); xmlhttp.send(null); } далее массив отдается функции (в этом же файле): function stateChanged2(n,mass){ if (xmlhttp.readyState==4){ if(xmlhttp.responseText=="<img src='./pics/n.jpg'/>"){ mass[n]='<img src="./pics/n.jpg"/>'; } if(xmlhttp.responseText=="<img src='./pics/V.jpg'/>"){ mass[n]=""; } document.getElementById("email").innerHTML=xmlhttp.responseText; } return mass; } и дальше начинается проблема, массив (mass) после первого вызова функции CheckFunc(this.value,2,formElements,9); не возвращается со значением - он всегда undefined. Значения появляются лишь после второго вызова функции. Никак не могу понять как исправить. Есть идеи или в каком направлении искать? Quote Link to comment Share on other sites More sharing options...
Grey_Wolf Posted November 25, 2009 Report Share Posted November 25, 2009 Pprobuj po6govo , nitji kakije zna4enija, i gde dobavljajetsa.. Prosto gdje tolko mozno postav alert(xxx, 'nzvanija peremenoj xxx').. Srzu uzvidjesh gdje problema .. ja nevidel gde Obnavljajetsa masiv formElements tojest formElements= func-kotroraja dolzna jevo vernutj .. -- ilje dobavljai zna4enija na prjamuju, tak ka etot masiv objavlen kak GLOBAL mozes jevo napramouju izpozovatj v funkcije ... Quote Link to comment Share on other sites More sharing options...
narlot Posted November 25, 2009 Author Report Share Posted November 25, 2009 formElements = mass, просто получается, что это работает по принципу и++, а не ++и. В текущем моменте берется предыдущее значение( Quote Link to comment Share on other sites More sharing options...
rATRIJS Posted November 25, 2009 Report Share Posted November 25, 2009 ņiko nesaprotu ;( Quote Link to comment Share on other sites More sharing options...
2easy Posted November 26, 2009 Report Share Posted November 26, 2009 hmm, a man gan tas kods strādā :)) masīvā normāli parādās attiecīgā vērtība jau pēc pirmā CheckFunc() izsaukuma! viss ok notestēju uz ie6,ie7,ie8,firefox,opera,safari,chrome. visur strādā! 1) vispirms izmainu vērtību tajā teksta laukā un tad ieklikšķinu jebkur ārpus teksta lauka (lai teksta lauks zaudētu fokusu un 100% izraisītu onchange event) 2) pēc tam spiežu uz testa pogas, lai pārliecinātos, vai masīvs ir izmainījies <button onclick="alert(formElements[9])">test</button> jā ir! functions3.php simulēju vnk iekopējot tajā failā <img src='./pics/n.jpg'/>, lai izpildītos if iekš stateChanged2(), kas izmaina masīvu tā kā GetXmlHttpObject() nebija definēta, tad izmantoju šādu function GetXmlHttpObject() { if (window.XMLHttpRequest) return new XMLHttpRequest(); try {return new ActiveXObject("Microsoft.XMLHTTP");} catch (e) {} } starp citu, stateChanged2() beigās nevajag nekādu return mass; jo nav jau kam padot to masīvu! stateChanged2() ir tikai event handleris, un to tiešā veidā nekur neizsauc. tobish onreadystatechange tikai apstrādā response datus un neko neizdod. un tas attiecas uz jebkuru event handleri turklāt mass ir tikai reference uz globālo formElements masīvu, kuram tāpat vnm var tikt klāt Значения появляются лишь после второго вызова функции. vai gadījumā nav tā, ka nevis pēc otrā funkcijas izsaukuma, bet pēc mazas laika nobīdes? varbūt tu maldīgi gribi, lai viss notiek momentā. bet tā kā request/response notiek asinhroni, tad kādu brīdi būs tas undefined, līdz no servera atnāks atbilde. un tad var likties, ka ar pirmo izsaukumu nekas nestrādā, bet vnk ir jāpagaida kāda sekunde ;) attiecībā uz ajax applikāciju debugošanu varu ieteikt izmantot laika aizturi, pirms sūtīt atbildi <?php sleep(2); ?> tad situācija būs tuvāka production videi, savādāk uz localhost jau viss notiek ļoti ātri un labi, bet tas nav objektīvi. uz testēšanas brīdi pietiek ielikt kādas pāris sekundes aizturi, lai redzētu kā izskatās arī worst case scenario Quote Link to comment Share on other sites More sharing options...
narlot Posted November 26, 2009 Author Report Share Posted November 26, 2009 ^_^ liels paldies par atsaucību. Neparzinu AJAX vispar, bet tagad ir skaidrs. :) Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.