内联事件处理程序与基于脚本的处理程序分配

时间:2013-12-02 01:33:07

标签: javascript events inline

有一些关于这个主题的帖子,但我认为以下内容并不完全清楚(至少对我而言)。

之间有什么区别
<sometag id="someid" ... onclick="myfunction()"></sometag>

<sometag id="someid" ...></sometag>
<script type="text/javascript>
    var element = document.getElementById("someid");
    element.onclick = myfunction;
</script>

我知道,在第二种情况下,调用函数myfunction并将参数传递给它,即指向表示触发事件的对象的指针。在第一种情况下,没有传递参数。但问题是:为什么?我认为通过理解上面两个代码块的行为方式可以澄清这种差异。

另一个具体问题是访问表示触发事件的对象。据我所知,如果我使用内联定义的事件处理程序,访问此对象的唯一方法是通过预定义的event对象,如下面的代码所示:

<sometag id="someid" ... onclick="myfunction(event)"></sometag>

但似乎这种方法不是标准的,即event对象不属于DOM / HTML规范,更不是说IE的工作方式有点不同。是对的吗?如果我使用内联定义的事件处理程序,是否有另一种标准方法来访问表示触发事件的对象?

我很感激使用纯JavaScript而不是使用某些库的答案。

1 个答案:

答案 0 :(得分:1)

  

但问题是:为什么?

因为这就是事件处理的演变过程(我们说的是Netscape版本2,前W3C,没有有用的HTML规范和DOM作为buz词,比如说1995)。 Netscape决定将对事件对象的引用作为第一个参数传递,IE将其作为 window.event 提供。

关于事件对象:

  

但似乎这种方法不是标准的,也就是说,事件对象不属于DOM / HTML规范,更不要说IE的工作方式有点不同了。是对的吗?

正确。由于IE和Netscpe中使用的不同事件模型(或多或少成为W3C事件模型),事件有点混乱。有W3C DOM Events specificationHTML events,第一个涵盖了如何在DOM中处理它们,第二个是如何在标记中应用它们。

基本上 on 属性的内容被视为脚本,并包含在根据事件规范调用的函数中。

在使用myfunction(event)作为内联侦听器的情况下,它肯定是标准的(如在普遍采用的中,而不是在某个标准中的规定并且在{ {3}})并且无处不在。在IE模型中,标识符 event 解析为全局 window.event ,并且在Netscape模型中解析为由处理程序创建的事件对象,因此模型完全不同,结果是一样的。

虽然以下文章不是明确的并且有一些错误,但它非常好并值得一读:W3C HTML spec

还有Quriksmode: Introduction to Events

相关问题