Javascript 如何在我的对象中获取跨浏览器ajax引用
我有一个返回此数据的服务器端文件Javascript 如何在我的对象中获取跨浏览器ajax引用,javascript,ajax,oop,object,Javascript,Ajax,Oop,Object,我有一个返回此数据的服务器端文件 { 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:'',
{
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();
{
foo: "bar"
}
这很好,但仅在IE中工作,因为activex引用了xmlHTTP。每次我试图让importHTML变量调用this.getXmlRequestObj或Person.getXmlRequestObj时,它都不起作用……我该怎么做 首先,将
importHTML
设置为ActiveX,而不是像对另一个变量importHTML2
那样设置跨浏览器方式。这将是一个问题
第二个问题是同步请求不会触发onreadystatechange
事件
Person.importHTML.onreadystatechange = Person.handleDataArrived; <-- not going to work
另请注意,从服务器返回的JSON对象不是有效的JSON。用于查看错误。但是,由于您使用的是
eval()
而不是JSON.js或JSON.parse()
,因此您可以不受惩罚 您的问题是从未使用过getXmlRequestObj
。我猜你第一次尝试做的是
...
innerHTML: Person.getXmlRequestObj(),
...
但这不起作用,因为不能在对象自己的对象文字定义中引用对象的属性。相反,您可以创建一个一次性初始化函数,用于设置importHTML
,在对象定义之后立即调用该函数
var Person = {
...
initialize: function() {
Person.importHTML = Person.getXmlRequestObj();
}
...
}
Person.initialize();
编辑:
您的JSON没有带引号的键。JavaScript非常乐意拥有这样的对象:
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();
{
foo: "bar"
}
但是JSON规范更严格。它要求引用对象键,如下所示:
{
"foo": "bar"
}
eval
执行JavaScript,因此它接受更宽松的语法JSON.parse
和大多数其他JSON实用程序只接受严格的语法。哎呀,我把函数也弄得一团糟,它过去常说returnnewXMLHttpRequest();等等……哦,还有什么我在这里做的蠢事吗?你可以使用问题底部的“编辑”链接来更正你的代码。把你的JSON放进去,看看错误。创建XMLHttpRequest的方式很奇怪。您是否考虑过使用跨浏览器ajax库,例如jQuery?这非常有效。。。我去了jsonlint.com,试图让它开心,但没有成功。我的JSON有什么问题吗?@KrullWarKing我用一个简短的JSON解释编辑了我的答案。如果您还有更多问题,请随时打开有关堆栈溢出的新问题。