使用对象正确替换全局变量

时间:2010-11-18 01:21:28

标签: javascript html object

我一直在试图弄清楚如何使用原型初始化对象以便使用全局变量进行转义,我首先了解了here。我开始在接受的答案中实现我自己的代码版本。

function XML_Data() {
  this.data = null;
}

XML_Data.prototype = {
 GetXML: function() {
  $.ajax({
   type: "GET",
   url: "questions.xml",
   dataType: "xml",
   success: function(xml) {
    this.data=xml;
   } //close success
  });//close AJAX  
 },

 UseXML: function() {
  alert(this.data)
 }
};

(我的脚本实现)


然而,我遇到了一个问题。当我使用这段代码运行此处显示的函数时:

var data = new XML_Data();
data.GetXML();
data.UseXML();

我收到一条说“null”的提醒。我已经完成了十几次代码,但由于这是我第一次使用Javascript,很明显我错过了一些东西。你能指出来吗?

谢谢,Elliot Bonneville。

2 个答案:

答案 0 :(得分:2)

请注意

var data = new XML_Data();
data.GetXML();  //This will run the ajax request
data.UseXML();  //This will most likely run before the ajax request is finished.

在Jquery中发布事件可能会有效,但我还没有测试过这段代码。

function XML_Data() {
  this.data = null;
}

XML_Data.prototype = {
 GetXML: function() {
  $.ajax({
   type: "GET",
      url: "questions.xml",
   dataType: "html",
   success: function(xml) {
    this.data=xml;
    $(window).trigger("myAjaxEvent");
   } //close success
  });//close AJAX  
 },

 UseXML: function() {
  alert(this.data)
 }
};


$(document).ready( function () {
    var data = new XML_Data();
    $(window).bind("myAjaxEvent", function () {
      data.UseXML();
    });

    data.GetXML();

});

答案 1 :(得分:0)

您现在拥有的代码正在尝试使用非阻塞异步API同步(按顺序)运行。 UseXML调用在GetXML调用实际完成其AJAX之前发生,因为它是异步的。

你可以用异步模式(在AJAX请求成功时直接调用this.UseXML)或同步模式(其中“async:false”传递给AJAX调用)来编写它。异步模式在JavaScript开发中更为常见,因为它更强大,并且同步请求通过阻止脚本执行来阻止浏览器中的UI,但同步对于小事情来说更容易实现。

请参阅http://api.jquery.com/jQuery.ajax/