Еще немножко дополнительного геморроя вносит то, что имеется зоопарк версий и [не]совместмостей, за которыми надо следить. Сегодня так и не смог победить следующий код. Делаем свой объект, одно из его свойств - XMLHttpRequest. Назначемсвойству onreadystatechange этого объекта значение метода своего объекта и получаем.. кукиш! Не меняется свойство XMLHttRequest, причем если приравнять свойство локальной переменной, то там все работает, при этомвсе параметры все равно задаются в члене объекта! Невероятно, но факт =\
http://pastebin.kolucci.ru/192 - форматированный код, под катом форматирование поломано, но зато храниться будет.
Как обойти такую фигню я нашел, но общее впечатление от кривизны остается. Если я неправ, то ткните ссылкой или словом мудрым :)
UPD: как показало гугление, в методе function () { } меняется значение переменной this, поэтому для обеспечения работоспособности можно пользоваться следующим способом:
var me = this;
this.httpRequest.onreadystatechange = function() { me.parseAlbumsXml();}
Просмотр внутренностей meebo.com подсказал еще один способ:
dojo.getText = function ()
{
var object = this.getXmlhttpObject ();
object.onreadystatechange = function () { ... }
}
что тоже весьма и весьма мудро, так как позволяет не мельтешить функциями, а для каждого конкретного запроса делать свой метод.
this.getXmlhttpObject (); - самописный метод возвращающий объект XMLHttpObject
function gallery()
{
var httpRequest = false;
}
var gal = new gallery();
gallery.prototype.initGallery = function()
{
if (window.XMLHttpRequest){
this.httpRequest = new XMLHttpRequest();
if (this.httpRequest.overrideMimeType)
this.httpRequest.overrideMimeType(‘text/x
}
else if (window.ActiveXObject){
try {
this.httpRequest = new ActiveXObject(“Msxml2.XMLHTTP”);
}
catch (e) {
try {
this.httpRequest = new ActiveXObject(“Microsoft.XMLHTTP”);
}
catch (e) {}
}
}
if(!this.httpRequest)
alert(“Unable to create ajax object!”);
}
gallery.prototype.parseAlbumsXml = function(request)
{
alert(request.status);
if (request.readyState == 4) {
if (request.status == 200) {
document.getElementById(“gals”).innerHTM
} else {
alert(‘There was a problem with the request.’);
}
}
else
alert(“I’m There!”);
}
gallery.prototype.getAlbums = function()
{
if(!this.httpRequest)
return;
var req = this.httpRequest;
// this.httpRequest.onreadystatechange = function (){ this.parseAlbumsXml(req); } //так не работает вообще
this.httpRequest.onreadystatechange = function()
{
alert(req.status); //здесь все отображается верно
if (this.httpRequest.readyState == 4) { //все по нулям
if (this.httpRequest.status == 200) { //все по нулям
document.getElementById(“gals”).innerHTM
} else {
alert(‘There was a problem with the request.’);
}
}
else
alert(“I’m There!”);
}
this.httpRequest.open(‘GET’, “albums.xml”, true);
this.httpRequest.send(‘’);
}