4

I am updating an old project that references $.browser.msie . Moving to jQuery 1.9 of course breaks this.

How can I rewrite this code to get the same boolean value without having to include jQuery Migrate?

The code is buried deep in an old javascript library we use that needs to determine if msie is running and then works on the knowledge. We'd rather not edit the javascript too much as it's brittle.

Ian Vink
  • 66,960
  • 104
  • 341
  • 555
  • this might help:http://stackoverflow.com/questions/14892095/browser-msie-error-after-update-to-jquery-1-9-1 – matpol Aug 16 '13 at 16:15
  • 3
    using feature detection, but you'll need to know if/what particular feature needs to be tested for (if any). I don't know if **all** quirks are feature detectable however – Russ Cam Aug 16 '13 at 16:15
  • 1
    What are you using it for? The "new way" is using feature detection so that you're not assuming that only IE/non IE can do something. IE10 isn't all bad at things that used to be pretty hairy in previous IE. – Joachim Isaksson Aug 16 '13 at 16:16
  • 1
    I'd like to echo the statements made so far, what exactly are you using `$.browser.msie` for? Also, why the stipulation "without jQuery Migrate"? Do you just need a way to do UA sniffing? That is a topic that's been well covered. – Wesley Murch Aug 16 '13 at 16:17
  • 1
    Rather than using $.browser to detect the current user agent and alter the page presentation based on which browser is running, it is a good practice to use feature detection. To make this process simpler, jQuery performs many such tests and sets properties of the jQuery.support object. http://api.jquery.com/jQuery.support/ – Fabi Aug 16 '13 at 16:18
  • Perhaps try posting up the snippet of code that depends on `$.browser.msie` and we might be able to help. Otherwise - just include migrate :) – rtpHarry Aug 16 '13 at 16:20
  • 4
    If the javascript is so brittle and resistant to change, why would you want to change your jquery version? – recursive Aug 16 '13 at 16:27
  • 1
    And why don't you want to use Migrate, when it's specifically made just for cases like you're describing? – JJJ Aug 16 '13 at 16:28

3 Answers3

8

You could consider including the relevant code from jQuery 1.8 (https://github.com/jquery/jquery/blob/1.8.3/src/deprecated.js:

(function() {
    var matched, browser;

    // Use of jQuery.browser is frowned upon.
    // More details: http://api.jquery.com/jQuery.browser
    // jQuery.uaMatch maintained for back-compat
    jQuery.uaMatch = function( ua ) {
        ua = ua.toLowerCase();

        var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
            /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
            /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
            /(msie) ([\w.]+)/.exec( ua ) ||
            ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
            [];

        return {
            browser: match[ 1 ] || "",
            version: match[ 2 ] || "0"
        };
    };

    matched = jQuery.uaMatch( navigator.userAgent );
    browser = {};

    if ( matched.browser ) {
        browser[ matched.browser ] = true;
        browser.version = matched.version;
    }

    // Chrome is Webkit, but Webkit is also Safari.
    if ( browser.chrome ) {
        browser.webkit = true;
    } else if ( browser.webkit ) {
        browser.safari = true;
    }

    jQuery.browser = browser;
})();
Trevor Dixon
  • 23,216
  • 12
  • 72
  • 109
2

The jQuery.browser() method has been deprecated since jQuery 1.3 and is removed in 1.9. If needed, it is available as part of the jQuery Migrate plugin.

See also jQuery Core 1.9 Upgrade Guide

Samuel Liew
  • 76,741
  • 107
  • 159
  • 260
0

If you really need to do this. There is a hacky, ugly and quite painless way: Put this into your HTML. It will set $.browser.msie for you.

Detect IE except IE10:

<!--[if IE]>
    <script type="text/javascript">
        $(function(){
            if(!$.browser && !$.browser.msie) { $.browser = {}; } 
            else { return; }
            $.browser.msie = true;
        });
    </script>
<![endif]-->


Detect all IE including IE10

<!--[if IE]>
    <script type="text/javascript">
        $(function(){
            $('body').addClass('msie');
        });
    </script>
<![endif]-->
<script type="text/javascript">
    $(function(){
        var $body = $('body');
        // use this only if you need to detect IE10
        if (Function('/*@cc_on return document.documentMode===10@*/')()){
            $body.addClass('msie');
        }

        if($body.hasClass('msie')) {
            if(!$.browser && !$.browser.msie) { $.browser = {}; } 
            else { return; }
            $.browser.msie = true;
        }
    });
</script>
nirazul
  • 3,928
  • 4
  • 26
  • 46