使用jQuery检测Opera的正确方法是什么?
Amazon.com最近更新了他们的javascript,这引起了一些Opera浏览器的问题。
他们的浏览器检测代码看起来像这样,但它有问题:
function sitbReaderIsCompatibleBrowser() { if (typeof(jQuery) == 'undefined') { return false; } else { var version = jQuery.browser.version || "0"; var splitVersion = version.split('.'); return ( (jQuery.browser.msie && splitVersion[0] >= 6) // IE 6 and higher || (jQuery.browser.mozilla && ( (splitVersion[0] == 1 && splitVersion[1] >= 8) // Firefox 2 and higher || (splitVersion[0] >= 2) )) || (jQuery.browser.safari && splitVersion[0] >= 500) // Safari 5 and higher || (jQuery.browser.opera && splitVersion[0] >= 9) // Opera 5 and higher ); } }
没有任何明显错误的东西突然出现在我的代码中,但我以前从未使用过jQuery,所以我不知道。
即使这段代码看起来像是试图让Opera用户通过,当我使用Opera 9.64访问该页面时,我得到一条“不支持的浏览器”消息。 如果我更改Opera的设置以将自己报告为Firefox,则该页面可以完美运行! 考虑到这一点,我很确定这是脚本而不是浏览器的问题。
任何jQuery专家都有建议吗?
您可以通过访问亚马逊上的任何书籍并单击“查看此书”链接来复制该行为。
在jQuery 1.3之前,你可以使用jQuery.browser :
if( $.browser.opera ){ alert( "You're using Opera version "+$.browser.version+"!" ); }
从版本1.3开始,您应该使用jQuery.support 。
这样做的主要原因是应该避免检查浏览器,因为function可能会随版本而变化,使您的代码很快就会过时。
您应该始终尝试使用特征检测 。 这将允许您查看当前浏览器是否支持您尝试使用的function,无论浏览器品牌,版本等。
所有Opera 5+浏览器中都有一个特殊的window.opera对象。 所以简单如下:
if (window.opera && window.opera.buildNumber) { // we are in Opera }
就足够了。
我像这样检查Opera:
if (/Opera/.test (navigator.userAgent)) // do something
你为什么想要jQuery?
检测javascriptfunction比使用浏览器userAgent要好得多。
即DOM,XmlHttpRequest,事件模型(event.target vs event.srcElement),ActiveX,Java等
通过专注于您需要的API函数,而不是目标浏览器,您将创建一组更强大的脚本,并且不可避免地会减少特殊的shell。
歌剧中的这个链接可能会告诉你更多
一个非常简单的方法来自Opera自己:
if (window.opera) { //this browser is Opera }
资料来源: http : //my.opera.com/community/openweb/idopera/
亚马逊在Opera上失败的主要原因是因为已经从服务器端发送了不同的代码…如果您使用Firefox访问同一页面然后保存该页面并在Opera中重新打开它可以正常工作……
但是他们承诺在1月的某个时候解决这个问题……
我不确定(我从来没有真正检查过Opera)但是如果内置的jQueryfunction没有检测到opera,可能是jQuery需要修复的bug。 我怀疑如果是这样,它应该很快得到解决。
在当前的HTML5中,您还可以经常检查浏览器function。
if (!window.FormData) { alert("xmlhttprequest L2 FormData interface not available"); }
我认为这种方式是最好的
if(window.opera.version()== 12){}
这个例子检查opera版本是否为12.当我在Opera中遇到font-face问题时非常有用。