3

我有一个处理鼠标按钮事件的 JavaScript 函数。它必须能够区分鼠标左键和右键。遗憾的是,Internet Explorer 对 event.button 使用的值与所有其他浏览器不同。我知道如何解释它们,但我需要知道该走哪条路。

我通过依赖条件编译的 JavaScript hack 做到了这一点。就像这样:

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

我认为这是一种相当安全的方法,因为它基于 JavaScript 解析器功能,无法伪造,也不太可能被其他浏览器模仿。

现在我正在使用 Google Closure Compiler 来打包我的 JavaScript 文件。我发现它也像任何其他注释一样删除了条件编译注释。所以我尝试了不同的技巧。其中之一是这样的:

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

不幸的是,闭包编译器非常聪明,发现条件永远不会为真并删除该代码。另外,我不喜欢它,因为微软最终可能会修复那个 \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;
}
4

6 回答 6

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 回答
1
if (goog.userAgent.IE) {
    // run away
};

/**
 * Condition will be true for IE < 9.0
 * @see goog.string.compareVersions
 */
if (goog.userAgent.IE && goog.userAgent.compare(9, goog.userAgent.VERSION) == 1) {
    // run away even faster
}

/**
 * Condition will be true for IE >= 10.0
 */
if (goog.userAgent.IE && goog.userAgent.isVersionOrHigher(10)) {
    // ...
}

来源:http ://www.closurecheatsheet.com/other#goog-useragent

于 2013-12-03T11:08:59.067 回答
0

好的,经过更多搜索,现在我对这个解决方案感到满意:

function ieVersion()
{
    var style = document.documentElement.style;
    if (style.scrollbar3dLightColor != undefined)
    {
        if (style.opacity != undefined)
            return 9;
        else if (style.msBlockProgression != undefined)
            return 8;
        else if (style.msInterpolationMode != undefined)
            return 7;
        else if (style.textOverflow != undefined)
            return 6;
        else
            return 5.5;
    }
    return 0;
}

在http://msdn.microsoft.com/en-us/library/ms537509%28v=vs.85%29.aspx#4上找到

这是我在途中发现的其他方法的列表:http://dean.edwards.name/weblog/2007/03/sniff/ - 不适用于 Closure Compiler http://webreflection.blogspot.com/2009/ 01/32-bytes-to-know-if-your-browser-is-ie.html – 那是带有“\v”的那个http://www.thespanner.co.uk/2009/01/29/detecting- browsers-javascript-hacks/ - 与上面类似,也适用于其他浏览器如何使用 Google Closure Compiler 在 JavaScript 中检测 Internet Explorer?–约翰在此页面上的回答



于 2011-03-05T10:39:32.840 回答
0

只是偶然发现了这一点,所以这是 2013 年的更新答案:

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

如果您需要特定于版本:

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

文档

于 2013-11-25T22:53:18.463 回答