Javascript document.addEventListener和window.addEventListener之间的差异?

Javascript document.addEventListener和window.addEventListener之间的差异?,javascript,events,dom,event-listener,Javascript,Events,Dom,Event Listener,在使用PhoneGap时,它有一些默认的JavaScript代码使用文档。addEventListener,但我有自己的代码使用窗口。addEventListener: 函数onBodyLoad(){ 文件。添加的监听器(“deviceready”,OnDeviceraddy,false); 文档。addEventListener(“touchmove”,preventBehavior,false); window.addEventListener('shake',shakeEventDidOc

在使用PhoneGap时,它有一些默认的JavaScript代码使用
文档。addEventListener
,但我有自己的代码使用
窗口。addEventListener

函数onBodyLoad(){
文件。添加的监听器(“deviceready”,OnDeviceraddy,false);
文档。addEventListener(“touchmove”,preventBehavior,false);
window.addEventListener('shake',shakeEventDidOccurse,false);
}

区别是什么?使用哪个更好?

文档和窗口是不同的对象,它们有一些不同的事件。在它们上使用
addEventListener()
侦听指向不同对象的事件。你应该使用一个真正有你感兴趣的事件

例如,在
窗口
对象上有一个
“resize”
事件,该事件不在
文档
对象上

例如,
“readystatechange”
事件仅在
文档
对象上

因此,基本上,您需要知道哪个对象接收您感兴趣的事件,并在该特定对象上使用
.addEventListener()

下面是一个有趣的图表,显示了哪些类型的对象创建了哪些类型的事件:



如果正在侦听传播的事件(如单击事件),则可以在文档对象或窗口对象上侦听该事件。传播事件的唯一主要区别在于时间。事件将击中
窗口
对象之前的
文档
对象,因为它首先出现在层次结构中,但这种差异通常无关紧要,因此您可以选择其中之一。我发现,在处理传播的事件时,通常最好选择距离事件源最近的对象,以满足您的需要。这将建议您在
窗口
上选择
文档
,任何一个都可以工作。但是,我经常更接近源代码,并在文档中使用
document.body
或更接近的公共父级(如果可能)。

您会发现,在javascript中,通常有许多不同的方法来做相同的事情或查找相同的信息。在您的示例中,您正在寻找一些保证始终存在的元素<代码>窗口和
文档
都符合要求(只有一些区别)

发件人:

addEventListener()在单个事件上注册单个事件侦听器 目标。事件目标可以是文档中的单个元素 文档本身、窗口或XMLHttpRequest


因此,只要你能指望你的“目标”总是在那里,唯一的区别就是你在听什么事件,所以就用你最喜欢的。

窗口绑定是指浏览器提供的内置对象。它表示包含
文档的浏览器窗口。调用其
addEventListener
方法注册第二个参数(回调函数),以便在第一个参数描述的事件发生时调用

<p>Some paragraph.</p>
<script>
  window.addEventListener("click", () => {
    console.log("Test");
  });
</script>
一些段落

window.addEventListener(“单击”,()=>{ 控制台日志(“测试”); });
在向AddEventListeners选择窗口或文档之前,应注意以下几点

  • 对于
    窗口
    文档
    而言,大多数事件是相同的,但是 一些事件,如调整大小
  • ,以及与加载相关的其他事件,
    卸载
    打开/关闭
    都应在窗口上设置
  • 因为窗口中有文档,所以最好使用文档 句柄(如果它可以处理),因为事件将首先命中文档
  • Internet Explorer不响应在上注册的许多事件 窗口,所以您需要使用文档来注册事件

  • 一般来说,情况并非如此。不同的事件发生在不同的对象上<代码>文档和
    窗口
    没有收到相同的事件。您必须选择获取您感兴趣的事件的对象。有些事件可能同时发生在
    文档
    窗口
    ,但不是全部。我对“冒泡到文档而不是窗口”的事情很好奇。所以我在这里测试->是我遗漏了什么还是冒泡真的发生了?@JOPLOmacedo-在你评论之前,我删除了关于冒泡的部分,因为我不确定哪些事件会冒泡到窗口,哪些不会。我一直看到的协议是在
    document.body
    对象或
    document
    对象上截获文档范围内的冒泡事件,因此没有理由对冒泡事件使用
    窗口。在任何情况下,我的答案是,有些事件只在
    窗口上,有些事件只在
    文档上,有些事件同时在这两个窗口上,因此OP应该选择与他们想要处理的事件对应的对象。好的。这也是我通常做的——正是我决定测试它的原因。谢谢你的回答!由于“click”事件在文档和窗口中都可用,并且如果我们在文档和窗口上都注册了事件,那么文档的click处理程序将首先触发,然后触发窗口。因此,从这个角度来看,选择文档更好。另一个例子:如果您将通过三星电视的
    窗口添加
    addEventListener(“keydown”,event)
    ,那么它将不起作用。但是您将对
    文档
    执行相同的操作,然后它将执行。还取决于特定设备如何调用冒泡事件。