———-第一次更新(2018.8.5 0:44)
今天一下午加一晚上(8.4)都在处理这个问题,可是还是没有处理好
页面的占座与取消占座已经做好了并且能够和数据库进行实时的数据传输
现在要进行的是打开页面,页面上就能显示出已经占的座位的标志,初步想法是通过onload函数,读取数据库的seat下的值,在根据座位号进行相应的变化在页面上
开始是我用onload函数,出了些bug,检查啦许久才发现是没有加载jQuery库的原因,加上去后,页面加载完成的弹窗如期而至
代码如下
:
<script src="jquery-3.3.1/jquery-3.3.1.js"></script>
<script language="javascript" for="window" event="onload">//for后面加 控件名称。event后面是事件名称
alert("页面加载完成");
然后就是常规的ajax写法,与服务器php文件进行通信
代码如下:
if (window.XMLHttpRequest){
// IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
xmlhttp=new XMLHttpRequest();
}
else {
// IE6, IE5 浏览器执行代码
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function(){//onreadystatechange此函数意思为当服务器响应
//已经做好被处理的准备是做出的响应
if (xmlhttp.readyState==4 && xmlhttp.status==200){//readystate的值为4或status为200时代表服务器可以与之通信
var show_txt=xmlhttp.responseText;
alert(show_txt);
}
}
xmlhttp.open("GET","一楼2.php",true);
xmlhttp.send();//请求方式为post才有用
期间遇到了写问题,关于xmlhttp.send();
在运行程序时,谷歌浏览器报错说是这段代码的原因,我查了查资料,资料上说这段代码必须在post下才能用,然后我把这段代码注释掉了,发现还运行不成功,在排除了很多因素有,最终发现问题还在这,我把注释取消了,在运行,发现正常运行???很迷
然后就是php文件的编写
先是不了解如何查找并输出,
查了资料,我决定用
select seat from ceshi1 ;
结果发现用
mysql_fetch_array($obj)
读取并输出时根本无法输出
原来这段代码的到得结果是一个数组。要输出必须加下标,但是我这个sql语句是直接获得所有的座位号,不能知道有多少条数据,输出时不方便且容易出错,所以我采用循环遍历的方式来获取
代码如下
$i=1;
for($i=1;$i<=100;$i++){
$sql = "select seat from ceshi.ceshi1 where id=$i";
$obj = mysql_query($sql);
$rows = mysql_fetch_array($obj);
if($rows[0]){
$show_1[$i]=$rows[0];
//$show[i]="$rows[0]";
//$show[i]=$rows[0];
echo $show_1[$i];}
}
看似简单的代码,然而在我这里出现了数不清的错误,先是变量名少了字母无法传参,又是变量名前少了$,无法解析变量,还有就是加不加引号的问题,这些问题引发了无数的bug,好在我相信我的方法是没有错的,在是无数遍梳理了代码后,终于把所有bug解决了,程序完美运行
然后就是传参了,
按照这样的办法传过来的参数是一个被拼接了的字符串,所以无论怎么输出始终输出被拼接后的字符串,
然后我准备用循环来写,获得一个值传一个值,结果又和for循环和if循环的顺序问题发生了纠缠,到最后不了了之了,又想从php文件入手,创建数组,结果又经历了磕磕绊绊后,效果和没捣鼓之前一样的
……………………..现在时间1:07
问题没解决
先去睡觉
明早再来!!
———-第二次更新(2018.8.5 16:16)
现在,那个问题还没有解决,php穿过来的是个已经拼接的字符串,查资料说是用返回一个对象的方法去实现传出,但是,我捣鼓了许久,仍然有错误,因为实在不懂这个返回对象的方法,所以我放弃了,然后我用另外一个方法,push一个数组进去,再传出来,这个方法正再实现,
但是过于麻烦,我又想到了一个好点子,之前想的是获取所有数据库中的座位号,然后通过js来操作,但是现在实现不了,所以我想用另一个办法,获取页面上的所有座位号,然后一个个与数据进行比对,如果存在返回一个标识符,然后利用这个标识符进行操作,但由于本人能力有限,尚且不知道如何获得所有对象的name信息,所以只能手写name值,代码如下
function select_show(){
var a_1=1;//创建循环变量
var a_2=1;//创建循环变量
for(var a_1=1;a_1<=15;a_1++){
for(var a_2=1;a_2<=10;a_2++){
alert ('bao'+a_1+'_'+a_2);
}
}
var b_1=1;
var b_2=1;
for(var b_1=1;b_1<=20;b_1++){
for(var b_2=1;b_2<=4;b_2++){
alert ('dian'+b_1+'_'+b_2);
现在我去尝试一下这个方法,这个方法的缺点在于数据过多,运行较慢,且需要编写的函数过多容易混淆。
第二次更新(2018.8.5 23:36)
这个问题困扰了我一晚上,关于返回值和弹出
刚开始我打算用调用ajax函数并返回值的方法,结果这个返回值无论如何也返回不了,因为在调用的函数里面有一个个if语句,我需要返回的值在if语句里面,而在if语句里面是返回不出来的,然后请教别人,别人说在if前面先把返回值定义出来,设置值为null,然后在if语句里面赋值,在if语句外返回,然而并没有效果,有尝试了好几种方法,并没有效果,我干脆打算不返回值了,直接用这个值,在调用另一个函数来解决问题
打给使用for循环,for循环里面调用ajax函数时,发现必须在for循环底下alert一个值,ajax才能获得值并且按照我的想法来弹窗,但是很明显,我不需要这个alert,alert只是调试作用,但是如果我把alert去掉,整个函数就停止工作了,然后我就排除问题,每一段后面alert一下,来找出问题,就在我把for下面的弹窗注释掉后,发现ajax里面的弹窗弹接受值时接受的是两个for循环的最后一个值,????我就很纳闷,然后各种测试,发现了为什么加了alert就能一个弹出来,alert在这里起的是阻塞作用,如果不加alert,for循环将会一直持续下去,并把最后一个值给调用的函数,但是我调用的ajax函数明明在for循环里面,为什么不能同步输出呢
经过查阅资料知道,原因如下:
,每个迭代中都要发送一个get请求,因为迭代的速度太快,一个请求还没有完成就进行下一个迭代,在chrome和ff上,除最后一个请求外,其它请求都被取消了。
我的天???这是什么情况???
我要去解决问题了,以后再更。
第三次更新 (2018.8.6 0:37)
嗯,通过吧ajax异步请求值设为false,for循环就能等待ajax命令结束后再运行究其原因,是因为for循环为单线程,ajax为多线程,所以for循环不用等待ajax执行完才进行下一步操作,所以解决这个最好的办法是关掉ajax的异步请求。
解决完了这一问题,我就调用另一个函数,使函数在加载的时候显示所有被占的座位,代码如下
function show_true(show_seat)//shu_seat为座位的name值,只要比哦按这个name的颜色就行
{
document.getElementsByName(show_seat)[0].src="yes.png";//这里getElementsByName(show_seat)得到的是由name组成的数组,所以必须加[0]才能判断是第一个。
这里getElementsByName(show_seat)得到的是由name组成的数组,所以必须加[0]才能判断是第一个。
现在这个办法有很大缺点,就是一直循环,非常耗时,全部显示要3秒钟,需要优化优化。