2010-12-21 13 views
19

Czy istnieje dobry sposób na wykrycie, czy przeglądarka użytkownika jest programem Internet Explorer za pomocą jQuery?wykrywanie przeglądarki jQuery?

Mam problem z grafiką PNG za pomocą IE i chcę zamienić je na GIF tylko wtedy, gdy użytkownik przegląda witrynę za pomocą IE.

+2

co ten problem masz z PNG? byłoby lepiej użyć php lub czegoś podobnego po stronie serwera do zamiany grafiki w zależności od typu przeglądarki. a) bardziej wiarygodne i b) będzie działać dla osób bez javascript. –

+0

@Thomas Clayson, W rzeczywistości nie ma żadnego niezawodnego sposobu na wykonanie tej strony serwera. –

+0

denerwujące niebieskie tło w ie6, mam pasiaste tło i chcę użyć png na górze, ponieważ GIF nie wyświetla się poprawnie – Dancer

Odpowiedz

21

Ty może użyciu $.browser tak, ale jest to zły pomysł, aby użyć wykrywanie przeglądarki:

if($.browser.msie) { /* IE */ } 

Lepszym rozwiązaniem na przykład byłby $.support który to jest detekcja z detekcją, podobną do następującej:

if(!$.support.opacity) { /* IE 6-8 */ } 

$.support.opacity jest fałszywe w przeglądarkach, które nie obsługują opacity w stylizacji (choć IE 7-8 uchwyt przezroczysty plik PNG, więc to nadal nie jest idealna, w zależności od tego, co jesteś po ... osobiście myśl, że dajesz użytkownikom IE 7/8 nieoptymalne doświadczenie).

Co należy naprawdę zrobić, to cel, który IE6 nie wsparcia przejrzyste PNG (bez filtra alfa), podobnie jak to:

<!--[if IE 6]> 
    <link rel="stylesheet" type="text/css" href="IE6ImageStyles.css"> 
<![endif]--> 
+0

Wiwaty za radę Nick, zgadzasz się, że lepiej jest celować w ie6. – Dancer

+4

muszą mieć wtyczkę jquery migrować do jquery> 1.9, aby to działało. ponieważ to podejście jest przestarzałe – Beta033

+0

Tak, to było odpowiednie jako zaakceptowana odpowiedź w tym samym czasie, ale już nie jest (To wina Jquery'ego, a nie Nicka). – MrBoJangles

0

Sprawdź funkcję $.browser.

Aby wykryć IE, można również i lepiej wybrać IE conditional comments.

Przykład:

<!--[if IE]> 
    Special instructions for IE here 
<![endif]--> 
+1

"Zalecamy, aby nie używać tej właściwości, spróbuj użyć funkcji wykrywania obiektów (patrz jQuery.support) .JQuery.browser może zostać przeniesiony do wtyczki w przyszłej wersji jQuery." – neoswf

0
<script> 
    jQuery.each(jQuery.browser, function(i, val) { 
     $("<div>" + i + " : <span>" + val + "</span>") 
       .appendTo(document.body); 
    });</script> 

$ Browser.msie
dla IE

+0

Dzięki Simer, myślę, że wybiorę tylko kierowanie na ie6. – Dancer

-1

Rozumiem, że to nie jest odpowiedź - ale nie mogę tego opublikować w komentarzu!

Jeśli zamierzasz używać javascript, ten kod rozwiązuje problem PNG na poziomie ie6. Nie używałem go zbyt wiele, ale afaik potrzebujesz przezroczystego obrazu gif o nazwie x.gif, który wykonuje resztę automatycznie.

// JavaScript Document 

var supersleight = function() { 

    var root = false; 
    var applyPositioning = true; 

    // Path to a transparent GIF image 
    var shim   = 'x.gif'; 

    // RegExp to match above GIF image name 
    var shim_pattern = /x\.gif$/i; 



    var fnLoadPngs = function() { 
     if (root) { 
      root = document.getElementById(root); 
     }else{ 
      root = document; 
     } 
     for (var i = root.all.length - 1, obj = null; (obj = root.all[i]); i--) { 
      // background pngs 
      if (obj.currentStyle.backgroundImage.match(/\.png/i) !== null) { 
       bg_fnFixPng(obj); 
      } 
      // image elements 
      if (obj.tagName=='IMG' && obj.src.match(/\.png$/i) !== null){ 
       el_fnFixPng(obj); 
      } 
      // apply position to 'active' elements 
      if (applyPositioning && (obj.tagName=='A' || obj.tagName=='INPUT') && obj.style.position === ''){ 
       obj.style.position = 'relative'; 
      } 
     } 
    }; 

    var bg_fnFixPng = function(obj) { 
     var mode = 'scale'; 
     var bg = obj.currentStyle.backgroundImage; 
     var src = bg.substring(5,bg.length-2); 
     if (obj.currentStyle.backgroundRepeat == 'no-repeat') { 
      mode = 'crop'; 
     } 
     obj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='" + mode + "')"; 
     obj.style.backgroundImage = 'url('+shim+')'; 
    }; 

    var el_fnFixPng = function(img) { 
     var src = img.src; 
     img.style.width = img.width + "px"; 
     img.style.height = img.height + "px"; 
     img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='scale')"; 
     img.src = shim; 
    }; 

    var addLoadEvent = function(func) { 
     var oldonload = window.onload; 
     if (typeof window.onload != 'function') { 
      window.onload = func; 
     } else { 
      window.onload = function() { 
       if (oldonload) { 
        oldonload(); 
       } 
       func(); 
      }; 
     } 
    }; 

    return { 
     init: function() { 
      addLoadEvent(fnLoadPngs); 
     }, 

     limitTo: function(el) { 
      root = el; 
     }, 

     run: function() { 
      fnLoadPngs(); 
     } 
    }; 
}(); 

// limit to part of the page ... pass an ID to limitTo: 
// supersleight.limitTo('header'); 

supersleight.init(); 
1
$.browser.webkit 
$.browser.safari 
$.browser.opera 
$.browser.msie 
$.browser.mozilla 

if ($.browser.msie) { 
     //do something 
} 
else if ($.browser.mozilla) { 
     //do something else 
} 

działa z jQuery 1.3

+1

"Zalecamy, aby nie używać tej właściwości, spróbuj użyć funkcji wykrywania obiektów (patrz jQuery.support) .JQuery.browser może zostać przeniesiony do wtyczki w przyszłej wersji jQuery." – neoswf

+1

również twoje '== true' jest zbędne. Samo wywołanie 'if ($ .browser.msie) {} również zadziałałoby. – Ortund

+0

To działa! Dzięki. – Nolesh

3

$ .browser została usunięta w 1,9 jak to teraz sugeruje wykrywanie cechą było preferowane przez $.Wsparcie

Powiązane problemy