var check=httpReq.readyState==4?(httpReq.status==200?true:false):false;
alert(check);
在Firefox中它只是弹出真实而在chrome中它分别弹出两次false和true。
???
非常感谢
答案 0 :(得分:1)
“onreadystatechange”回调可能会被调用一次,也可能被称为无数次(实际上, a zillion )。无论“检查”的值如何,都会发出“警报”呼叫。
答案 1 :(得分:0)
这段代码必须多次执行,单一的警报调用不会导致弹出三个对话框而没有此调用的上下文就无法回答。如果您将警报(检查)更改为警报(“hello world”),它仍会在Chrome中发生三次,在火狐中发生一次,如果这样您知道您的三元表达式没有任何问题,问题在于调用任何内容这段代码包含在表达式本身而不是任何错误中。浏览器处理和分派事件的方式各不相同,因此如果在某些事件处理程序中,事件由chrome vs firefox多次调度,则规范的不同解释会导致浏览器行为之间出现这些类型的差异(原因是进入并坚持使用Flex,至少浏览器兼容性问题出在一个单一的实体,Adobe,这种方式,有人责备并提交错误报告)。
答案 2 :(得分:0)
为什么这会令人惊讶?我假设您处于Ajax回调中,不同的浏览器在进行HTTP提取时会经历不同的阶段。在"准备好"之前,Chrome是意识到的中间状态并调用回调,以防你可以用这个事实做一些有用的事情; Firefox只在数据准备好时才发现请求。与JavaScript 本身无关,只是在[XHR][1]
的实现方面存在细微差别。
答案 3 :(得分:0)
正确的代码将是:
var check=httpReq.readyState==4?(httpReq.status==200?true:false):false;
if (check) {
alert("Page done loading and is OK");
}
答案 4 :(得分:0)
function check(){
var check=httpReq.readyState==4&&httpReq.status==200?true:false;
alert(check);
}
this.connect=function(frm){
if (isFirefox() && firefoxVersion() >= 3) {
httpReq.onload = check;
} else {
httpReq.onreadystatechange = check;
}
httpReq.open('GET',url(frm),false);
httpReq.send(null);
}}
答案 5 :(得分:0)
好的,我会更详细地解释一下。
发出请求后,readyState将经历5个阶段:
数据传输完成后,状态属性将根据服务器响应代码进行更改。通常,对于成功传输,代码为200.如果发生内部服务器错误,此代码将更改,但您仍将接收数据或至少可以发送的数据。
因此,为了防止您的警告多次触发,您需要测试状态,然后测试响应代码:
if (httpReq.readyState == 4) { // data is received, now we play with it
if (httpReq.status == 200) {
// process data
alert('Data received!');
} else {
// handle server-side error
}
}