Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Проблема с объектом + JsHttpRequest (A2L)
Author Message
A2L
Участник форума



Joined: 04 May 2006
Posts: 21
Карма: 0
   поощрить/наказать


PostPosted: Sat May 05, 2007 5:40 pm (написано за 4 минуты 45 секунд)
   Post subject: Проблема с объектом + JsHttpRequest
Reply with quote

Все началось с темы forum.dklab.ru/js/other/ProblemaSObektom.html
Тот пример я переписал с использованием библиотеки prototype.js (prototype.conio.net/)
Теперь появилась новая проблема: не могу передать данные полученные из JsHttpRequest обратно в свой класс.
Код следующий:
Code (JavaScript): скопировать код в буфер обмена
var blockRate = Class.create();
blockRate.prototype = {
        initialize: function(blockrate, ratenamber, ratevalue) {
                this.block = $( blockrate );                                //rating block
                this.value = Math.floor(ratevalue) || 0;         //rating value
                this.ratenamber = ratenamber;                                 //number rating
                this.mouseOvers = new Array();
                this.mouseOuts = new Array();
                this.suffix = '';
                this.pics = new Array();
                this.pics = this.block.getElementsByTagName('img');

                if (this.value == 0) this.getValue();
                this.makeEv();
                this.show();
        },
       
        makeEv: function() {
                for (var i = 0, j = this.pics.length; i < j; i++) {
                        this.pics[i].number = i;
                        this.pics[i].style.cursor = 'pointer';
                        this.pics[i].title = i + 1;
                        this.pics[i].alt = i + 1;
                       
                        this.mouseOuts[i] = new Image();
                        this.mouseOuts[i].src = this.pics[i].src;
                       
                        this.mouseOvers[i] = new Image();
                        this.suffix = this.pics[i].src.substring(this.pics[i].src.lastIndexOf('.'));
                        this.mouseOvers[i].src = this.pics[i].src.substring(0, this.pics[i].src.lastIndexOf('.')) + "-lig" + this.suffix;

                        this.onmouseover = this.onmouseover.bindAsEventListener(this);
                        Event.observe(this.pics[i], "mouseover", this.onmouseover, false);
                       
                        this.onmouseout = this.onmouseout.bindAsEventListener(this);
                        Event.observe(this.pics[i], "mouseout", this.onmouseout, false);
                                               
                        this.vote = this.vote.bindAsEventListener(this);
                        Event.observe(this.pics[i], "click", this.vote, false);
                }
        },
       
        getValue: function() {
                JsHttpRequest.query(
                        '/function/rating.php',
                        {rate: this.ratenamber},
                        function(responseJS, responseText) {
                                this.value = responseJS.rating;
                        },
                        false
                );
               
        },
       
        show: function() {
                for(var j = 0; j < this.value; j++) this.pics[j].src = this.mouseOvers[j].src;
        },
       
        vote: function(event) {
                alert(['vote: ' + this.ratenamber, 'ball: ' + (Event.element(event).number + 1)]);
        },

        onmouseover: function(event) {
                var el = Event.element(event);
                for(var j = 0; j <= el.number; j++) this.pics[j].src = this.mouseOvers[j].src;
                for(var j = this.pics.length-1; j > el.number; j--) this.pics[j].src = this.mouseOuts[j].src;
        },

        onmouseout: function(event) {
                for(var j = 0; j < this.pics.length; j++) this.pics[j].src = this.mouseOuts[j].src;
                this.show();
        }
}
Строка this.value = responseJS.rating; выполняется неправильно, я подозреваю, что this в этой строке относится уже не к моему обекту.
Продовал делать так: blockRate.value = responseJS.rating; - эффект нулевой
Как это исправить?
Очень надеюсь на вашу помощь - сам уже второй день сижу над проблемой.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat May 05, 2007 8:00 pm (спустя 2 часа 20 минут; написано за 28 секунд)
   Post subject:
Reply with quote

A2L wrote:
эффект нулевой...
Ну а функция выполняется?
Back to top
View user's profile Send private message Send e-mail
A2L
Участник форума



Joined: 04 May 2006
Posts: 21
Карма: 0
   поощрить/наказать


PostPosted: Sat May 05, 2007 8:27 pm (спустя 26 минут; написано за 1 минуту 28 секунд)
   Post subject:
Reply with quote

AKS wrote:
Ну а функция выполняется?
Да, если написать
Code (JavaScript): скопировать код в буфер обмена
function(responseJS, responseText) {
   alert(responseJS.rating);
},
то все хорошо.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat May 05, 2007 8:38 pm (спустя 11 минут; написано за 1 минуту 24 секунды)
   Post subject:
Reply with quote

A2L
Значит и blockRate.value должно получить соответствующее значение. Где у Вас будет использоваться это значение? В функции show? Тогда вызывайте эту функцию после того, как будет получено новое значение.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Sun May 06, 2007 12:26 am (спустя 3 часа 48 минут; написано за 1 минуту 1 секунду)
   Post subject:
Reply with quote

A2L
Используйте замыкания - создайте переменную, скажем, th=this в начале getValue, и потом используйте th. Иначе, конечно, this будет относиться именно к той самой безымянной функции, которая вызывается после получения данных.
Back to top
View user's profile Send private message Send e-mail
A2L
Участник форума



Joined: 04 May 2006
Posts: 21
Карма: 0
   поощрить/наказать


PostPosted: Sun May 06, 2007 1:51 pm (спустя 13 часов 24 минуты; написано за 5 минут 21 секунду)
   Post subject:
Reply with quote

Юpий Насрeтдинов
Что-то мне не везет. )
Я ранее пробовал задать переменную self в конструкторе
Code (JavaScript): скопировать код в буфер обмена
var self = this;
И далее в JsHttpRequest работать с ней - у меня ничего не вышло.
Сейчас сделал, как предложили вы
Code (JavaScript): скопировать код в буфер обмена
getValue: function() {
        var th = this;
       
        JsHttpRequest.query(
                '/function/rating.php',
                {rate: this.ratenamber},
                function(responseJS, responseText) {
                        th.value = responseJS.rating;
                },
                false
        );
        this.value = th.value;
}
И опять ничего не работает ((((

Пробовал писать
Code (JavaScript): скопировать код в буфер обмена
var th = blockRate;
Тогда работает, но как-то странно - только после 4 создания объекта. ) Т.е. у меня на странице отображается сразу несколько рейтингов, первые 3 выполняются с ошибкой, а с 4-го присваивается полученное значение. Абсолютно все рейтинги одинаковые, значение выдается, тоже статично
Code (php): скопировать код в буфер обмена
$_RESULT = array (www.php.net/array)('rating' => 3);
Что может быть не так?
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sun May 06, 2007 2:18 pm (спустя 27 минут; написано за 2 минуты 27 секунд)
   Post subject:
Reply with quote

Когда увидел:
Quote:
var th = blockRate;
понял, что сам писал не то. blockRate - это ведь конструктор, поэтому это имя вообще не стоит вспоминать. Только так, как написал Юрий:
Code (JavaScript): скопировать код в буфер обмена
var th = this;
без
Code (JavaScript): скопировать код в буфер обмена
this.value = th.value;
в последней строке функции.
Back to top
View user's profile Send private message Send e-mail
A2L
Участник форума



Joined: 04 May 2006
Posts: 21
Карма: 0
   поощрить/наказать


PostPosted: Sun May 06, 2007 2:31 pm (спустя 13 минут; написано за 4 минуты 4 секунды)
   Post subject:
Reply with quote

AKS wrote:
Когда увидел:
Quote:
var th = blockRate;
понял, что сам писал не то. blockRate - это ведь конструктор, поэтому это имя вообще не стоит вспоминать. Только так, как написал Юрий:
Code (JavaScript): скопировать код в буфер обмена
var th = this;
без
Code (JavaScript): скопировать код в буфер обмена
this.value = th.value;
в последней строке функции.
Да, это я уже понял ))) Вроде работает, но все равно как-то странно...
Ладно, не буду надоедать. Постораюсь сам разобраться.
Вам и Юpию Насрeтдинову, большое спасибо, за помощь!
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML