【问题标题】:How to merge if/else statements in JS?如何在 JS 中合并 if/else 语句?
【发布时间】:2010-04-18 12:34:33
【问题描述】:

我想知道如何正确合并这些 JS if/else 语句?

if (window.addEventListener) { window.addEventListener('dosomething', foo, false); }
else { document.addEventListener('dosomething', foo, false); }

if (window.attachEvent) { window.attachEvent('dosomething', foo); }
else { document.attachEvent('dosomething', foo); }

编辑我

原来的代码是:

if (window.attachEvent) { window.attachEvent('dosomething', foo); }
else if (window.addEventListener) { window.addEventListener('dosomething', foo, false); }
else { document.addEventListener('dosomething', foo, false); }

现在,我想补充一下

document.attachEvent('dosomething', foo);

这里。

编辑二

事实证明,“document.addEventListener”/“document.attachEvent”是多余的,所以我把它留给

if (window.addEventListener) { window.addEventListener('dosomething', foo, false); } 
else if (window.attachEvent) { window.attachEvent('dosomething', foo); }

谢谢大家!

【问题讨论】:

  • “合并”是什么意思?你的问题很不清楚。
  • 请说明您正在寻找什么结果。您期望的最终结果是什么? (“这里的合并不明确。)
  • 嗨!我是新手,想将这两个语句合并为一个:if window.addEventListener do window.addEventListener else do document.addEventListener。如果不支持 addEventListener,请尝试 window.attachEvent 否则 document.attachEvent... 希望对您有所帮助 ;-)

标签: javascript merge if-statement


【解决方案1】:

原始代码看起来没问题,只是最好先检查window.addEventListener,因为那是标准的DOM 事件接口。 attachEvent 只能用作 9 之前的 IE 版本的后备。

我不知道您在检查 windowdocument 上的方法时在做什么。如果该方法存在于一个上,则它必然存在于另一个上,因此您的额外选项将永远不会出现。

如果既没有window.addEventListener也没有window.attachEvent,则说明您使用的是旧版浏览器或受限(例如手机)浏览器。这些都不会在document 上使用相同的方法;如果它们完全支持事件,您将只能使用老式 window.onsomething= function() {...}; 样式事件进行绑定。

【讨论】:

  • @bobince,感谢您的建议!所以,如果我理解你的话,根本不需要“document.addEventListener”?
  • 我不知道,这取决于something事件是应该绑定在window还是document上。在少数情况下,可能有理由同时绑定两者。但是你不能仅仅通过嗅探用于绑定事件的方法来判断 EventTarget 上会触发什么事件,因为它总是存在的。
  • 对于load 事件,window 是通常的目标。这应该在任何地方都有效。 document.body 由于历史原因,传统上也适用于任何地方。
【解决方案2】:

这两个条件执行不同的任务,您不应加入它们。但是,您可能想看看 javascript ternary operator to lessen your code.

【讨论】:

    【解决方案3】:

    您不想“合并”这些 if 语句。您正在检查两个完全不同的事物,即使它们是相关的。我强烈建议你不要这样做。

    【讨论】:

      【解决方案4】:

      让它们保持原样。

      如果您真的想改进您的代码,请使用可以为所有浏览器(即 jQuery)处理统一事件的 js 库。

      【讨论】:

        【解决方案5】:

        您可以使用|| operator 将其缩短为:

        (window.addEventListener || document.addEventListener)('dosomething', foo, false);
        (window.attachEvent || document.attachEvent)('dosomething', foo);
        

        之所以有效,是因为表达式 expr1 || expr2 的计算方式如下:

        如果可以转换为true,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,||如果任一操作数为真,则返回真;如果两者都是 false,则返回 false。

        【讨论】:

        • 我没有投反对票,我怀疑有一种倾向,即“这些陈述不应合并!”你提供了一种方法来做不应该做的事情。
        • @babs:这只是您前两个if 语句的一个捷径。它不会改变语义。
        【解决方案6】:

        在 JS 中制定 if/else 语句的建议不是像

        if (foo) {
           bar();
        } else {
           bla();
        }
        

        为了避免分号插入问题?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-27
          • 1970-01-01
          • 2019-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多