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

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments