IEで別のJavaScriptを実行することは悪い習慣と考えられていますか


8

IEで別のJavaScriptを実行することは悪い習慣(そしてどれほど悪いこと)と考えられていますか?現在、JavaScriptを書いていて、IEの癖を回避する簡単な方法は、ブラウザーのバージョンを確認して別のコードを実行することです

var browserName = navigator.appName;

if (browserName == "Microsoft Internet Explorer") {
  //Do some stuff
}
else
{
//Do other stuff
}

高速でうまく機能しますが、コードの重複につながり、「ハック」と感じます。


18
MicrosoftがそのようなJavascriptが必要なところにブラウザを書くのは悪い習慣だと言う人もいるでしょう
maple_shaft

3
@kepplaベストプラクティスの質問は、プログラマーに適しています
トムス

2
それは悪い習慣ではないだけでなく、絶対に不可欠です。JQueryが通過する必要があるものを確認してください。
GrandmasterB

2
@keppla-そうではありません。彼はそれを行う方法を尋ねているのではなく、それが良い習慣かどうかを尋ねています。
ChrisF

8
問題の本当に悪い習慣は、何をすべきかをテストする方法、ブラウザー検出ではなく機能検出を使用する方法、それを行う方法、または多くの失敗と苦痛が続くことです。

回答:


17

はい

ユーザーエージェント文字列から機能を推測することは、弱くてエラーが発生しやすいテストです。比較的一般的ですが、この日と年齢では、それは確かに悪い習慣と考えられています。

たとえば、jqueryには、ユーザーが使用しているブラウザーを検出するための関数があり、バージョン1.3以降は使用されていません。

したがって、UserAgentスニッフィングを行って、ブラウザが何であるか、または何が可能かを判断しないでください。

ベストプラクティス

ブラウザの機能の違いを処理するために受け入れられているベストプラクティスは、機能検出使用することです

これにはいくつかのライブラリがありますが、最もよく知られているのは、おそらく:Modernizrです。Modernizrを使用すると、ブラウザの機能に合わせてJavaScriptを簡単に調整できます。利用可能なものを検出することで機能します。UserAgent文字列(最後の手段としてのフォールバックを除く)に基づいて推測せず、単純にhtmlタグにクラスを追加します。これにより、jsでさまざまなケースを簡単に処理できるだけでなく、cssだけで特定の欠陥に対処することもできます。例(純粋に説明のみ):

ul.menu {
    display:none;
}
ul.menu:hover {
    display:block;
}

# A touch device can have no hover - so show it always
html.notouch ul.menu {
    display: block;
}

3

それが有効なJSであり、抽象化がない場合は問題ありません

良くなったとしても、ブラウザが100%同一というわけではありません。

ただし、特別なケースを開始する前に、それらが本当に特別なケースであり、他のブラウザの特異性だけではない場合は、注意深く調べてください。この場合、すべてのブラウザーが共有する標準を使用してソリューションを検索する必要があります(caniuse.comはそのために非常に役立ちます)。

それが本当にブラウザ固有であると確信している場合は、この詳細を非表示にするライブラリを使用できるかどうかを確認する必要があります。ブラウザ間の互換性を正しく設定するのは難しいので、誰かがあなたのためにやったとしても、利益を得てください。

最後の手段として、あなたがしなければならないことをしてください;)


2
ライブラリの+1。jQuery、Dojo、Prototype、Ext.jsはほんの一例です。
2012年

はい。私は今までプロトタイプとjqueryを使用しただけなので、私は非常に偏見があるので、推奨事項を追加することに消極的でした。
ケプラ2012年

2
ブラウザ名を確認してから別のコードを実行することはできません。ブラウザのスニッフィングと機能のスニッフィングに違いがあることを明確にしてください
Raynos

レイノス、そうだね。幸い、より良い答えは受け入れられたものです:)
ケプラ

2

「何かを行う」が「IE固有のファシリティxを使用する」ことを意味し、「他のことを行う」が「より一般的なファシリティyを使用する」ことを意味する場合、xまたはyの存在を確認するだけの方が適切です。

現在、外部のJavaScriptライブラリを使用していないと思います。その場合、jQueryが実行しようとしているタスクをサポートしているかどうかを確認します。もしそうなら、私はそれを使います。


1

IE固有のコメント<!--[if IE &gt; 6]>...などを使用します。すべての超お粗末なブラウザーIEで動作しますか?-> IE8。ただし、ブラウザとしてはまあまあと考えられているIE9 +ではできません。

結論として、回避策を必要とする非常にくだらないブラウザに対処したら、必要なことは何でも行うことができますが、適切に記述されたベースラインコードをハッカトロンに変換することは避けます。

うまくいけば、IEは1日でなくなり、ハッカトロンコードを削除して、適切に記述されたベースラインのみを残すことができます。


-1

この種の意思決定はフレームワークの設計者に任せ、この種の複雑さをカプセル化する1つのJavaScriptフレームワークを使用する方が良いと思います。現在、AngularJS、JQuery、ReactJSなどがあり、フレームワークなしで物事を行うと、このような問題が発生します。


あなたの答えは何にも答えません。
アンディ

-2

まあ、実際にJavaScriptの学習に興味があるとすれば、ベストプラクティスはこれです。メソッドの不在/存在によるテストを優先し、正規化関数を作成します。つまり、まったく不十分な例ですが、次の3つの原則に当てはまります。

if(!document.getElementsByClassName){
    document.getByClass = function(){ //look at all elements, check for class etc...
}
else { document.getByClass = document.getElementsByClassName }
  1. ブラウザを嗅ぐな。
  2. DOMの残骸を少しずつ取り除くこともできます。DOM APIの目的は明確にすることであり、JSがいかに奇妙に柔軟であるかに気づかなかった場合に手根管を容易にすることではありません。かろうじて排除するすべての要因は、この例を不完全にするものです。
  3. 新しい関数にキャッシュします。呼び出されるたびにメソッドテストを実行しないでください。

利点は、ブラウザーのスニッフィングを100%信頼することができず、リンクされている他のライブラリーが同等のメソッドを実際に追加し直さなかったことがわからないことです。

物事を成し遂げようとしているだけなのか、もっと学びたいのかに関わらず、私はJQueryをお勧めします。これは、DOM APIの残骸を排除し、クロスプラットフォームの正規化を高いレベルで維持するという強力な仕事をしますが、内部で学ぶことでかなり学ぶことができるものでもあります。さらに重要なのは、コアJSを実際に学習し続けることに煩わされても、他の多くのJSフレームワークやライブラリのように役に立たなくなることはありません。スキル。

また、quirksmode.orgをチェックして、JSの前面で9より前のすべてのIEに対してMicrosoftを真に軽視する必要がある理由と、独自のDOM APIの正確な程度とその回避策に関する多くの重要な詳細を理解してください。


1
私は少し混乱していますが、その不愉快なトローリングコメントを削除していなかったとしたらどうでしょうか。次にそのようなコメントで問題が発生したときは、餌をとるのではなく、フラグを付けてください。これは良い答えですが、その粗雑さのために価値を失っています(他のいくつかの答えと同じです)。がらくたにフラグを立て、あなたの答えをプロフェッショナルに保つだけで、それはそれと同じくらい簡単です。
yannis

はい、そうです。私はマイナスになり(おそらくそれに値する)、私のコメントは残ります。なぜ起源を刺激するコメントも残すべきではないのですか?それはただのインターネットです。銃が関与していない場合、人々はもっと戦う必要があります。
エリック・レッペン、2012年

1
あなたが戦いたいなら、それをどこかに持っていってください、プログラマーはQ&Aプラットフォームであり、低ノイズを保つために私たちは一生懸命努力しています。
yannis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.