2009-11-30 65 views
0

由於IE無法淡出透明PNG的我已決定改變我的功能,只需顯示PNG的,如果用戶使用IE瀏覽器,但淡入淡出,如果他們正在使用任何其他瀏覽器。下面的函數在IE中正常工作,並做我期望的功能,但在任何其他瀏覽器,即Firefox,Safari它什麼也不做,我是否缺少某些東西或者是否有語法錯誤?jQuery瀏覽器檢測似乎沒有工作

$('#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; 

}; 

}); 
+0

確定的其他功能獲取調用? – Broam 2009-11-30 15:06:03

+0

是的,因爲它在IE中工作,並加載外部內容罰款 – 2009-11-30 15:07:34

回答

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聲明'勝出',並且它總是提醒「壞!」。糟糕的瀏覽器!

無論何時需要定義更改的函數,都可以通過使用內聯函數表達式而不是函數語句來避免此問題。雖然在這種情況下,你可以得到周圍的褪色問題,只要使用0 speed 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); 
     }); 
    }); 
}); 
+0

所以你是說我應該把我的功能從條件語句,並把獨立的條件進入每個函數,以確定什麼該功能呢? – 2009-11-30 15:33:15

+0

這是一種方法,是的。或者看看增加的選擇。 – bobince 2009-11-30 15:40:44

+0

謝謝你這樣做 – 2009-11-30 15:44:19

1

也許你應該添加';'在行末:

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

兩個定義中的loadContent()

+0

歡呼的語法改正,但問題仍然存在 – 2009-11-30 15:28:00