Вы можете переопределить метод 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, чтобы извлечь важные биты, чтобы воссоздать эффект, не вызывая переполнение стека.