15

Amazon.com recently updated their javascript, and it's causing problems with some Opera browsers.

Their browser detection code looks like so, but it's faulty:

    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
            );
        }
}

Nothing obviously wrong jumps out at me with this code, but I've never used jQuery before so I don't know.

Even though this code looks like it's attempting to let Opera users through, when I visit the page with Opera 9.64 I get an "unsupported browser" message. If I change Opera's settings to report itself as Firefox, the page works perfectly! With that in mind, I'm pretty sure it's a problem with the script and not the browser.

Any jQuery experts have a suggestion?

You can replicate the behavior by visiting any book on Amazon and clicking the "look inside this book" link.

4

9 に答える 9

20

jQuery 1.3 より前では、jQuery.browserを使用できました。

if( $.browser.opera ){
  alert( "You're using Opera version "+$.browser.version+"!" );
}

バージョン 1.3 以降では、代わりにjQuery.supportを使用する必要があります。

これの主な理由は、機能がバージョンごとに変更される可能性があり、コードがすぐに時代遅れになる可能性があるため、ブラウザーのチェックを避ける必要があるためです。

代わりに、常に機能検出を使用するようにしてください。これにより、ブラウザのブランドやバージョンなどに関係なく、使用しようとしている機能が現在のブラウザでサポートされているかどうかを確認できます。

于 2009-03-13T23:46:13.297 に答える
11

すべての Opera 5+ ブラウザーに存在する特別なwindow.operaオブジェクトがあります。したがって、次のように簡単です。

if (window.opera && window.opera.buildNumber) { 
    // we are in Opera 
}

で十分でしょう。

于 2010-09-28T08:10:45.797 に答える
5

ブラウザの userAgent ではなく、JavaScript の機能を検出する方がはるかに優れています。

つまり、DOM、XmlHttpRequest、イベント モデル (event.target と event.srcElement)、ActiveX、Java など

ターゲット ブラウザではなく、必要な API 関数に焦点を当てることで、より堅牢なスクリプト セットを作成し、必然的に特別なケースを減らすことができます。

オペラのこのリンクはおそらくあなたにもっと教えてくれるでしょう

于 2009-03-13T23:26:20.690 に答える
5

次のように Opera をチェックします。

if (/Opera/.test (navigator.userAgent)) // do something

jQuery が必要な理由

于 2009-03-13T23:08:04.027 に答える
2

Opera自体からの非常に簡単な方法:

if (window.opera) {
    //this browser is Opera
}

出典: http: //my.opera.com/community/openweb/idopera/

于 2012-09-23T05:51:11.413 に答える
1

Amazon が Opera で失敗する主な理由は、既にサーバー側から別のコードを送信しているためです... Firefox で同じページにアクセスし、そのページを保存して Opera で再度開くと、正常に動作します...

しかし、彼らはそれを1月中に修正すると約束した...

于 2010-12-20T19:46:26.587 に答える
1


if ( window.opera.version() == 12) { } この例では、Opera のバージョンが 12 かどうかを確認します
。Opera の font-face に問題がある場合に非常に便利です。

于 2015-11-30T09:07:12.690 に答える
0

確かなことはわかりませんが (とにかくオペラを実際にチェックすることはありません)、組み込みの jQuery 機能がオペラを検出しない場合は、修正が必要な jQuery のバグである可能性があります。もしそうなら、それはかなり迅速に解決されるはずだと思います。

于 2009-03-13T23:14:15.697 に答える
0

現在の HTML5 の時代では、代わりにブラウザの機能を頻繁に確認することもできます。

if (!window.FormData) { alert("xmlhttprequest L2 FormData interface not available"); }
于 2010-09-28T08:28:21.147 に答える