首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Eclipse开发 >

问个js异步的有关问题,应该如何避免

2012-01-05 
问个js异步的问题,应该如何处理我知道的异步有ajax异步,动态div里放iframe执行*.do异步,动态加载js异步还

问个js异步的问题,应该如何处理
我知道的异步有ajax异步,动态div里放iframe执行*.do异步,动态加载js异步
还有其他的能异步吗?
我想知道上边我所写的在什么时候发生的异步,我想在他们的后边加东西
如IFRAME生成页面以后我想给里头的数据负值,有的时候所iframe里的字段不存在,
动态加载js也是这样,
我现在用的是settimeout来判断对象是否存在在负值,可以用别的方法吗
onreadystatechange我不知道怎么用,在什么地方用.

[解决办法]
onreadystatechange
指定当readyState属性改变时的事件处理句柄

Example
如下的例子演示当XMLHTTPRequest对象的readyState属性改变时调用HandleStateChange函数,当数据接收完毕后(readystate == 4)此页面上的一个按钮将被激活

var xmlhttp=null;
function PostOrder(xmldoc)
{
var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.5.0");
xmlhttp.Open("POST", "http://myserver/orders/processorder.asp", false); 
xmlhttp.onreadystatechange= HandleStateChange;
xmlhttp.Send(xmldoc);
myButton.disabled = true;
}
function HandleStateChange()
{
if (xmlhttp.readyState == 4)
{
myButton.disabled = false;
alert("Result = " + xmlhttp.responseXML.xml);
}
}

readyState
返回XMLHTTP请求的当前状态


Example
var XmlHttp;
XmlHttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");

function send() {
XmlHttp.onreadystatechange = doHttpReadyStateChange;
XmlHttp.open("GET", "http://localhost/sample.xml", true);
XmlHttp.send();
}

function doHttpReadyStateChange() {
if (XmlHttp.readyState == 4) {
alert("Done");
}
}
备注
变量,此属性只读,状态用长度为4的整型表示.定义如下:

0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法) 
1 (初始化) 对象已建立,尚未调用send方法 
2 (发送数据) send方法已调用,但是当前的状态及http头未知 
3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误, 
4 (完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据 




[解决办法]
function createXmlHttpRequest(){ //初始化
if(window.ActiveXObject){ //IE浏览器
XmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest){ //Mozilla 浏览器
XmlHttp = new XMLHttpRequest();
}
 }

function sendRequest(url){
  createXmlHttpRequest(); //生成XmlHttpRequest对象
XmlHttp.open("post", url, true);
XmlHttp.setRequestHeader("CONTENT-TYPE","text/xml;charset=GBK"); 
XmlHttp.onreadystatechange = handleStateChange; //徽调函数
XmlHttp.send(null);
 }

function handleStateChange(){
 if(XmlHttp.readyState == 4) { //判断对象
if(XmlHttp.status == 200) { //信息返回,处理信息。这里就可以即时验证输入是否为正确了
var xml = XmlHttp.responseText;//获取返回的xml
}
}
 }

onreadystatechange会循环执行,从0——4判断对象,然后获取返回数据,一般是xml
[解决办法]
举个例子
比如你注册的时候,要验证你的注册你的名字是否已经存在。
在验证时,如果要等待验证的结果出来后才能做下一补操作就是 同步
异步则不需要等待,直接可以进行下一步操作
[解决办法]
同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。
异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。

所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样你可以省钱。

举个例子 打电话时同步 发消息是异步

热点排行