是否可以从函数外部检索onreadystatechange
函数中的变量集?
- 编辑 -
关于职能的执行:
如果可能的话我只想点击一下执行ajaxFunction()
然后弹出()下一次单击,或
不知何故等待ajax功能结束然后调用警报框
在伪代码中:
function ajaxFunction(){
//creating AJAX
...
// Create a function that will receive data sent from the server
ajaxRequest.onreadystatechange = function (){
if(ajaxRequest.readyState == 4){
//success code
======>Here i want to set variable <=====
var MyVariable='MyContent';
}
}
//Retrieving page
....
}
function popup(){
ajaxFunction();
alert(MyVariable);
}
答案 0 :(得分:5)
以下代码假定ajax-request是同步的:
function popup(){
ajaxFunction();
alert(MyVariable);
}
但是由于同步请求阻止了浏览器,因此几乎在所有情况下都应该使用异步调用(如果我没记错的话,不应该在同步请求上调用onreadystatechange,但不同浏览器的行为方式不同)
你能做的是:
function ajaxFunction(callback){
//creating AJAX
...
// Create a function that will receive data sent from the server
ajaxRequest.onreadystatechange = function (){
if(ajaxRequest.readyState == 4){
//success code
callback('MyContent')
}
}
//Retrieving page
....
}
function popup() {
ajaxFunction(function(MyVariable){alert(MyVariable););
}
答案 1 :(得分:1)
有些评论是正确的......这与变量范围无关,而且与设置MyVariable值的内部函数('onreadystatechange'函数)的时间有关的事实都不会被时间执行alert()发生...因此警报将始终为空。
内部函数不是同步执行(即,立即执行),而是在请求返回后延迟并执行,这是在执行alert()之后很久。 唯一的解决方案是将警报推迟到请求完成之后。
但无论如何,内部函数可以将变量设置在其范围之外,正如其他帖子所提到的那样。但是你的问题更多的是关于执行顺序而不是变量范围。
答案 2 :(得分:0)
为什么不将MyVariable
的范围更改为函数外部?
var MyVariable;
function ajaxFunction(){
//creating AJAX
...
// Create a function that will receive data sent from the server
ajaxRequest.onreadystatechange = function (){
if(ajaxRequest.readyState == 4){
//success code
======>Here i want to set variable <=====
MyVariable='MyContent';
}
}
//Retrieving page
....
}
function popup(){
ajaxFunction();
alert(MyVariable);
}
答案 3 :(得分:0)
不,因为MyVariable
的范围是函数。要使popup()
可见,它必须在事件处理函数和popup()
都可以看到的范围内,如Jenp建议的那样。
答案 4 :(得分:0)
将变量传递给popup()函数:
var MyVariable;
function ajaxFunction(){
//creating AJAX
...
// Create a function that will receive data sent from the server
ajaxRequest.onreadystatechange = function (){
if(ajaxRequest.readyState == 4){
//success code
======>Here i want to set variable <=====
MyVariable='MyContent';
popup(MyVariable);
}
}
//Retrieving page
....
}
function popup(x){
ajaxFunction();
alert(x);
}
答案 5 :(得分:0)
这可能会使您的问题变得复杂,因此可以随意插入,但使用第三方Javascript库可能会有助于轻微减轻您的负担(正如评论者一些提到的那样)。 Prototype和JQuery都有处理范围的方法,例如Prototype中的bind函数。此外,您不必编写自己的Ajax请求代码,尽管我建议您深入挖掘并了解它是如何工作的!原型类可以帮助解决您所描述的范围问题。您可能希望重构以便使用异步Ajax请求,以便浏览器不必像您编写它的方式那样等待。以下将弹出警报消息并相应地设置变量,尽管我没有测试它是否有错误。它显示了基本概念。
var TestClass = Class.create();
TestClass.prototype = {
MyVariable: null,
AjaxURL: "http://yourajaxurl.com/something.asmx",
DoAjaxCall: function() {
new Ajax.Request(this.AjaxURL,
method: 'get',
onSuccess: this.AjaxCallback.bind(this),
onFailure: this.DoSomethingSmart.bind(this));
},
AjaxCallback: function(returnVal) {
this.MyVariable = returnVal.responseText; //ResponseText or whatever you need from the request...
this.Popup(this.MyVariable);
},
DoSomethingSmart: function() {
//Something smart
},
Popup: function(message) {
alert(message);
}
};
var TestClassInstance = new TestClass();
TestClassInstance.DoAjaxCall();