dom-events 相关问题

DOM(文档对象模型)事件允许事件驱动的编程语言在DOM树内的元素节点上注册各种事件处理程序/侦听器。

以编程方式在更改事件处理程序中设置日期输入的值会触发 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 中,更改的值也仅打印一次,并且输入字段也明显重置。 随时添加更多信息。这是社区的答案...

回答 1 投票 0

使用 addeventListener 对同一事件进行多个事件侦听器

我在浏览器控制台中输入以下代码: document.body.addEventListener( “点击”, () => { Promise.resolve().then(() => console.log(1)); 控制台.log(2); }...

回答 1 投票 0

如何在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>

回答 1 投票 0

如何使用 Firefox 查找元素上的事件侦听器,如 Chrome 中的 get 函数“getEventListeners”?

我使用firefox收集元素上的所有事件。但是没有像chrome中的函数“getEventListeners”那样收集事件的api。 我注意到 Firefox 中显示了该事件

回答 1 投票 0

如何获取Google地图标记上的双击事件[关闭]

在我的应用程序中,我显示具有多个标记的谷歌地图。因为我有点击事件和获取信息窗口。但是我需要的是,当我双击标记时,其他一些页面有

回答 1 投票 0

按照什么顺序接收`storage`事件?

在哪个订单存储事件中收到? 例如tab_1执行代码 localStorage.set('key', 1); localStorage.set('key', 2); tab_2 执行代码 localStorage.set('key', 3); 本地存储....

回答 1 投票 0

文本对齐中心不适用于空内容可编辑

我有一个带有 contenteditable="true" 和调整大小的 div:这两个属性都通过 Flexbox 居中文本 .编辑区域{ 显示:柔性; 调整内容:居中; 对齐...

回答 1 投票 0

如何在 Chrome 扩展程序中使用 JavaScript 触发“isTrusted=true”点击事件?

我正在尝试使用 Chrome 扩展来模拟用户点击和鼠标移动。 例如: 在我的内容脚本中,有一个按钮单击。 document.querySelector("SOME_SELECTOR").clic...

回答 3 投票 0

Firefox 扩展生成的事件“可信”吗?

我的 Firefox 扩展会生成事件,例如点击。作为响应,Web 应用程序尝试打开一个新窗口。然而,随着弹出窗口阻止程序的启动,它被 Firefox 阻止了。但是,如果我手动...

回答 1 投票 0

如何使用 Greasemonkey 在 javascript 中设置创建的事件的 `isTrusted` 属性

我想通过 Greasemonkey 中的用户脚本创建并触发 KeyPress 事件,但我观察到 createEvent 的 isTrusted 始终设置为 false。 isTrusted 是只读属性...

回答 2 投票 0

JavaScript 触发 InputEvent.isTrusted = true

我正在尝试在 JavaScript 中自动执行一些任务,并且需要使用 InputEvent,但是当我使用普通事件时,我得到 event.isTrusted = false 并且我的事件什么也不做。这是我的活动协...

回答 5 投票 0

挂钩中附加的事件侦听器内的反应状态更改会停止默认行为

我创建了一个反应钩子来处理 div 外部的点击。为此,我在挂钩内附加了一个事件监听器,并且正在更新事件监听器调用中组件的状态...

回答 1 投票 0

向自定义 React 组件添加“onClick”(或其他内置)监听器?

我有一个第三方库,提供了一些 React 组件,我想通过添加 onClick() 处理函数来扩展其功能。处理程序功能可以工作,但我不知道如何...

回答 2 投票 0

如何有效/正确地处理多个嵌套的基于列表的菜单/导航的任何列表项的点击事件?

抱歉,如果我的问题确实是针对新手级别的...... 我有一个 3 级列表来构建菜单,但我不想使用 href。 我想改用特定的属性并调用 javascript 函数

回答 2 投票 0

为什么我的 else if 或 else 函数在第一个函数起作用时不起作用?

我尝试使用 else/if 语句根据单击的内容返回不同的值。现在,我的代码适用于第一个 if,但突然不适用于其余的。我不明白为什么不。 文件...

回答 1 投票 0

在单击提交按钮之前反应表单提交

我有一个非常简单的 React 应用程序,它表现出奇怪的行为: 从 'react' 导入 { useState } 导出函数 App(props) { const [就绪,setReady] = useState(false) 函数句柄...

回答 1 投票 0

arrowkey 事件侦听器不适用于我的网站

我的图片库网站在顶部显示一个缩略图,当点击缩略图中的每张图片时,它就会成为网站背景中的大显示图片,我想做...

回答 1 投票 0

是否可以将我的 React DOM(动画)转换为视频或 gif?

我正在尝试将我创建的动画转换为 gif 或视频。 动画(文本和图片)的日期来自 api。应该有一个功能可以让用户下载...

回答 1 投票 0

点击图像元素时播放视频

我想知道是否可以在单击图像的某个元素时播放视频,而在单击同一图像的另一个元素时播放另一个视频? 例如,想象一张图片......

回答 1 投票 0

documentElement节点使用innerHTML时不会触发MutationObserver

我发现了 MutationObserver 接口,用于拦截和分析 DOM 中的更改。 它工作得很好,我已经成功拦截了所有 DOM 更改...除了 DOM c...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.