【问题标题】:onreadystatechange is not called in firefoxFirefox 中不调用 onreadystatechange
【发布时间】:2011-06-24 21:49:42
【问题描述】:

这是我的代码。

我的函数发送ajax请求并返回一个值:

function myAjaxCall(){
   var myValue=0
   var async= false //I have to use synchronized request(otherwise my return value is 0)
   xmlhttp.open("GET",URL,async);

   xmlhttp.onreadystatechange=function(){
       ...
       myValue = SOMEVALUE;
   };

   xmlhttp.send();         

   return myValue
}

我的其他函数会使用myAjaxCall函数返回值

function otherFunc(){
   var x= myAjaxCall();
}

除了在 Firefox 浏览器上之外,一切都以这种方式完美运行,我知道原因是因为在 Firefox 中,如果我使用 synchronized 请求,onreadystatechange 将不会叫做。

然而,就我而言,我必须使用 同步 ajax 请求,否则myAjaxCall() 函数的返回值始终是初始值“var myValue=0”。

如何摆脱这个firefox问题??

【问题讨论】:

  • 不要使用同步的 Ajax 请求只是为了能够立即返回某些内容 - 它们会停止页面上的所有其他内容并可能冻结浏览器。改为更改程序的架构方式更好
  • 那么我可以拥有什么样的架构.....
  • 使用otherFunc作为您的回调处理程序并在其中访问xmlhttp.responseText
  • Firefox 4 之前的 Firefox 版本不会为同步 XMLHttpRequest 触发 onreadystatechange,正如您所注意到的。但是既然这是一个同步请求,为什么首先需要 onreadystatechange 处理程序呢?

标签: javascript ajax firefox xmlhttprequest onreadystatechange


【解决方案1】:

使用函数指针而不是内联函数来避免这个问题:

function myAjaxCall(){
   var myValue=0;
   var async= true;

   xmlhttp.open("GET",URL,async);
   xmlhttp.send();
   xmlhttp.onreadystatechange=foo;         
  }

function foo(bar)
  {
  var myValue = SOMEVALUE;
  return myValue;
  }

JavaScript 中的函数控制范围,所以:

  • 匿名函数创建一个新的作用域,而被引用的函数在全局作用域中
  • 将函数移出范围可避免命名空间冲突
  • myValue 在新范围内继承一个值,但不在全局范围内

另外,发送应该在 onReadyStateChange 之前完成

【讨论】:

  • 我一直使用一个函数,但现在这行不通了。我不知道为什么,只是在没有新块的情况下调用函数就可以了!
  • @Ercksen 调用不同,因为它不会创建新范围。
猜你喜欢
  • 2011-05-29
  • 2012-12-27
  • 2023-04-04
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多