マウスボタンのイベントを処理する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;
}