Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.11.2013, 23:03
Новичок на форуме
Отправить личное сообщение для froosty Посмотреть профиль Найти все сообщения от froosty
 
Регистрация: 06.08.2012
Сообщений: 2

Проблема с наследованием в IE
Доброго времени суток. Есть 2 скрипта.

(function($){
    /**
     * Базовый класс для работы с Аякс запросами
     * В него включено также отображение загрузчика, сообщения об ошибка и "успехе"
     * @param object params {
     *                          ajax_path: '/admin/ajax/' - путь к аякс обработчику. Должен заканчиваться обязательно слешем,
     *                          ...
     *                      }
     */
    $.fn.BaseAjax = function(params){
        var me = this,
            default_params = {
                ajax_path : ''
            };
 
        me.params = $.extend(default_params, params);
 
        /**
         * Функция посылки запроса
         * @param  string method           имя метода в обработчике. Пример: method: 'get_something' (запрос пошлется на '/admin/ajax/get_something')
         * @param  object params           объект с отсылаемыми параметрами
         * @param  function success_function функция обработчик success
         */
        me.send_query = function(method, params, success_function){
            $.ajax({
                url: me.params.ajax_path+method,
                type: 'POST',
                dataType: 'json',
                data: params,
                success: success_function
            });
        };
 
        me.base_init = function(){
            me.put_loader();
            me.put_message_block();
        };
 
 
        /**
         * Функция добавляющая на страницу лоадер, если его нету.
         */
        me.put_loader = function(){
            if ($('.loader').length==0){
                var loader = '<div class="loader">'+
                                '<div class="loader_image">'+
                                '</div>'+
                            '</div>';
                $('body').append(loader);
            }
            me.params.loader = $('.loader');
        };
 
        
        me.show_loader = function(){
            me.set_loader_height();
            $(me.params.loader).show();
        };
 
 
        me.hide_loader = function(){
            $(me.params.loader).hide();
        };
 
        me.set_loader_height = function(){
            var height = document.height;
            $(me.params.loader).css('height', height+'px');
 
            var width = 128,
                left = (document.width - width) / 2;
 
            $('.loader_image', me.params.loader).css('left', left+'px');
 
        };
 
 
        /**
         * Функция добавляющая на страницу блок сообщения если его нету
         */
        me.put_message_block = function(){
            if ($('.ajax_message_block').length==0){
                var message_block = '<div class="ajax_message_block">'+
                                  '</div>';
                $('body').append(message_block);
            }
 
            me.params.message_block = $('.ajax_message_block');
        };
 
        me.show_error = function(message){
            $(me.params.message_block).removeClass('ajax_success_message').addClass('ajax_error_message');
 
            me.show_block(message);
        };
 
        me.show_success = function(message){
            $(me.params.message_block).removeClass('ajax_error_message').addClass('ajax_success_message');
 
            me.show_block(message);
        };
 
        me.show_block = function(message){
            $(me.params.message_block).html(message);
            var left_value = (document.width-$(me.params.message_block).width())/2;
            $(me.params.message_block).css({
                'left': left_value
            });
 
            $(me.params.message_block).fadeIn(400, function(){
                setTimeout(function(){
                    $(me.params.message_block).fadeOut(400);
                }, 2000);
            });
        };
 
        me.base_init();
 
        return this;
    };
 
})(jQuery);


И второй который наследуется от вышеуказанного

(function($){
 
    $.fn.ReviewsList = function(params){
 
        var me = this,
            default_params = {
                page: 1,
                ajax_path: '/reviews/ajax/'
            };
 
        this.__proto__ = new $.fn.BaseAjax;
 
        me.params = $.extend(me.params, default_params);
        me.params = $.extend(me.params, params);
 
 
        me.init = function(){
            me.params.object_id = $(me).data('object-id');
 
            me.get_list();
        };
 
 
        me.bind_navigation = function(){
            if ($('.pagination a', me).length>0){
                $('.pagination a', me).unbind('click');
 
                $('.pagination a', me).click(function(e){
                    e.preventDefault();
 
                    me.params.page = $(this).html();
                    me.get_list();
                });
            }
 
            if ($('.review_drop_down', me).length > 0){
                $('.review_drop_down', me).unbind('click');
                $('.review_drop_down', me).click(function(e){
                    e.preventDefault();
 
                    $(this).parent().hide();
                    $(this).parents('.review_container').find('.hidden_review_description').show();
                    $(this).parents('.review_container').find('table.small_raiting_review').show();
                });
            }
        };
 
 
        me.get_list = function(){
            me.show_loader();
            me.send_query('get_list', {
                page: me.params.page,
                object_id: me.params.object_id
            }, function(result){
                me.hide_loader();
 
                if (result==null){
                    me.show_error('При послыке запроса произошла ошибка. Попробуйте обновить страницу');
                    return;
                }
 
                if (result.status==true){
                    me.set_content(result.data);
                    me.bind_navigation();
                }
                else{
                    me.show_error(result.message);
                }
            })
        };
 
 
        me.set_content = function(content){
            $(me).html(content);
        };
 
        me.init();
    };
 
})(jQuery);


В IE 8 при загрузке страницы возникает ошибка при вызове me.show_loader(); в функции me.get_list, и остальных унаследованных функций тоже. Такое впечатление, что просто не наследуется вообще. Подскажите пожалуйста в чем проблема ну и какое решение есть этой проблемы? Заранее спасибо.

p.s. код не идеальный, я понимаю
Ответить с цитированием
  #2 (permalink)  
Старый 04.11.2013, 23:46
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

старые IE не поддерживают свойство __proto__. Оно считается нестандартным (в ES6 стандарте должны утвердить вроде бы).

В данном случае должно подойти
$.fn.BaseAjax.call(this);


Вобще, методы нужно выносить в прототип, а не создавать для каждого экземпляра (необоснованный перерасход памяти и вычислительных ресурсов).
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 06.11.2013, 22:36
Новичок на форуме
Отправить личное сообщение для froosty Посмотреть профиль Найти все сообщения от froosty
 
Регистрация: 06.08.2012
Сообщений: 2

danik.js,
Спасибо большое за ответ
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с радио кнопками px379 Общие вопросы Javascript 8 29.07.2013 09:30
Проблема с обработкой ескольких .hover() anocean jQuery 3 15.06.2012 22:43
Проблема с наследованием и this. lyapun Общие вопросы Javascript 1 06.11.2011 20:56
Проблема с Popup окном vovuslik jQuery 5 12.06.2010 16:12
Проблема с дизайном после отправки xmlhttprequest, Проблема с дизайном после отправки cyberx AJAX и COMET 3 01.05.2010 17:07