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保留を残すので、イニシャルはエラーを引き起こします。ただし、IE、Webkit、およびOperaでは、2番目のステートメントが「勝ち」であり、常に「Bad!」と警告します。悪いブラウザ!undefinedx()function

定義が変更される関数が必要なときはいつでも、関数ステートメントの代わりにインライン関数式を使用して、この問題を回避してください。この場合、speedIEに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 に答える