有一些关于这个主题的帖子,但我认为以下内容并不完全清楚(至少对我而言)。
之间有什么区别
<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而不是使用某些库的答案。
答案 0 :(得分:1)
但问题是:为什么?
因为这就是事件处理的演变过程(我们说的是Netscape版本2,前W3C,没有有用的HTML规范和DOM作为buz词,比如说1995)。 Netscape决定将对事件对象的引用作为第一个参数传递,IE将其作为 window.event 提供。
关于事件对象:
但似乎这种方法不是标准的,也就是说,事件对象不属于DOM / HTML规范,更不要说IE的工作方式有点不同了。是对的吗?
正确。由于IE和Netscpe中使用的不同事件模型(或多或少成为W3C事件模型),事件有点混乱。有W3C DOM Events specification和HTML events,第一个涵盖了如何在DOM中处理它们,第二个是如何在标记中应用它们。
基本上 on 属性的内容被视为脚本,并包含在根据事件规范调用的函数中。
在使用myfunction(event)
作为内联侦听器的情况下,它肯定是标准的(如在普遍采用的中,而不是在某个标准中的规定并且在{ {3}})并且无处不在。在IE模型中,标识符 event 解析为全局 window.event ,并且在Netscape模型中解析为由处理程序创建的事件对象,因此模型完全不同,结果是一样的。
虽然以下文章不是明确的并且有一些错误,但它非常好并值得一读:W3C HTML spec。