3

嗨,这个 javascript 片段是什么意思。(evt)部分太令人困惑了。evt 不是布尔值。这个怎么运作?

function checkIt(evt) {
        evt = (evt) ? evt : window.event
        var charCode = (evt.which) ? evt.which : evt.keyCode

    }
4

4 回答 4

9

evt = (evt) ? evt : window.event只是内联if语法。它等效于以下代码:

if (evt) {
    evt = evt;
} else {
    evt = window.event;
}

如果evt是真的,evt将被单独留下。如果evt不是真的,它将被替换为window.event.

于 2012-09-28T07:04:13.120 回答
3

它适用于事件侦听器。

IE6-IE8 使用了与 W3C 标准完全不同的事件方法。

当事件触发时,W3C 标准浏览器将在回调中传递一个事件对象:

function keyPressed (e) { /* do stuff with e */ }

在您的情况下,它是keydown(或其他使用keyCode)。
IE 不支持这一点,而是window.event每次发生事件时都会更新它。

所以你的函数正在检查是否有一个对象被传递给它:

evt = (evt) ? evt : window.event;
// does `evt` exist, and is it anything but '', 0, false, null, undefined, NaN
// yes: evt = itself (W3C)
// no: evt = window.event (IE6-8)

然后代码询问是否evt.which存在,试图找出从哪里获取 keyCode。 在 和 的情况下,evt.keyCode您应该在现代浏览器中使用它。keydownkeyup

于 2012-09-28T07:15:32.350 回答
1

像这样的赋值表达式是从右到左求值的,所以这意味着:

  • 如果evt有一个真实值,则将此值分配回evt
  • 如果不是,则window.event无论其内容如何,​​都将值分配给evt
于 2012-09-28T07:04:48.287 回答
1

这意味着:如果evt参数有值,则保留该值,如果它没有值,则window.event改用。

?':' 符号是三元 if 运算符的一部分:

var w = x ? y : z;

所以上面你分配yz分配w取决于是否x被认为是一个真值或假值。

如果在checkIt没有传入evt参数的情况下调用函数,即checkIt()在函数内部,evt变量的值将undefined被视为false在 if 条件内。

于 2012-09-28T07:05:35.773 回答