onreadystatechange 在 Firefox 中没有被调用

发布于 2024-10-16 17:01:17 字数 765 浏览 0 评论 0原文

这是我的代码。

我的函数发送 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 中,如果我使用同步请求,onreadystatechange将不会被调用。

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

如何摆脱这个火狐问题?

Here are my codes.

my function to send ajax request and return a value:

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
}

My other function will use the myAjaxCall function returned value

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

Things are working perfectly in this way except on Firefox browser, I know the reason is because in Firefox, if I use synchronized request, the onreadystatechange will not be called.

In my case, however, I have to use synchronized ajax request, otherwise myAjaxCall() function returned value is always the initail value "var myValue=0".

How to get rid of this firefox problem??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

只是偏爱你 2024-10-23 17:01:17

使用函数指针而不是内联函数可以避免此问题:

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 之前完成

Use a function pointer instead of an inline function to avoid this issue:

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;
  }

Functions control scope in JavaScript, so:

  • The anonymous function creates a new scope, while the referenced function is in the global scope
  • Moving the function out of scope avoids the namespace conflict
  • myValue inherits a value in the new scope, while it does not in the global scope

Also, send should be done before onReadyStateChange

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文