can3p (can3p) wrote,
can3p
can3p

  • Music:

про Javascript

Разбираюсь с темой по имени javascript. Язык крайне необычен и не позволяет многое из того, что доступно в “классических” языках.
Еще немножко дополнительного геморроя вносит то, что имеется зоопарк версий и [не]совместмостей, за которыми надо следить. Сегодня так и не смог победить следующий код. Делаем свой объект, одно из его свойств - 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/xml’);
}
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”).innerHTML = “Got It!”;
} 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”).innerHTML = “Got It!”;
} else {
alert(‘There was a problem with the request.’);
}
}
else
alert(“I’m There!”);
}

this.httpRequest.open(‘GET’, “albums.xml”, true);
this.httpRequest.send(‘’);
}
Tags: wtf
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments