您好,欢迎访问一九零五行业门户网

调试一个ajax要吐血了

写了一个英汉词典,具体流程:
1. 把本地文件按照{english: chinese}的格式写入memcached服务器
2. 通过ajax提交英语单词,并返回中文释义
遇到的问题: 查询对应的单词,可以通过file_put_contents函数写入本地,证明查询到了相应的单词,在客户端,通过readystate属性可以依次看到返回1,2,3,4,但是在window.alert(type res)时显示未定义。
//这部分代码是ok的,用于读取并解析本地的txt格式词典fp=fopen($filename,'r') or die('打开ciba失败'); } public function readword() { while(!feof($this->fp)) { $word=fgets($this->fp); $word=trim($word); if($word=='') continue; $en=$this->parseen($word); $ch=$this->parsech($word); $this->arr_word[$en]=$ch; /* $this->recycle_num--; if($this->recycle_num==0) return; */ } } public function parseen(&$word) { if(preg_match($this->query_en, $word, $en)) { return $en[0]; } else { echo match english word failed
; } } public function parsech(&$word) { if(preg_match($this->query_ch, $word, $ch)) { return $ch[0]; } else { echo match chinese failed
; } } public function getword() { return $this->arr_word; } public function __destruct() { fclose($this->fp); }}//$word=new word('ciba.txt');//$word->readword();//echo ;//print_r($word->getword());//echo
; */?>//这部分代码也是ok的,用于将词条写入memcachedmem=new memcache(); $this->mem->connect(127.0.0.1, 11211) or die(connect memcached failed!!!
); } public function __destruct() { $this->mem->close(); } public function addword() { $word=new word('ciba.txt'); $word->readword(); $result=$word->getword(); //echo count($result).字符
; //exit(); foreach($result as $en => $ch) { $this->mem->add($en, $ch, memcache_compressed, time()+10*24*3600) or die(添加词条失败. __line__ .
); } } public function setword($en,$ch) { //控制器判断输入是否合法 $en=$this->filterword($en); $en=$this->mem->get($en) or die(找不到词条 $en); $this->mem->set($en, $ch, memcache_compressed, time()+31*24*3600) or die(添加词条$en失败); } public function getword($en) { //控制器判断输入是否合法 $en=$this->filterword($en); $ch=$this->mem->get($en) or die(找不到词条 $en); return $ch; } public function replaceword($en,$ch) { //控制器判断输入是否合法 $en=$this->filterword($en); $en=$this->mem->get($en) or die(找不到词条 $en); $this->mem->replace($en, $ch, memcache_compressed, time()+31*24*3600) or die(替换词条$en失败); } public function deleteword($en) { //控制器判断输入是否合法 $en=$this->filterword($en); $this->mem->delete($en,0) or die(删除词条$en失败); } //过滤掉中文,包括空格的词组,长度大于20的词条 public function filterword($en){ $en=trim($en); if(preg_match('#[\x{4e00}-\x{9fa5},\)\.\(]+#u', $en)) { //echo '暂时不支持中文查询
'; if(preg_match('#\b[a-z]+\b#i', $en, $res)) { if(strlen($res[0])>20) { //echo 字符过长
; return strtolower(substr($res[0], 0,20)); } return strtolower($res[0]); } } else if(preg_match('#\s+#', $en)) { //$en=explode(' ', $en); //echo 含有空格
; $res=null; if(preg_match('#[a-z]+#i', $en, $res)) { if(strlen($res[0])>20) { //echo 字符过长
; return strtolower(substr($res[0], 0,20)); } return strtolower($res[0]); } } else if(preg_match('#[?_\+\?\*\^\$\#\%\&\/\\,\.!@=\`\'\\]#',$en, $res)) { // //echo '含有非法字符
'; if(preg_match('#[a-z]+#i', $en, $res)) { if(strlen($res[0])>20) { echo 字符过长
; return strtolower(substr($res[0], 0,20)); } return strtolower($res[0]); } } else if(strlen($en)>20) { //echo 字符过长
; return strtolower(substr($en, 0,20)); } else { return $en; } } public function flushall() { $this->mem->flush(); } public function gettime() { if (function_exists(micro_time)) { list($usec, $sec) = explode( , microtime()); return ((float)$usec + (float)$sec); } else { return time(); } }}//$mem=new memstore();//$mem->addword();//$mem->flushall();//$mem->replaceword('abandon', 100000000);//$mem->deleteword('abandon');//echo $mem->getword('_*&^%abandon^%$#');//echo ok; ?>//下面这段代码也是ok的,根据客户端提交的英语单词,可以成功查询到对应的中文,并写入本地文件成功过getword($en); $en=$mem->filterword($en); $res=.$en..$ch.; file_put_contents('aword.txt', $res.\r\n,file_append);//这里是ok的 echo $res; //echo '{'.$en.':'.$res.'}';}else{ file_put_contents('aword.txt', receive non data \r\n,file_append);}?>//我估计问题出在下面这段代码,,但是就是找不出问题所在,一直显示undefined
ajax调试要吐血了
回复讨论(解决方案) var res=xmlhttp.responsexml;
window.alert(typeof $res);
一样吗?不一样当然不行
var res=xmlhttp.responsexml;
window.alert(typeof $res);
一样吗?不一样当然不行
哎。这么明显的错误硬是没照出来。。我用的写字本写的代码。。怎么找都找不到。。。zend studio for eclipse 在我的机器上跑步起来,,有什么轻量级,功能齐全,自动高亮,自动补全的ide推荐吗?
sublime or notepad++
var res=xmlhttp.responsexml;
window.alert(typeof $res);
一样吗?不一样当然不行
//客户端做出如下修改 xmlhttp.onreadystatechange=function() { //window.alert(xmlhttp.readystate); if (xmlhttp.readystate==4 && xmlhttp.status==200) { var res=xmlhttp.responsetext; res=eval((+res+)); window.alert(res); //var en=res.getelementsbytagname(en)[0].childnodes[0].nodevalue; //var ch=res.getelementsbytagname(ch)[0].childnodes[0].nodevalue; //var en=$(enword).value; /var ch=res.en; $(chword).innertext= en+: 的中文意思是: +ch; } } //服务器这边改成用json传回数据,修改如下getword($en); $en=$mem->filterword($en); $res=$en$ch; file_put_contents('aword.txt', $res.\r\n,file_append); //ob_start(); $res='{'.$en.':'.$ch.'}'; echo $res;}else{ file_put_contents('aword.txt', receive non data \r\n,file_append);}
//可以收到数据,不过收到的是一个html网页,试图在ob缓存里把结果过滤出来,但最后还是一个空html+结果
我就不明白了这段html是拿来的.* ,而且结果是在
后面,ob过滤就失效了
36行应为 ob_clean();
36行应为 ob_clean();
我明白为什么了,谢谢。 其实如果不用ob_clean(),在接受的时候采用innerhtml而不是innertext也是可以的。 3q
其它类似信息

推荐信息