Jump to content
php.lv forumi

PHP + AJAX


narlot

Recommended Posts

Есть скрипт - 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. Значения появляются лишь после второго вызова функции. Никак не могу понять как исправить. Есть идеи или в каком направлении искать?

Link to comment
Share on other sites

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 ...

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...