Глобальная замена для fadeIn - ошибка IE, jQuery - PullRequest
0 голосов
/ 10 августа 2011

Есть ли способ сделать глобальную замену для эффекта fadeIn в jQuery, чтобы обойти проблему, когда исчезновение в прозрачном png в IE6-IE8 показывает искажение?

Что я имею в виду, яв данный момент есть что-то вроде этого:

$(whichCarousel).find('ul.display li:eq(' + aSpecimen + ')').fadeIn("fast");

Вместо того, чтобы проходить через каждую мою функцию, использующую .fadeIn, и делать операторы if / else, есть ли способ в jQuery глобально сказать:

if ($.browser.msie && $.browser.version.substr(0,1)<9) >> find ".fadeIn" and change to ".show();"` ?

1 Ответ

1 голос
/ 10 августа 2011

Вы можете переопределить метод show(), чтобы он выполнял fadeIn(), если это совместимый браузер, или вернуться к исходному show(), если это не так.Вот пример:

<button id="go">Try Me</button>
<div id="test" style="display: none">Your Content</div>

<script type="text/javascript">

(function($, oldMethod) {    
    $.fn.show = function() {
        if ($.browser.msie && $.browser.version.substr(0,1) < 9) {
            oldMethod.apply(this, arguments);   
        } else {
            $(this[0]).css("opacity",0);
            oldMethod.apply(this, arguments);
            $.fn.animate.apply($(this[0]), [{opacity:1}, {duration:1000}]);
        }
    };
})(jQuery, jQuery.fn.show);

$(function() {
    $('#go').click(function() {
        $('#test').show();
    });
});

</script>

Вы можете увидеть демонстрацию с this jsFiddle .Я тестировал в IE9 и Chrome 13 и, похоже, работал хорошо.

EDIT

Я только что понял, что это неэффективно.Он проверяет версию браузера на каждый вызов show().Вы могли бы сделать это вместо этого (не проверено):

(function($, oldMethod) {
    if (!($.browser.msie && $.browser.version.substr(0,1) < 9)) {
        $.fn.show = function() {
            $(this[0]).css("opacity",0);
            oldMethod.apply(this, arguments);
            $.fn.animate.apply($(this[0]), [{opacity:1}, {duration:1000}]);
        };
    }
})(jQuery, jQuery.fn.show);

Это так, что функция переопределяется только для браузеров не IE версии 9. Пример jsFiddle .Исходная функция show() может просто существовать.

Кроме того, причина этого блока:

$(this[0]).css("opacity",0);
oldMethod.apply(this, arguments);
$.fn.animate.apply($(this[0]), [{opacity:1}, {duration:1000}]);

в том, что fadeIn() вызывает show() в некоторый момент, и мы заканчиваемс переполнением стека из-за бесконечной рекурсии.Вызов .animate({opacity:"show"}) also call show () `, так что это тоже не сработало.Я копался в коде jQuery, чтобы извлечь важные биты, чтобы воссоздать эффект, не вызывая переполнение стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...