Обнаружение браузера jQuery не работает - PullRequest
0 голосов
/ 30 ноября 2009

Из-за неспособности IE исчезать прозрачные PNG, я решил изменить свою функцию, чтобы просто показывать PNG, если пользователь использует IE, но чтобы затемнять их, если они используют любой другой браузер. Приведенная ниже функция прекрасно работает в IE и выполняет то, что я ожидаю, но в любом другом браузере, т.е. Firefox, Safari, она ничего не делает, я что-то упускаю или у меня есть синтаксическая ошибка?

    $('#content2 a').click(function(){

 if($.browser.msie){

        var toLoad = $(this).attr('href')+' #content';
        $('#content').show(loadContent);

        window.location.hash = $(this).attr('href').substr(0,$(this).attr('href').length-5);
        function loadContent() {
            $('#content').load(toLoad,'',showNewContent())
        }
        function showNewContent() {
            $('#content').show();
        }

        return false;

 }else{

        var toLoad = $(this).attr('href')+' #content';
        $('#content').fadeOut('slow',loadContent);
        $('#load').remove();
        $('#wrapper').append('<span id="load">LOADING...</span>');
        $('#load').fadeIn('slow');
        window.location.hash = $(this).attr('href').substr(0,$(this).attr('href').length-5);
        function loadContent() {
            $('#content').load(toLoad,'',showNewContent())
        }
        function showNewContent() {
            $('#content').fadeIn('slow',hideLoader());
        }
        function hideLoader() {
            $('#load').fadeOut('slow');
        }
        return false;

 };

});

Ответы [ 2 ]

3 голосов
/ 30 ноября 2009

Большинство ваших обратных вызовов написаны так:

$('#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);
        });
    });
});
1 голос
/ 30 ноября 2009

Может быть, вам стоит добавить ';' в конце строки:

$('#content').load(toLoad,'',showNewContent());

в обоих определениях loadContent().

...