当前位置: 首页 > 知识库问答 >
问题:

为什么在click事件侦听器内部触发click()不会导致无限循环?

鄢英毅
2023-03-14

有人能解释一下这段JavaScript代码的程序流程吗:

const $leaveRoom = document.querySelector('#leave-button');
let a = 1;
$leaveRoom.addEventListener('click', () => {
  console.log(a);
  console.log("check");
  a++;
  $leaveRoom.click();
  console.log(a);
  a++;
});
<button id="leave-button">Leave Room</button>
The Output was:
1
check
2
check
3
4

共有1个答案

史俊德
2023-03-14

这个问题的关键是每个元素上都存在一个隐藏标志。click()方法。

每个元素都有一个关联的click in progress标志,该标志最初是未设置的。

文档:https://html.spec.whatwg.org/multipage/interaction.html#DOM-单击

(然后,一旦它包含的代码完全执行,它就返回到它的初始状态)

当此标志处于active状态时,则忽略对此方法的任何调用。

const bt_leaveRoom = document.querySelector('#leave-button')
let counter = 1
let origin  = 'event clic'

function lrFct( )
  {
  let source = origin
  console.log('first console.log', counter++ , source)

  origin = 'call'
  bt_leaveRoom.click()
  
  console.log('second console.log', counter++ ,source )
  }

bt_leaveRoom.addEventListener('click',  lrFct )
<button id="leave-button">Leave Room</button>
 类似资料:
  • 我目前正在尝试编写一些JavaScript来获取已单击的类的属性。我知道要正确地执行此操作,我应该使用事件监听器。我的代码如下: 我希望每次点击其中一个类时都有一个警告框来告诉我该属性,但不幸的是,这并不起作用。有人能帮忙吗?

  • 问题内容: 我尝试解除绑定click事件,但有时会触发两次,有时会触发5次!现在有点烦了! 来自的代码 更新 : 基本上我正在将以下代码 更多信息 : 这仅在我触发事件时发生,关闭模式对话框,然后使用其他对话框重新打开 数据结构: main.asp :负载> modal.asp :modal.asp包含上面的jquery +此页面上的两个div,其中包含panel1.asp和panel2.asp数

  • 问题内容: 我正在尝试在应用程序中使用AngularJS,并在某种程度上取得了成功。 我能够获取数据并将其显示给用户。我有一个按钮,我想通过该按钮发布DELETE请求。下面是我的代码。 这是获取信息并将其显示给用户的功能。 数据已获取并正确显示。 但是,单击删除按钮后,不会触发其中的代码。在GoogleChrome浏览器的开发人员工具中,我可以看到为代码生成了有效值,但未触发代码。从我尝试去掉花括

  • 使用jQuery-1.9.1。js和jQueryMobile 1.3.1(Chrome 26/Windows 7)我不明白为什么这些“点击”事件绑定到#一个触发,而另一个没有: 超文本标记语言: JavaScript: 当我在JSFiddle中运行它时,两个事件都会在没有包装在“mobile einit”事件中时触发:http://jsfiddle.net/9NRwa/ 我错过了什么?

  • 点击之后立马消失,click事件不会触发? https://codepen.io/perterhuan/pen/LYoxoGO 我想实现这样的效果 点击之后弹出选择框 点击选择其中一个选项之后,选择框立马消失。 尝试 借助于ant design的popover, trigger为focus,children为一个button, content为ant design List。 点击button(此

  • 问题内容: 我正在通过“ A Go of Go”教程。 我想检查一下这个问题的答案: 注意:对方法内部的调用将使程序陷入无限循环。您可以通过先转换来避免这种情况 。为什么? 我相信这是因为调用该函数时,由于错误为非nil,将再次调用the ,依此类推,从而导致无限循环。 问题答案: 将调用将值转换为。如果该方法调用,则程序将递归直到内存不足。 您可以通过将转换为不带or 方法的值来中断递归。