Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.06.2010, 02:08
Новичок на форуме
Отправить личное сообщение для RiZoR Посмотреть профиль Найти все сообщения от RiZoR
 
Регистрация: 03.06.2010
Сообщений: 5

Помогите с readyState
Всем доброй ночи!

Помогите пожалуйста решить проблему.
Почему при выполнении данного кода браузер не видит readyState при выполнении функции this.xmlhttp.onreadystatechange. Хотя вне этой функции он без проблем выдает значение readyState.

Как решить данную проблему?

Заранее спасибо!

function ajax() {
    this.xmlhttp;
    try {
        this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try {
            this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (E) {
            this.xmlhttp = false;
        }
    }
    if (!this.xmlhttp && typeof XMLHttpRequest!='undefined') {
        this.xmlhttp = new XMLHttpRequest();
    }
}

ajax.prototype.send = function() {
    alert(this.xmlhttp.readyState); 
    this.xmlhttp.open('GET', 'ajax.php', true);
    this.xmlhttp.onreadystatechange = function() {
        if(this.xmlhttp.readyState == 4) {
            if(this.xmlhttp.status == 200) {
                alert(this.xmlhttp.responseText);
            }
        }
    };
    this.xmlhttp.send(null);
}

var my = new ajax();
my.send();
Ответить с цитированием
  #2 (permalink)  
Старый 03.06.2010, 08:24
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

потому что this в моменты выполнения this.xmlhttp.onreadystatechange указывает на window
сохраните ссылку на this.xmlhttp в отдельную переменную, получив замыкание

http://javascript.ru/tutorial/object/thiskeyword
http://javascript.ru/basic/closure
Ответить с цитированием
  #3 (permalink)  
Старый 03.06.2010, 10:45
Новичок на форуме
Отправить личное сообщение для RiZoR Посмотреть профиль Найти все сообщения от RiZoR
 
Регистрация: 03.06.2010
Сообщений: 5

Спасибо большое.
Ответить с цитированием
  #4 (permalink)  
Старый 03.06.2010, 15:35
Новичок на форуме
Отправить личное сообщение для RiZoR Посмотреть профиль Найти все сообщения от RiZoR
 
Регистрация: 03.06.2010
Сообщений: 5

/*
*/               
function ajax() {
    this.xmlhttp;
    try {
        this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try {
            this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (E) {
            this.xmlhttp = false;
        }
    }
    if (!this.xmlhttp && typeof XMLHttpRequest!='undefined') {
        this.xmlhttp = new XMLHttpRequest();
    }  
}

ajax.prototype.send = function() {       
    var x = this.xmlhttp;
    x.open('GET', 'ajax.php', true);
    x.onreadystatechange = function() {
        if(x.readyState == 4) {
            if(x.status == 200) {
                alert(x.responseText);
            }
        }
    };
    x.send(null);
}


Как я понимаю - это верное решение?
Но просто я так и не понял, почему он не видит переменную xmlhttp из внутренней функции?

Если говорить просто, то замыкание - это внутренняя функция. Ведь javascript разрешает создавать функции по ходу выполнения скрипта. И эти функции имеют доступ к переменным внешней функции. (c) javascript.ru

Объясните пожалуйста.
Ответить с цитированием
  #5 (permalink)  
Старый 03.06.2010, 15:47
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от RiZoR
Как я понимаю - это верное решение?
да
разве не работает?
выложите пример на хостинге
Ответить с цитированием
  #6 (permalink)  
Старый 03.06.2010, 15:54
Новичок на форуме
Отправить личное сообщение для RiZoR Посмотреть профиль Найти все сообщения от RiZoR
 
Регистрация: 03.06.2010
Сообщений: 5

Да спасибо все работает.

Просто не могу понять, почему во время выполнения внутренней функции, this указывает на window, а не на объект в котором это функция создана.
Ответить с цитированием
  #7 (permalink)  
Старый 03.06.2010, 16:02
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

а с чего бы ей указывать на него?
вы судя по всему путаете scope с this
переменный в sсope переносятся от внешней ф-ции ко внутренней.
но, this - не является такой обычной перменной.
его значение зависит от того, как была вызвана функция, а не от того, как создана

прочитайте еще раз внимательно статью об объекте this
Ответить с цитированием
  #8 (permalink)  
Старый 03.06.2010, 16:05
Новичок на форуме
Отправить личное сообщение для RiZoR Посмотреть профиль Найти все сообщения от RiZoR
 
Регистрация: 03.06.2010
Сообщений: 5

Да вообщем разобрался.

Спасибо еще раз Вам!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите новичку с выпадающим списком interest Элементы интерфейса 5 19.05.2010 13:15
Люди, ПОМОГИТЕ! Bel666 jQuery 11 27.04.2010 15:38
помогите задать переменную в js bsgroupua Общие вопросы Javascript 3 01.02.2010 18:28
Помогите разобраться с галереей IMAGIN yana_studio Общие вопросы Javascript 4 12.12.2009 17:24
помогите задать селектор! mkrylov jQuery 2 28.06.2009 20:34