欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

调试一个ajax要吐血了

程序员文章站 2022-04-28 13:47:19
...
写了一个英汉词典,具体流程:
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调试一个ajax要吐血了

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频


网友评论

文明上网理性发言,请遵守 新闻评论服务协议

我要评论
  • 调试一个ajax要吐血了
  • 专题推荐