DOM(文档对象模型)事件允许事件驱动的编程语言在DOM树内的元素节点上注册各种事件处理程序/侦听器。
我想监听不是由我维护的 SPA 中的路径变化。 我在这里找到了一个解决方案:https://stackoverflow.com/a/44819548/7042552 但仍然看起来有点“hacky”......
什么 JavaScript 函数会自动提交 Qualtrics 调查?
什么 JavaScript 函数会自动提交 Qualtrics 调查?我想在 Qualtrics 调查的页眉或页脚中创建一个按钮,只要用户需要,该按钮就会自动提交调查...
我有一个 D3 (v4) 可视化,其中包含许多形状,在某些情况下,它们会在大约三秒的时间内动画到新位置。这些形状具有单击和鼠标悬停事件侦听器...
下面这个功能并没有像我想要的那样工作;作为一个 JS 新手,我不明白为什么。 我需要它等待 5 秒,然后再检查 newState 是否为 -1。 目前,已经等不及了,我...
以编程方式在更改事件处理程序中设置日期输入的值会触发 Firefox 中的更改事件
每当有人选择休息日的日期(例如星期六或星期日,它可能是一系列关闭日中的任何一天)时,我想呈现错误。 我有 HTML: 每当有人选择休息日的日期(例如星期六或星期日,它可能是一系列关闭日中的任何一天)时,我想呈现错误。 我有 HTML: <div> <input type="date" id="date-input"> </div> <br> <div id="error-container"> </div> CSS: .d-error{ background: orangered; color: white; padding: 4px 8px; } 这是 JavaScript: 'use strict'; const dateInput = document.getElementById('date-input'); const errorContainer = document.getElementById('error-container'); const closingDays = [0, 6]; const weekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday','Friday', 'Saturday']; const displayError = function ({ parentEl, message, position = 'prepend', durationSec = 0 }) { const errorElement = document.createElement('p'); errorElement.classList.add('d-error'); errorElement.textContent = message; parentEl[position](errorElement); if (durationSec) { setTimeout(() => { errorElement.remove(); }, durationSec * 1000); } }; const handleDateChange = function (event) { const selectedDay = new Date(event.currentTarget.value).getDay(); if (closingDays.includes(selectedDay)) { displayError({ parentEl: errorContainer, message: `We are closed on ${weekDays[selectedDay]}. Please select another day.`, durationSec: 5 }); event.currentTarget.value = ''; } }; dateInput.addEventListener('change', handleDateChange); 这可行,但错误会呈现两次。一次是由于用户更改,一次是由于以编程方式更改输入值 event.currentTarget.value = '';。那么,如何暂时删除 change 事件监听器并重新附加到它呢?或者有其他方法可以解决这个问题吗? 我尝试过: const handleDateChange = function(event) { ... event.currentTarget.removeEventListener('change', handleDateChange); event.currentTarget.value = ''; event.currentTarget.addEventListener('change', handleDateChange); ... } 但这并没有解决问题。 更新: 首先,正如@Sebastian 所指出的,以编程方式设置输入的值不会触发change事件。所以一定还有其他原因导致事件触发两次。 我非常抱歉没有在 Firefox 以外的其他浏览器中进行测试。这个问题似乎只出现在 Firefox 中,因为在基于 chromium 的浏览器中,一切都按预期工作(尽管在 Firefox android 中工作)。所以,我猜测这是 Firefox 中的某种错误,但我个人无法确认。请尝试在不同的浏览器中运行代码片段。 'use strict'; const dateInput = document.getElementById('date-input'); const errorContainer = document.getElementById('error-container'); const closingDays = [0, 6]; const weekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; const displayError = function({ parentEl, message, position = 'prepend', durationSec = 0 }) { const errorElement = document.createElement('p'); errorElement.classList.add('d-error'); errorElement.textContent = message; parentEl[position](errorElement); if (durationSec) { setTimeout(() => { errorElement.remove(); }, durationSec * 1000); } }; const handleDateChange = function(event) { const selectedDay = new Date(event.currentTarget.value).getDay(); if (closingDays.includes(selectedDay)) { displayError({ parentEl: errorContainer, message: `We are closed on ${weekDays[selectedDay]}. Please select another day.`, durationSec: 5 }); event.currentTarget.value = ''; } }; dateInput.addEventListener('change', handleDateChange); .d-error { background: orangered; color: white; padding: 4px 8px; } <div> <input type="date" id="date-input"> </div> <br> <div id="error-container"> </div> 这里是一个较短版本的代码片段,用于在 Firefox (121) 中重现该错误。 OP 是正确的,第二个事件实际上是由以编程方式设置事件处理程序内的输入字段的值引起的(根据第一个注释在规范中,情况不应该是这样)。但是,第二个事件中打印到控制台的值与第一个事件的值相同。此外,在事件处理程序之外设置值根本不会触发事件(应该如此)。与此同时,OP here on bugzilla 报告了这种不一致的行为(它可能与 this other 有关)。 function onChange(event) { console.log('changed to ' + dateInput.value) dateInput.value = ''; // somehow triggers a second event in Firefox }; dateInput.addEventListener('change', onChange); dateInput.value = '2024-02-07'; // does not trigger the event! <div> <input type="date" id="dateInput"> </div> 其他浏览器似乎没问题。特别是 Chromium 121 的行为符合预期(只有一个事件)。 作为 Firefox 的解决方法,OP 的尝试离成功并不遥远。事实证明,以下方法适用于不监听第二个事件(尽管请参阅下面更好的解决方案) dateInput.removeEventListener('change', onChange); dateInput.value = ''; // somehow triggers a second event setTimeout(() => dateInput.addEventListener('change', onChange), 0); Firefox 似乎没有立即调度额外的事件(因此不在同一调用堆栈内)。因此,在重新连接侦听器之前添加超时会有所帮助。如果您使用布尔标志,代码可能会更加透明和高性能,正如 @isherwood 所建议的。 正如 @AayushKarna 的评论中所指出的,在 Firefox 中仍然缺少在事件处理程序中重置输入字段的可见反馈。因此,还必须设置额外的超时时间。但随后它就不再触发 Firefox 中的事件,因此删除事件侦听器就变得多余了。我仍然在答案中保留上述建议,因为问题中明确要求了这一点。尽管如此,现在更简单的解决方法片段是: function onChange(event) { console.log('changed to ' + dateInput.value) setTimeout(() => dateInput.value = '', 0); }; dateInput.addEventListener('change', onChange); <div> <input type="date" id="dateInput"> </div> 即使在 Firefox 中,更改的值也仅打印一次,并且输入字段也明显重置。 随时添加更多信息。这是社区的答案...
使用 addeventListener 对同一事件进行多个事件侦听器
我在浏览器控制台中输入以下代码: document.body.addEventListener( “点击”, () => { Promise.resolve().then(() => console.log(1)); 控制台.log(2); }...
如何在JavaScript中临时删除eventListener?
每当有人选择休息日的日期(例如星期六或星期日,它可能是一系列关闭日中的任何一天)时,我想呈现错误。 我有 HTML: 每当有人选择休息日的日期(例如星期六或星期日,它可能是一系列关闭日中的任何一天)时,我想呈现错误。 我有 HTML: <div> <input type="date" id="date-input"> </div> <br> <div id="error-container"> </div> CSS: .d-error{ background: orangered; color: white; padding: 4px 8px; } 这是 JavaScript: 'use strict'; const dateInput = document.getElementById('date-input'); const errorContainer = document.getElementById('error-container'); const closingDays = [0, 6]; const weekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday','Friday', 'Saturday']; const displayError = function ({ parentEl, message, position = 'prepend', durationSec = 0 }) { const errorElement = document.createElement('p'); errorElement.classList.add('d-error'); errorElement.textContent = message; parentEl[position](errorElement); if (durationSec) { setTimeout(() => { errorElement.remove(); }, durationSec * 1000); } }; const handleDateChange = function (event) { const selectedDay = new Date(event.currentTarget.value).getDay(); if (closingDays.includes(selectedDay)) { displayError({ parentEl: errorContainer, message: `We are closed on ${weekDays[selectedDay]}. Please select another day.`, durationSec: 5 }); event.currentTarget.value = ''; } }; dateInput.addEventListener('change', handleDateChange); 这可行,但错误会呈现两次。一次是由于用户更改,一次是由于以编程方式更改输入值 event.currentTarget.value = '';。那么,如何暂时删除 change 事件监听器并重新附加到它呢?或者有其他方法可以解决这个问题吗? 我尝试过: const handleDateChange = function(event) { ... event.currentTarget.removeEventListener('change', handleDateChange); event.currentTarget.value = ''; event.currentTarget.addEventListener('change', handleDateChange); ... } 但这并没有解决问题。 更新: 首先,正如@Sebastian 所指出的,以编程方式设置输入的值不会触发change事件。所以一定还有其他原因导致事件触发两次。 我非常抱歉没有在 Firefox 以外的其他浏览器中进行测试。这个问题似乎只出现在 Firefox 中,因为在基于 chromium 的浏览器中,一切都按预期工作(尽管在 Firefox android 中工作)。所以,我猜测这是 Firefox 中的某种错误,但我个人无法确认。请尝试在不同的浏览器中运行代码片段。 'use strict'; const dateInput = document.getElementById('date-input'); const errorContainer = document.getElementById('error-container'); const closingDays = [0, 6]; const weekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; const displayError = function({ parentEl, message, position = 'prepend', durationSec = 0 }) { const errorElement = document.createElement('p'); errorElement.classList.add('d-error'); errorElement.textContent = message; parentEl[position](errorElement); if (durationSec) { setTimeout(() => { errorElement.remove(); }, durationSec * 1000); } }; const handleDateChange = function(event) { const selectedDay = new Date(event.currentTarget.value).getDay(); if (closingDays.includes(selectedDay)) { displayError({ parentEl: errorContainer, message: `We are closed on ${weekDays[selectedDay]}. Please select another day.`, durationSec: 5 }); event.currentTarget.value = ''; } }; dateInput.addEventListener('change', handleDateChange); .d-error { background: orangered; color: white; padding: 4px 8px; } <div> <input type="date" id="date-input"> </div> <br> <div id="error-container"> </div> 这里是一个较短版本的代码片段,用于在 Firefox (121) 中重现该错误。 OP 是正确的,第二个事件实际上是由以编程方式设置输入字段的值引起的(情况不应该如此)。但是,第二个事件中打印到控制台的值与第一个事件的值相同。此外,在事件处理程序之外设置值根本不会触发事件(应该如此)。因此,应该将此行为报告给 https://bugzilla.mozilla.org/ . function onChange(event) { console.log('changed to ' + dateInput.value) dateInput.value = ''; // somehow triggers a second event }; dateInput.addEventListener('change', onChange); dateInput.value = '2024-02-07'; // does not trigger the event! <div> <input type="date" id="dateInput"> </div>
如何使用 Firefox 查找元素上的事件侦听器,如 Chrome 中的 get 函数“getEventListeners”?
我使用firefox收集元素上的所有事件。但是没有像chrome中的函数“getEventListeners”那样收集事件的api。 我注意到 Firefox 中显示了该事件
在我的应用程序中,我显示具有多个标记的谷歌地图。因为我有点击事件和获取信息窗口。但是我需要的是,当我双击标记时,其他一些页面有
在哪个订单存储事件中收到? 例如tab_1执行代码 localStorage.set('key', 1); localStorage.set('key', 2); tab_2 执行代码 localStorage.set('key', 3); 本地存储....
我有一个带有 contenteditable="true" 和调整大小的 div:这两个属性都通过 Flexbox 居中文本 .编辑区域{ 显示:柔性; 调整内容:居中; 对齐...
如何在 Chrome 扩展程序中使用 JavaScript 触发“isTrusted=true”点击事件?
我正在尝试使用 Chrome 扩展来模拟用户点击和鼠标移动。 例如: 在我的内容脚本中,有一个按钮单击。 document.querySelector("SOME_SELECTOR").clic...
我的 Firefox 扩展会生成事件,例如点击。作为响应,Web 应用程序尝试打开一个新窗口。然而,随着弹出窗口阻止程序的启动,它被 Firefox 阻止了。但是,如果我手动...
如何使用 Greasemonkey 在 javascript 中设置创建的事件的 `isTrusted` 属性
我想通过 Greasemonkey 中的用户脚本创建并触发 KeyPress 事件,但我观察到 createEvent 的 isTrusted 始终设置为 false。 isTrusted 是只读属性...
JavaScript 触发 InputEvent.isTrusted = true
我正在尝试在 JavaScript 中自动执行一些任务,并且需要使用 InputEvent,但是当我使用普通事件时,我得到 event.isTrusted = false 并且我的事件什么也不做。这是我的活动协...
我创建了一个反应钩子来处理 div 外部的点击。为此,我在挂钩内附加了一个事件监听器,并且正在更新事件监听器调用中组件的状态...
向自定义 React 组件添加“onClick”(或其他内置)监听器?
我有一个第三方库,提供了一些 React 组件,我想通过添加 onClick() 处理函数来扩展其功能。处理程序功能可以工作,但我不知道如何...
如何有效/正确地处理多个嵌套的基于列表的菜单/导航的任何列表项的点击事件?
抱歉,如果我的问题确实是针对新手级别的...... 我有一个 3 级列表来构建菜单,但我不想使用 href。 我想改用特定的属性并调用 javascript 函数
为什么我的 else if 或 else 函数在第一个函数起作用时不起作用?
我尝试使用 else/if 语句根据单击的内容返回不同的值。现在,我的代码适用于第一个 if,但突然不适用于其余的。我不明白为什么不。 文件...
我有一个非常简单的 React 应用程序,它表现出奇怪的行为: 从 'react' 导入 { useState } 导出函数 App(props) { const [就绪,setReady] = useState(false) 函数句柄...