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:如果jQuery
是undefined
,您将收到错误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