Большинство ваших обратных вызовов написаны так:
$('#content').load(toLoad,'',showNewContent())
Который говорит вызвать showNewContent и передать его возвращаемое значение в jQuery.
Вы имеете в виду:
$('#content').load(toLoad, '', showNewContent);
Но у вас также есть потенциальная проблема:
}else{
...
$('#content').fadeOut('slow',loadContent);
...
function loadContent() {
На самом деле не разрешено помещать оператор function
внутри else
или любого другого блока, отличного от другой функции. Это связано с тем, что магия оператора function
, позволяющая использовать функцию в приведенном выше коде, где вы определяете ее, может работать только в том случае, если определение функции зафиксировано до запуска функции. Этого не может быть, если определение находится внутри условного блока.
Как обычно, с JavaScript, вместо того, чтобы сообщать вам об ошибке, браузеры позволят вам избежать неприятностей, но с непоследовательными и странными результатами. Вот явно парадоксальный тестовый пример:
x();
var isgood= Math.random()*2>=1;
if (isgood) {
function x() {
alert('Good!');
}
} else {
function x() {
alert('Bad!');
}
}
Этот пример кода пытается вызвать функцию, которая зависит от результата броска монеты до того, как это событие действительно произошло. Это должна быть синтаксическая ошибка, просто чтобы сказать это, но каждый браузер позволяет это. Mozilla, по крайней мере, оставляет x
, удерживая undefined
, до тех пор, пока не будет достигнут оператор функции, поэтому начальный x()
вызовет ошибку. В IE, Webkit и Opera, однако, второе function
утверждение «выигрывает» и всегда выдает предупреждение «Плохо!». Плохие браузеры!
Чтобы избежать этой проблемы, используйте встроенные выражения функций вместо операторов функций каждый раз, когда вам нужна функция, определение которой изменяется. Хотя в этом случае вы можете обойти проблему затухания, просто используя speed
из 0 для IE, чтобы мгновенно сделать его обратным вызовом, что делает все это намного проще:
$('#content2 a').click(function() {
var speed= $.browser.msie? 0 : 'slow';
$('#content').fadeOut(speed, function() {
$('#content').load($(this).attr('href')+' #content', '', function() {
$('#content').fadeIn(speed);
});
});
});