У меня есть функция JavaScript, которая обрабатывает события кнопки мыши. Он должен уметь различать левую и правую кнопки мыши. К сожалению, Internet Explorer использует другие значения для event.button, чем все другие браузеры. Я знаю, как их интерпретировать, но мне нужно знать, по какому пути идти.
Я сделал это с помощью хака JavaScript, который опирается на условную компиляцию. Это так:
if (/*@cc_on!@*/false) { IE fixup... }
Я считаю, что это довольно безопасный метод, поскольку он основан на возможностях парсера JavaScript, которые не могут быть подделаны и вряд ли будут имитироваться другими браузерами.
Теперь я использую компилятор Google Closure, чтобы упаковать мои файлы JavaScript. Я обнаружил, что он удаляет комментарии условной компиляции, как и любой другой комментарий. Поэтому я пробовал разные хаки. Один из них это это:
if ("\v" == "v") { IE fixup... }
К сожалению, компилятор замыкания довольно умен и обнаруживает, что условие никогда не может быть истинным, и удаляет этот код. Кроме того, мне это не нравится, потому что Microsoft может в конечном итоге исправить эту ошибку \ v, а затем обнаружение не удастся.
Я мог бы просто прочитать что-то вроде navigator.appName или как оно называется, но это слишком легко подделать. И если кто-то изменяет идентификацию своего браузера, он вряд ли реализует другое поведение 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;
}