0

由于 IE 无法淡化透明 PNG,我决定更改我的功能,以便在用户使用 IE 时仅显示 PNG,但如果用户使用任何其他浏览器则淡化它们。下面的函数在 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;

 };

});
4

2 回答 2

3

你的大部分回调都是这样写的:

$('#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为 IE 使用 0 使其立即回调来解决褪色问题,这使得整个事情变得更加简单:

$('#content2 a').click(function() {
    var speed= $.browser.msie? 0 : 'slow';
    $('#content').fadeOut(speed, function() {
        $('#content').load($(this).attr('href')+' #content', '', function() {
            $('#content').fadeIn(speed);
        });
    });
});
于 2009-11-30T15:26:42.170 回答
1

也许你应该添加';' 在行尾:

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

在 的两个定义中loadContent()

于 2009-11-30T15:25:12.113 回答