3

マウスボタンのイベントを処理するJavaScript関数があります。マウスの左ボタンと右ボタンを区別できる必要があります。残念ながら、Internet Explorerは、他のすべてのブラウザーとは異なる値をevent.buttonに使用します。私はそれらを解釈する方法を知っていますが、どの道を進むべきかを知る必要があります。

私は条件付きコンパイルに依存するJavaScriptハックでそれを行いました。こんな感じです:

if (/*@cc_on!@*/false) { IE fixup... }

これは、偽造できないJavaScriptパーサー機能に基づいており、他のブラウザーによって模倣される可能性が低いため、非常に安全な方法だと思います。

現在、JavaScriptファイルをパックするためにGoogleClosureCompilerを使用しています。他のコメントと同じように、条件付きコンパイルのコメントも削除されることがわかりました。そこで、さまざまなハックを試しました。それらの1つはこれです:

if ("\v" == "v") { IE fixup... }

残念ながら、クロージャコンパイラは非常に巧妙であり、条件が真になることは決してないことを発見し、そのコードを削除します。また、Microsoftが最終的にその\ vバグを修正し、検出が失敗する可能性があるため、私はそれが好きではありません。

navigator.appNameやその名前のようなものを読むこともできますが、これは簡単に偽造できません。そして、誰かがブラウザIDを変更した場合、他のevent.buttonの動作を実装する可能性は低くなります...

クロージャコンパイラでは、特定のコメントを保持できます。私はこれを試しました:

if (/**@preserve/*@cc_on!@*/false) { IE fixup... }

これは圧縮後に望ましい結果を生成しますが、ソース形式の機能的な条件付きコメントではありません。しかし、デバッグ上の理由から、JavaScriptファイルが圧縮と非圧縮の両方で機能する必要があります。

圧縮されたJSファイルを手動で変更せずにこれを機能させる希望はありますか?

参考までに、元の形式の完全な関数を次に示します。

function findEvent(e)
{
    e = e || event;   // IE
    if (!e.target && e.srcElement)   // IE
        e.target = e.srcElement;
    if (isSet(e.button))
    {
        // Every browser uses different values for the mouse buttons. Correct them here.
        // DOM says: 0 = left, 1 = middle, 2 = right (multiple buttons not supported)
        // Opera 7 and older and Konqueror are not specifically handled here.
        // See http://de.selfhtml.org/javascript/objekte/event.htm#button
        if (/*@cc_on!@*/false)   // IE - http://dean.edwards.name/weblog/2007/03/sniff/ - comment removed by Google Closure Compiler
        {
            if (e.button & 1)
                e.mouseButton = 0;
            else if (e.button & 2)
                e.mouseButton = 2;
            else if (e.button & 4)
                e.mouseButton = 1;
        }
        else
            e.mouseButton = e.button;
    }
    return e;
}
4

6 に答える 6

2

スクリプトの先頭に 2 行あり、ブラウザーが IE かどうかを既に検出しているようです。それを if ステートメントのベースとして使用してみませんか :

var IE = (!e.target && e.srcElement);
if (IE)  {
    !e.target && e.srcElement
}
// ...
if (IE) {
    if (e.button & 1)
        e.mouseButton = 0;
    // ...
于 2011-02-26T16:12:02.837 に答える
2

グローバルを設定する別のスクリプト (jQuery の ".browser()" のようなもの) を作成し、条件付きコメントで含めることができます。

<!--[if IE]>
<script>
  window.isIe = true;
</script>
<[endif]-->

実際、これをさらに凝ったものにすることもできます:

<!--[if = IE 6]>
<script>
  window.isIe = { version: 6 };
</script>
<[endif]-->

<!--[if = IE 7]>
<script>
  window.isIe = { version: 7 };
</script>
<[endif]-->

<!--[if = IE 8]>
<script>
  window.isIe = { version: 8 };
</script>
<[endif]-->

次に、圧縮された「実際の」スクリプトで次のことができます。

if (isIe) { /* IE stuff */ }

if (isIe && isIe.version === 6) { /* IE6 stuff */ }
于 2011-02-26T16:12:44.357 に答える
2

あなたはこれを行うことができます:

var is_ie = eval("/*@cc_on!@*/false");

http://code.google.com/p/closure-compiler/wiki/UsingConditionalCommentWithClosureCompiler

于 2011-03-04T17:34:10.437 に答える
0

これにつまずいたので、2013年の更新された回答を次に示します。

if (goog.userAgent.IE) { ... }

また、バージョン固有にする必要がある場合:

if (goog.userAgent.IE && goog.userAgent.VERSION != '10.0') { ... }

ドキュメント

于 2013-11-25T22:53:18.463 に答える