更新到 jQuery 1.9.1 后 browser.msie 错误

Posted

技术标签:

【中文标题】更新到 jQuery 1.9.1 后 browser.msie 错误【英文标题】:browser.msie error after update to jQuery 1.9.1 【发布时间】:2013-01-31 06:34:52 【问题描述】:

我使用以下脚本片段:

if ($.browser.msie && $.browser.version < 9) 
   extra = "?" + Math.floor(Math.random() * 3000);

它适用于 jQuery 1.8.3

现在我将 jQuery 更新到新版本 1.9.1 以使用新脚本。 现在我收到以下错误:

TypeError: 无法读取未定义的属性“msie”

我阅读了新 jQuery 版本的更改日志,但应该没有任何改变 与 msie

任何已知的错误、提示或建议?

【问题讨论】:

$.browser 在 1.9 中被删除:jquery.com/upgrade-guide/1.9/#jquery-browser-removed 如果你得到一个类似'Cannot read property 'msie' of undefined'的错误,看看它说的是undefined,这将是unreadable property的父级 有一个非 jQuery 解决方案,考虑到最近版本的 IE 有 userAgent 值并没有明确表示它是 IE:***.com/a/21712356/2067690 【参考方案1】:

$.browser 在 1.3 版中已弃用并在 1.9 版中删除

您可以通过查看documentation 来验证这一点。

【讨论】:

我正在使用带有 $.browser.msie 的插件,这是否可以接受只是防止错误?: $.browser= msie: ( navigator.appName == 'Microsoft Internet Explorer') ? true : false // 这当然没有考虑其他可能性,但似乎修复了错误。 很好的解决方法(在我的情况下,我没有其他选择,但使用了解决方法)- 对我来说很好 这是一个不错的解决方法,但在 IE11 上会失败,在 IE11 navigator.appName 是 'Netscape',而不是 'Microsoft Internet Explorer' 是的,显然它已经消失了。告诉人们使用 RTFM 并不是一个有用的答案。 这对提问者来说并不明显,因此很有帮助。【参考方案2】:

jQuery.browser 选项早先已弃用,并在 1.9 版本中与许多其他已弃用的项目(如 .live)一起删除。

对于想要升级到 1.9 但仍想支持这些功能的项目和外部库,jQuery 暂时发布了迁移插件。

如果您需要向后兼容,您可以使用migration plugin。

【讨论】:

似乎 jQuery 正在成为英国媒体报道。 膨胀软件?它实际上是想反其道而行之。【参考方案3】:

由于 $.browser 已被弃用,这里有一个替代解决方案:

/**
 * Returns the version of Internet Explorer or a -1
 * (indicating the use of another browser).
 */
function getInternetExplorerVersion()

    var rv = -1; // Return value assumes failure.

    if (navigator.appName == 'Microsoft Internet Explorer')
    
        var ua = navigator.userAgent;
        var re  = new RegExp("MSIE ([0-9]1,[\.0-9]0,)");
        if (re.exec(ua) != null)
            rv = parseFloat( RegExp.$1 );
    

    return rv;


function checkVersion()

    var msg = "You're not using Internet Explorer.";
    var ver = getInternetExplorerVersion();

    if ( ver > -1 )
    
        if ( ver >= 8.0 ) 
            msg = "You're using a recent copy of Internet Explorer."
        else
            msg = "You should upgrade your copy of Internet Explorer.";
    

    alert( msg );

Source

然而,它被弃用的原因是 jQuery 希望你使用 feature detection 代替。

一个例子:

$("p").html("This frame uses the W3C box model: <span>" +
        jQuery.support.boxModel + "</span>");

最后但同样重要的是,检查 IE 版本的最可靠方法:

// ----------------------------------------------------------
// A short snippet for detecting versions of IE in javascript
// without resorting to user-agent sniffing
// ----------------------------------------------------------
// If you're not in IE (or IE version is less than 5) then:
//     ie === undefined
// If you're in IE (>=5) then you can determine which version:
//     ie === 7; // IE7
// Thus, to detect IE:
//     if (ie) 
// And to detect the version:
//     ie === 6 // IE6
//     ie > 7 // IE8, IE9 ...
//     ie < 9 // Anything less than IE9
// ----------------------------------------------------------

// UPDATE: Now using Live NodeList idea from @jdalton

var ie = (function()

    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');

    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );

    return v > 4 ? v : undef;

());

【讨论】:

您节省了大量时间。谢谢;) 最后一个函数返回未定义【参考方案4】:

你可以使用:

var MSIE = jQuery.support.leadingWhitespace; // This property is not supported by ie 6-8

$(document).ready(function()

if (MSIE)
    if (navigator.vendor == 'Apple Computer, Inc.')
        // some code for this navigator
     else 
       // some code for others browsers
    

 else 
    // default code

);

【讨论】:

在 IE8 浏览器模式下不支持 IE7。【参考方案5】:

在您的 jQuery 库中包含 jQuery migration plugin。

【讨论】:

【参考方案6】:

您可以通过这种方式检测IE浏览器。

(navigator.userAgent.toLowerCase().indexOf('msie 6') != -1)

你可以在这个网址上获得参考:jquery.browser.msie Alternative

【讨论】:

【参考方案7】:

对于简单的 IE 检测我倾向于使用:

(/msie|trident/i).test(navigator.userAgent)

访问 Microsoft Developer Network 了解 IE 用户代理: http://msdn.microsoft.com/library/ms537503.aspx

【讨论】:

【参考方案8】:

使用这个:

if (navigator.userAgent.match("MSIE"))

【讨论】:

【参考方案9】:

更新!新插件的完整答案大修!

以下插件已在所有主流浏览器中进行了测试。它使用传统的userAgent 字符串来重新装备jQuery.browser 仅当您使用 jQuery 1.9 或更高版本时

它具有传统的jQuery.browser.msie 类型属性以及一些新属性,包括一个.mobile 属性,用于帮助确定用户是否在移动设备上。

注意:这不是功能测试的合适替代品。如果您希望在特定设备上支持特定功能,最好还是使用传统的功能测试

/**	jQuery.browser
 *	@author	J.D. McKinstry (2014)
 *	@description	Made to replicate older jQuery.browser command in jQuery versions 1.9+
 *	@see http://jsfiddle.net/SpYk3/wsqfbe4s/
 *
 *	@extends	jQuery
 *	@namespace	jQuery.browser
 *	@example	jQuery.browser.browser == 'browserNameInLowerCase'
 *	@example	jQuery.browser.version
 *	@example	jQuery.browser.mobile	@returns	BOOLEAN
 *	@example	jQuery.browser['browserNameInLowerCase']
 *	@example	jQuery.browser.chrome	@returns	BOOLEAN
 *	@example	jQuery.browser.safari	@returns	BOOLEAN
 *	@example	jQuery.browser.opera	@returns	BOOLEAN
 *	@example	jQuery.browser.msie	@returns	BOOLEAN
 *	@example	jQuery.browser.mozilla	@returns	BOOLEAN
 *	@example	jQuery.browser.webkit	@returns	BOOLEAN
 *	@example	jQuery.browser.ua	@returns	navigator.userAgent String
 */
;;(function($)var a=$.fn.jquery.split("."),b;for(b in a)a[b]=parseInt(a[b]);if(!$.browser&&(1<a[0]||9<=a[1]))a=browser:void 0,version:void 0,mobile:!1;navigator&&navigator.userAgent&&(a.ua=navigator.userAgent,a.webkit=/WebKit/i.test(a.ua),a.browserArray="MSIE Chrome Opera Kindle Silk BlackBerry PlayBook android Safari Mozilla Nokia".split(" "),/Sony[^ ]*/i.test(a.ua)?a.mobile="Sony":/RIM Tablet/i.test(a.ua)?a.mobile="RIM Tablet":/BlackBerry/i.test(a.ua)?a.mobile="BlackBerry":/iPhone/i.test(a.ua)?
a.mobile="iPhone":/iPad/i.test(a.ua)?a.mobile="iPad":/iPod/i.test(a.ua)?a.mobile="iPod":/Opera Mini/i.test(a.ua)?a.mobile="Opera Mini":/IEMobile/i.test(a.ua)?a.mobile="IEMobile":/BB[0-9]1,; Touch/i.test(a.ua)?a.mobile="BlackBerry":/Nokia/i.test(a.ua)?a.mobile="Nokia":/Android/i.test(a.ua)&&(a.mobile="Android"),/MSIE|Trident/i.test(a.ua)?(a.browser="MSIE",a.version=/MSIE/i.test(navigator.userAgent)&&0<parseFloat(a.ua.split("MSIE")[1].match(/[0-9\.]1,/)[0])?parseFloat(a.ua.split("MSIE")[1].match(/[0-9\.]1,/)[0]):
"Edge",/Trident/i.test(a.ua)&&/rv:([0-9]1,[\.0-9]0,)/.test(a.ua)&&(a.version=parseFloat(a.ua.match(/rv:([0-9]1,[\.0-9]0,)/)[1].match(/[0-9\.]1,/)[0]))):/Chrome/.test(a.ua)?(a.browser="Chrome",a.version=parseFloat(a.ua.split("Chrome/")[1].split("Safari")[0].match(/[0-9\.]1,/)[0])):/Opera/.test(a.ua)?(a.browser="Opera",a.version=parseFloat(a.ua.split("Version/")[1].match(/[0-9\.]1,/)[0])):/Kindle|Silk|KFTT|KFOT|KFJWA|KFJWI|KFSOWI|KFTHWA|KFTHWI|KFAPWA|KFAPWI/i.test(a.ua)?(a.mobile="Kindle",
/Silk/i.test(a.ua)?(a.browser="Silk",a.version=parseFloat(a.ua.split("Silk/")[1].split("Safari")[0].match(/[0-9\.]1,/)[0])):/Kindle/i.test(a.ua)&&/Version/i.test(a.ua)&&(a.browser="Kindle",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].match(/[0-9\.]1,/)[0]))):/BlackBerry/.test(a.ua)?(a.browser="BlackBerry",a.version=parseFloat(a.ua.split("/")[1].match(/[0-9\.]1,/)[0])):/PlayBook/.test(a.ua)?(a.browser="PlayBook",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].match(/[0-9\.]1,/)[0])):
/BB[0-9]1,; Touch/.test(a.ua)?(a.browser="Blackberry",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].match(/[0-9\.]1,/)[0])):/Android/.test(a.ua)?(a.browser="Android",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].match(/[0-9\.]1,/)[0])):/Safari/.test(a.ua)?(a.browser="Safari",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].match(/[0-9\.]1,/)[0])):/Firefox/.test(a.ua)?(a.browser="Mozilla",a.version=parseFloat(a.ua.split("Firefox/")[1].match(/[0-9\.]1,/)[0])):
/Nokia/.test(a.ua)&&(a.browser="Nokia",a.version=parseFloat(a.ua.split("Browser")[1].match(/[0-9\.]1,/)[0])));if(a.browser)for(var c in a.browserArray)a[a.browserArray[c].toLowerCase()]=a.browser==a.browserArray[c];$.extend(!0,$.browser=,a))(jQuery);
/* - - - - - - - - - - - - - - - - - - - */

var b = $.browser;
console.log($.browser);    //    see console, working example of jQuery Plugin
console.log($.browser.chrome);

for (var x in b) 
    if (x != 'init')
        $('<tr />').append(
            $('<th />',  text: x ),
            $('<td />',  text: b[x] )
        ).appendTo($('table'));
table  border-collapse: collapse; 
th, td  border: 1px solid; padding: .25em .5em; vertical-align: top; 
th  text-align: right; 

textarea  height: 500px; width: 100%; 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table></table>

【讨论】:

@micnic 它在我的家庭服务器上未缩小,并将在不久的将来出现在网站上。我现在在上班,你有没有发现什么问题? 是的,我发现了一个问题,它检测到 IE9 和 IE10 版本为 9.06 和 10.06(IE11 可以) @micnic 是的,找到了问题。很容易修复。是我以前使用的.replace,而不是我新的,更好地使用.match。试一试!我刚刚将它 c&p'd 到 EPPro 并进行了全文替换。所以它应该贯穿整个事情【参考方案10】:

您可以简单地添加以下内容(从迁移脚本中提取),而不是添加整个迁移脚本

$.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"
    ;
;

然后像这样使用它

$.uaMatch(navigator.userAgent)

【讨论】:

【参考方案11】:

我也有这个问题。我们使用了两个版本的 Jquery(1.11.3 和 1.8.3),其中一个版本导致了这个问题。我发现了一个适用于两个版本的 lightbox_me.js 版本:

http://buckwilson.me/lightboxme/

这只是一个旧文件的简单替换。

【讨论】:

以上是关于更新到 jQuery 1.9.1 后 browser.msie 错误的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 不适用于 jquery 库 1.9.1

使用 jquery.dataTables 从 observableArray 中删除项目后 UI 不更新

jquery datatables更新数据到服务器,更新完成后,修改页面上的信息

从 jQuery 1.9.1 迁移到 1.10.1 导致错误:对象没有方法

Jquery 1.12.4 更新后点击顶部下拉菜单打开

chrome 更新后,jQuery ajax 调用无法从网页解码为 utf-8 字符集到 Chrome 扩展中