如何在我的对象中获得跨浏览器ajax引用

how to get the cross browser ajax reference within my object

本文关键字:浏览器 ajax 引用 我的 对象      更新时间:2023-09-26

我有一个返回这些数据的服务器端文件

{
success: true,
m_sName:'smith, james',
m_ShortName:'Jim_S',
m_FirstName:'james',
m_LastName:'smith',
m_Rank:'CONT',
m_Unit:'',
m_Address:'PO Box 241',
m_City:'guthrie',
m_State:'KY',
m_Zip:'42234',
m_Phone:'270-956-3174',
m_Fax:'',
m_Email:'krullwarking@yahoo.com',
m_Title:'',
m_RegnetName:'james.andrew.smith',
m_BirthMonth:'10',
m_UserID:105745,
m_Age:47
}

然后在客户端我有代码看起来像这样:

var Person = {
//Private members
getXmlRequestObj : function() {
        if (window.XMLHttpRequest) {
            importHTML2: new XMLHttpRequest();
        } else if(window.ActiveXObject) {
            importHTML2: new ActiveXObject("Microsoft.XMLHTTP");
        } else {
            importHTML2: "Your Browser needs an upgrade";
        }
    },

//Set up the global content retrieval object
//called importHTML
importHTML:  new ActiveXObject("Microsoft.XMLHTTP"),

getAjaxData:function(sUrl) {
    if (Person.importHTML.readyState == 4 || Person.importHTML.readyState == 0) {
        Person.importHTML.open("GET", sUrl, false);// make it wait for the response
        Person.importHTML.onreadystatechange = Person.handleDataArrived; 
        Person.importHTML.send(null);
    }       
},
//Called when the AJAX response is returned from any operation
//that lists handleContentArrived as its onreadystatechanged event
//for importHTML eg:importHTML.onreadystatechange = handleContentArrived; .
handleDataArrived: function() {
    if (Person.importHTML.readyState == 4) {
        Person._bar = eval("("+Person.importHTML.responseText+")");
        Person._sName = Person._bar.m_sName;
        Person._ShortName = Person._bar.m_ShortName;
        Person._firstName = Person._bar.m_FirstName;
        Person._lastName = Person._bar.m_LastName;
        Person._Unit = Person._bar.m_Unit;
        Person._securityGroups = Person._bar.m_Rank;
        Person._height = '6.0 ft';
        Person._weight = '280lbs';
        Person._hairColor = 'Brown/gray';
        Person._photoURL = 'www.photourl.com';
        Person._facebookID = 'Krullwarking@yahoo.com';
        Person._emailAddress = Person._bar.m_Email;
        Person._phoneNumber = Person._bar.m_Phone;
        Person._Fax = Person._bar.m_Fax;
        Person._NetworkName = Person._bar.m_RegnetName;
        Person._ID = Person._bar.m_UserID;
        Person._Address = Person._bar.m_Address;
        Person._City = Person._bar.m_City;
        Person._State = Person._bar.m_State;
        Person._Zip = Person._bar.m_Zip;
        Person._Title = Person._bar.m_Title;
    }
},
wholeName : function()
    {
    return this._firstName + ', ' + this._lastName; 
    },
// constructor
loadPerson : function(ID){
    Person._ID = ID;
    Person.getAjaxData('getUser.asp?uid='+ID);
},

setFirstName : function(fname) {
    Person._firstName = fname;
    return true;
},
// add the methods to the prototype so that all of the 
// Foo instances can access the private static
getFirstName : function() {
    return Person._firstName;
}
}
Student = {
superClass:Person,
sayHello : function(){  alert('hi, I am a student, and my name is '+this.superClass.wholeName());} 
}
Student.superClass.loadPerson(105745);
Student.sayHello();

这工作得很好,但只有在IE中,因为activex引用xmlHTTP。每次我尝试使importtml变量调用this。getXmlRequestObj或Person。getXmlRequestObj不工作.....我该怎么做呢?

你的问题是你从不使用getXmlRequestObj。我猜你首先想做的是

...
innerHTML: Person.getXmlRequestObj(),
...

但是这不起作用,因为你不能在对象自己的对象字面定义中引用对象的属性。相反,您可以创建一个一次性初始化函数来设置importHTML,您可以在对象定义之后立即调用该函数。

var Person = {
    ...
    initialize: function() {
        Person.importHTML = Person.getXmlRequestObj();
    }
    ...
}
Person.initialize();
编辑:

JSON没有带引号的键。JavaScript非常乐意拥有这样的对象:

{
    foo: "bar"
}

但是JSON规范更严格。它要求对象键用引号括起来,像这样:

{
    "foo": "bar"
}

eval执行JavaScript,因此它接受更宽松的语法。JSON.parse和大多数其他JSON实用程序将只接受严格的语法

首先将importHTML设置为ActiveX,而不是像设置其他变量importHTML2那样使用跨浏览器的方式。这是一个问题。

第二个问题是同步请求不会触发onreadystatechange事件

Person.importHTML.onreadystatechange = Person.handleDataArrived; <-- not going to work

改成只调用

方法
Person.handleDataArrived();
还有一个边注,从服务器返回的JSON对象不是有效的JSON。使用jsonlint.com查看错误。但是因为你使用的是eval()而不是JSON.js或JSON.parse(),你可以摆脱它。