Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Переопределение метода базового класса (https://javascript.ru/forum/jquery/4336-pereopredelenie-metoda-bazovogo-klassa.html)

walash 14.07.2009 13:15

Не знаю, у меня прокатило и работает ;)
function ExtendFunctionality() {
        $.datepicker.constructor.prototype._updateDatepicker = function(inst) {
            
            // code from date picker

            ModifyDatePicker(); // OUR CHANGES
        }
    }


с _generateHTML тоже пробовал и тоже работает

walash 14.07.2009 13:21

персанальное спасибо x-yuri за:

var oldGenerateHTML = $.datepicker.constructor.prototype._generateHTML;
$.datepicker.constructor.prototype._generateHTML = function(){
    oldGenerateHTML.apply(this, arguments); 
    ...
}


50 строк гавнокода долой !

x-yuri 14.07.2009 14:20

Цитата:

Сообщение от e1f
Но тут маленькое но -- $.datepicker.constructor.prototype._generateHTML не существует

почему? Это фактически Datepicker.prototype._generateHTML, только без использования названия внутреннего класса

walash 14.07.2009 14:25

Поспешил радоваться, почти все методы datepicker'a имеют ссылки this, который адресуюстя на инстанс datepicker'a, а когда мы пишем так:

var oldGenerateHTML = $.datepicker.constructor.prototype._generateHTML;


то он в this разпазнает как window, а не $.datepicker

А когда код вбиваешь туда текстом, то почему то все ок

e1f 14.07.2009 14:34

x-yuri,
Да, все верно. Я смотрел у себя какую-то не ту версию Datepickera :)

x-yuri 14.07.2009 14:50

Цитата:

Сообщение от walash
то он в this разпазнает как window, а не $.datepicker

кто и где?

walash 14.07.2009 19:09

function ExtendFunctionality() {
        $.datepicker.constructor.prototype._updateDatepicker = function(inst) {
 
            // когда здесь пишется this, тогда он воспринимается как $.datepicker
 
            ModifyDatePicker(); // OUR CHANGES
        }
    }


при данном раскладе, this рассматривается как window и идет прямиком в код datepicker'a:
function ExtendFunctionality() {

            var oldUpdateDatepicker = $.datepicker.constructor.prototype._updateDatepicker;
            $.datepicker.constructor.prototype._updateDatepicker = function(inst) {
                oldUpdateDatepicker(inst);  //   когда начинает выполнятся код отсюда, то this это уже window
                ModifyDatePicker(); // OUR CHANGES                
            }
        }


Вот что валяется в _updateDatepicker:
/* Generate the date picker content. */
	_updateDatepicker: function(inst) {
		var dims = {width: inst.dpDiv.width() + 4,
			height: inst.dpDiv.height() + 4};
		var self = this;
		inst.dpDiv.empty().append(this._generateHTML(inst))   // первое место, где this уже не тот
			.find('iframe.ui-datepicker-cover').
				css({width: dims.width, height: dims.height})
			.end() . . .  // и т.д. и т.п.
. . . . . . . ..  .. .. . . .. .  .
. . . . . .. . .. . . . .. .
	
	}

e1f 14.07.2009 19:33

walash, Вам же x-yuri писал как надо:
вместо
oldUpdateDatepicker(inst)
используйте
oldGenerateHTML.apply(this, arguments)

walash 15.07.2009 17:05

Ребята, я вас люблю


Часовой пояс GMT +3, время: 12:38.