jQuery.browser:Javascript 未捕获的类型错误

Posted

技术标签:

【中文标题】jQuery.browser:Javascript 未捕获的类型错误【英文标题】:jQuery.browser: Javascript Uncaught TypeError 【发布时间】:2012-12-29 13:24:49 【问题描述】:

我遇到了一个错误,导致我的页面无法加载。

未捕获的类型错误:无法读取未定义的属性“msie”

控制台中的错误参考这段代码:

if (jQuery.browser.msie)
    extra_px += 3;
                                                   // Fix Link Clicking on IE 7 and below versions
if (jQuery.browser.msie && Number($.browser.version) < 8) 
    span_text.css('cursor', 'pointer');
    span_text.click(function() 
        window.location = menu_item.parent().attr("href");
    );

奇怪的是,它突然发生了,我什么都没改变。作为参考,我使用的是 Wordpress。

【问题讨论】:

尝试是否通过 typeof(jQuery.browser.msie) 定义值!='undefined 同样的错误 = typeof(jQuery.browser.msie)!='undefined' 你确定 jQuery 已经加载了吗? console.log( typeof jQuery ); 的输出是什么? Cannot read property 'msie' of undefined 表示jQuery.browser 未定义。 @Jan:如果jQueryundefined,您将收到错误Cannot read property 'browser' of undefined。无论如何,VisioN 找到了答案。 【参考方案1】:

jQuery.browser 在 1.3 版本中被弃用,最后在 removed 1.9.

source

正如您在current version of jQuery 中看到的,不再有$.browser 属性。

很可能它已移至插件,如docs 所述。

因此,如果您使用最新版本的 jQuery,undefined 错误是可以理解的。

【讨论】:

OP 不应包含最新版本,而应包含特定版本 @ExplosionPills 但他可能会这样做 @JanDvorak 他做到了;我查看了他网站的代码。他通过 wordpress 包含 1.8.3,但随后他还包含一个指向最新版本的 jQuery cdn 的链接 1.8.3 文件破坏了东西,所以我必须包含最新的东西才能工作..我仍然没有找到开发人员加载文件的位置。 @JanDvorak 无论出于何种原因,他们将 CDN 更新为指向 1.9,但其他 jQuery 网站没有更新(文档没有更新,jquery.com 仍然说“当前版本”是 1.8 .3).【参考方案2】:

是的,jQuery.browser 在旧版本中已被弃用并在 1.9 中被删除。所以现在在旧版本中,如果这样编写代码

isIE6 = jQuery.browser.msie && jQuery.browser.version < 7 && !window.XMLHttpRequest,

将被替换为

isIE6 = navigator.userAgent.match(/msie [6]/i) && !window.XMLHttpRequest,

干杯!!!

【讨论】:

【参考方案3】:

正如VisioN 的answer 所提到的,这已在 jQuery 1.9 中被删除,并且似乎不会很快恢复。

如果您希望使用插件将$.browser 重新添加到您的 jQuery 库中,只需将以下代码复制并粘贴到文件中,然后将脚本链接到 jQuery 之后的任何位置:

;;(function($)if(!$.browser&&1.9<=parseFloat($.fn.jquery))var 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].replace(/[^0-9\.]/g,""))?parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,"")):"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].replace(/[^0-9\.]/g,"")))):/Chrome/.test(a.ua)?(a.browser="Chrome",a.version=parseFloat(a.ua.split("Chrome/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Opera/.test(a.ua)?(a.browser="Opera",a.version=parseFloat(a.ua.split("Version/")[1].replace(/[^0-9\.]/g,""))):/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].replace(/[^0-9\.]/g,""))):/Kindle/i.test(a.ua)&&/Version/i.test(a.ua)&&(a.browser="Kindle",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,"")))):/BlackBerry/.test(a.ua)?(a.browser="BlackBerry",a.version=parseFloat(a.ua.split("/")[1].replace(/[^0-9\.]/g,""))):/PlayBook/.test(a.ua)?(a.browser="PlayBook",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/BB[0-9]1,; Touch/.test(a.ua)?(a.browser="Blackberry",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Android/.test(a.ua)?(a.browser="Android",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Safari/.test(a.ua)?(a.browser="Safari",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Firefox/.test(a.ua)?(a.browser="Mozilla",a.version=parseFloat(a.ua.split("Firefox/")[1].replace(/[^0-9\.]/g,""))):/Nokia/.test(a.ua)&&(a.browser="Nokia",a.version=parseFloat(a.ua.split("Browser")[1].replace(/[^0-9\.]/g,""))));if(a.browser)for(var b in a.browserArray)a[a.browserArray[b].toLowerCase()]=a.browser==a.browserArray[b];$.extend(!0,$.browser=,a))(jQuery);

jsFiddle


传统上像这样使用:if ($.browser.msie) doWork


/**	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($)if(!$.browser&&1.9<=parseFloat($.fn.jquery))var 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].replace(/[^0-9\.]/g,""))?parseFloat(a.ua.split("MSIE")[1].replace(/[^0-9\.]/g,"")):"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].replace(/[^0-9\.]/g,"")))):/Chrome/.test(a.ua)?(a.browser="Chrome",a.version=parseFloat(a.ua.split("Chrome/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Opera/.test(a.ua)?(a.browser="Opera",a.version=parseFloat(a.ua.split("Version/")[1].replace(/[^0-9\.]/g,""))):/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].replace(/[^0-9\.]/g,""))):/Kindle/i.test(a.ua)&&/Version/i.test(a.ua)&&(a.browser="Kindle",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,"")))):/BlackBerry/.test(a.ua)?(a.browser="BlackBerry",a.version=parseFloat(a.ua.split("/")[1].replace(/[^0-9\.]/g,""))):/PlayBook/.test(a.ua)?(a.browser="PlayBook",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/BB[0-9]1,; Touch/.test(a.ua)?(a.browser="Blackberry",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Android/.test(a.ua)?(a.browser="Android",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Safari/.test(a.ua)?(a.browser="Safari",a.version=parseFloat(a.ua.split("Version/")[1].split("Safari")[0].replace(/[^0-9\.]/g,""))):/Firefox/.test(a.ua)?(a.browser="Mozilla",a.version=parseFloat(a.ua.split("Firefox/")[1].replace(/[^0-9\.]/g,""))):/Nokia/.test(a.ua)&&(a.browser="Nokia",a.version=parseFloat(a.ua.split("Browser")[1].replace(/[^0-9\.]/g,""))));if(a.browser)for(var b in a.browserArray)a[a.browserArray[b].toLowerCase()]=a.browser==a.browserArray[b];$.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>

【讨论】:

a.browserArray[b].toLowerCase() 抛出未定义的错误。如果我把 .toLowerCase() 拿出来,它就可以了! 谢谢。干得好!【参考方案4】:

您可以使用 jQuery.Migrate 库来支持已弃用的函数,例如 $.browser。

见https://github.com/jquery/jquery-migrate/#readme

【讨论】:

以上是关于jQuery.browser:Javascript 未捕获的类型错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery.browser 区分 Chrome 和 Safari

jquery1.9不支持browser对象的解决方案

JQMIGRATE:jQuery.browser 已弃用,无法读取未定义的属性“mozilla”

JQuery 判断浏览器及其版本

jQuery升级踩坑之路

使用jQuery排除IE9之前的IE版本