Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.01.2015, 22:15
Аспирант
Отправить личное сообщение для kilohertz_. Посмотреть профиль Найти все сообщения от kilohertz_.
 
Регистрация: 07.12.2014
Сообщений: 31

проблема с readyState
Ошибка: Uncaught TypeError: Cannot read property 'readyState' of undefined в строчке
if(this.xhr.readyState == 4) {


function ajax(callback) { //json object
	this.xhr;
	this.result = {"result":"empty"};
	
	this.send = function(addr, string, method, async){
		this.xhr = new XMLHttpRequest();
		this.xhr.open(method,addr,async);
		if(method == 'POST') this.xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		this.xhr.send(string);
		this.xhr.onreadystatechange = this.get;
	}
	
	this.get = function(){
		if(this.xhr.readyState == 4) {
			this.result = JSON.parse(this.xhr.responseText);
			if(this.result.status == 'complete') {
				if(!(callback === null)) {callback}
			}
			if(this.result.status == 'error') {
				return showMsg(1,this.result.error);
			}
		}
	}
	
}
Ответить с цитированием
  #2 (permalink)  
Старый 20.01.2015, 22:31
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

Это из-за того, что инициализация объекта происходит только при вызове метода send. Перенеси содержимое 6 строки на 2 строку.
Ответить с цитированием
  #3 (permalink)  
Старый 20.01.2015, 22:36
Аспирант
Отправить личное сообщение для kilohertz_. Посмотреть профиль Найти все сообщения от kilohertz_.
 
Регистрация: 07.12.2014
Сообщений: 31

Не помогло
И данные при этом с сервера загружаются ведь!
XHR finished loading: POST "http://***/index.php".
Ответить с цитированием
  #4 (permalink)  
Старый 20.01.2015, 22:51
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Привыкай к необычному поведению this в JavaScript. Кратко говоря - куда будет указывать this зависит от того, кто и как вызывает функцию, а не от того где и как она объявлена.


this.get.call('хрень') - и внутри метода this указывает не на экземпляр ajax, а на 'хрень'.

Примерно тоже самое у тебя сейчас и происходит:
Сообщение от kilohertz_.
this.xhr.onreadystatechange = this.get;
Тут ты дал объекту xhr ссылочку на некую функцию. Теперь объект, когда получит ответ от сервера, вызовет этот метод, причем установит в качестве this - себя любимого!

Сообщение от kilohertz_.
if(this.xhr.readyState == 4) {
Тут this указывает на xhr, у которого нет свойства xhr. Исправь на if (this.readyState ...)


Еще раз: метод не знает, чьим "методом" он является. И вообще, в js нет методов. Есть просто функции.

Можешь жестко задать this таким образом:

this.xhr.onreadystatechange = this.get.bind(this);

И метод заработает без изменений.

Функция bind возвращает функцию с жестко прописанным this.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 20.01.2015, 22:56
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

var ajax = new Ajax();
ajax.get() - так get будет вызван в контексте this, равном ajax.

var get  = ajax.get;

get() - а так this уже "потеряется" и будет тупо указывать на глобальный объект.

xhr.get = ajax.get;

xhr.get() - так this будет указывать на xhr. Что у тебя и происходит.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 20.01.2015, 22:56
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от danik.js
var ajax = new Ajax();
Вот кстати вкурил дружок почему констурторы надо с большой буквы называть? Бегом переименовывай )
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 21.01.2015, 19:32
Аспирант
Отправить личное сообщение для kilohertz_. Посмотреть профиль Найти все сообщения от kilohertz_.
 
Регистрация: 07.12.2014
Сообщений: 31

Спасибо! Буду переделывать/доделывать)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с радио кнопками px379 Общие вопросы Javascript 8 29.07.2013 09:30
Проблема с Popup окном vovuslik jQuery 5 12.06.2010 16:12
Проблема с дизайном после отправки xmlhttprequest, Проблема с дизайном после отправки cyberx AJAX и COMET 3 01.05.2010 17:07
Проблема с CSS COKOJIOB (X)HTML/CSS 5 04.08.2009 14:19
Проблема, в менюшке Большой джо Элементы интерфейса 0 12.07.2009 17:12