3

我需要将事件对象和事件源对象传递给处理函数。我相信我了解外部 javascript 的工作原理:

<input id="input2"/>
<script>
function getKey2(e) { alert(this.id+e.keyCode); }
document.getElementById("input2").onkeypress = getKey2;
</script>

onkeypress 方法是在 input2 DOM 上定义的,所以this指向它,并且事件对象作为第一个参数传递给函数。但我对内联 javascript感到困惑:

<input id="input1" onkeypress="getKey1(this,event)"/>
<script>
function getKey1(obj,e) {
    alert(obj.id+e.keyCode);
}
</script>

第一个参数this应该是Window对象,但是当它被复制到事件上的obj时,它是事件源对象,来自 DOM的input1 。第二个参数event应该是全局事件对象,但是当被调用时,事件对象被传递给函数。显然,我的推论是错误的——电话是如何工作的?

长话短说:为什么以下字符中的对象值不一样?

              | name   object value
----------------------------------
in onkeypress | this   Window
in getKey1    | obj    DOM input1


              | name   object value
----------------------------------
in onkeypress | event  global event
in getKey1    | e      keypress event

在这里摆弄

4

2 回答 2

6

W3C DOM 规范为内联事件声明了两种绑定:

  1. this绑定到定义内联事件的元素;
  2. 引入了一个同名的局部变量event。(IE 不这样做,但相同的语法适用于内联事件,因为event将被视为window.event在 IE 中。)

在 HTML5 中,信息隐藏在6.1.6.1 事件处理程序下。两部分展开:

当设置事件处理程序内容属性时[即设置内联事件时] .. 让 [综合函数声明的] body 为事件处理程序内容属性的新值..让函数有一个称为 event 的参数。[注意这onerror是一个特殊的。]

.. 让 Scope [或this] 成为 NewObjectEnvironment(元素的对象,Scope)的结果。[这与其他环境上下文链接在一起,例如表单(如果存在)和全局上下文。]

于 2013-07-02T16:16:32.337 回答
1

不,这将是触发事件的 dom 对象,在这种情况下,如果<input>设置了 onkeyup 属性并且浏览器将在其中找到处理程序。

我们将在这些事件中多玩一点:http: //jsfiddle.net/nFfEp/

为了更好地理解事件触发和处理,这是一个非常有用的文档:http ://www.w3.org/TR/DOM-Level-3-Events/#event-flow

于 2013-07-02T16:12:50.293 回答