复制
收藏
提问
简洁

var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { // 检查新添加的节点是否是iframe if (mutation.addedNodes) { mutation.addedNodes.forEach(function(node) { if (node.nodeName === 'IFRAME' && node.getAttribute('data-id') && node.getAttribute('data-id').startsWith('/jmreport')) { // 监听iframe的load事件 node.addEventListener('load', function() { // 获取iframe的内容窗口 var iframe = this; var iframeWindow = iframe.contentWindow; // 拦截即将跳转的页面的网址 // 重写 window.open 方法 iframeWindow.open = function(url, target, features) { let isTime = true; if(iframeWindow.rpViewInst){ let params = iframeWindow.rpViewInst.getRpQueryParam(); const separator = url.includes('?') ? '&' : '?'; if(iframeWindow.rpQueryParam){ for (let key in iframeWindow.rpQueryParam) { params[key] = iframeWindow.rpQueryParam[key]; } } if(iframeWindow.limitTimeRange){ let ltr = iframeWindow.limitTimeRange isTime = judgeTime(params[ltr.sname],params[ltr.ename],ltr.day); } const query = Object.keys(params).map(key => `${key}=${params[key]}`).join('&'); url = url + separator + query } if(isTime){ openNewTab(url, 100, '明细'+n, false); } return null; }; // 创建一个MutationObserver实例 var observer1 = new MutationObserver(function(muts) { muts.forEach(function(mut) { if (mut.type === 'childList') { mut.addedNodes.forEach(function(no) { if (no.nodeName === 'DIV' && no.classList.contains('jm-sheet-scrollbar') && no.classList.contains('vertical')) { // 为div元素添加鼠标滚轮事件 iframe.contentDocument.addEventListener('wheel', function(event) { // 阻止滚动条的默认行为 event.preventDefault(); // 计算滚动条的新位置 var delta = event.deltaY; // 滚轮的滚动量 var currentScrollTop = no.scrollTop; no.scrollTop = currentScrollTop + delta;; }, { passive: false }); } if (iframeWindow.limitTimeRange && no.nodeType === Node.ELEMENT_NODE) { // 找到含有 '开始时间' '结束时间' 的标签 no.querySelectorAll('input').forEach(function(inputEl) { if (inputEl.placeholder && (inputEl.placeholder.includes('开始时间') || inputEl.placeholder.includes('结束时间'))) { console.log(inputEl,no.querySelectorAll('input')); inputEl.addEventListener('input', function(event) { console.log(this); if(iframeWindow.rpViewInst) { let params = iframeWindow.rpViewInst.getRpQueryParam(); let ltr = iframeWindow.limitTimeRange judgeTime(params[ltr.sname],params[ltr.ename],ltr.day); } }); } }); } }); } }); }); // 配置MutationObserver观察iframe的内容文档 var config = { childList: true, subtree: true }; observer1.observe(iframeWindow.document.body, config); }); } }); } }); }); // 配置MutationObserver观察#content-main元素 var config = { childList: true, subtree: true }; observer.observe(document.querySelector('#content-main'), config);一样的代码,我把input的监听改成blur就能触发,改成input或者change就没有触发,是为什么

聪明理想者
5天前
全网
文档
学术
百科
知识库
时间不限
自动
回答简洁模式
深入研究一些

在JavaScript中,input 事件和 change 事件都是用来监听表单元素(如 input, select, textarea 等)的值变化的。但是它们触发的时机和条件有所不同:

  1. input 事件:当元素的值发生变化时,每次变化都会触发这个事件。这意味着,只要用户在输入框中键入或删除字符,input 事件就会被触发。

  2. change 事件:当元素的值发生变化,并且用户已经离开该元素(即失去焦点)时触发。这意味着,change 事件不会在用户输入时连续触发,而是在用户完成输入并离开该元素后才触发。

  3. blur 事件:当元素失去焦点时触发。这与 change 事件的触发条件相同,但是 blur 事件不关心元素的值是否发生了变化。

在你的情况下,如果将事件监听器从 blur 改为 inputchange 后没有触发,可能的原因包括:

  • 事件冲突:如果其他脚本或代码已经为相同的元素添加了 inputchange 事件监听器,并且这些监听器中执行了 event.stopPropagation(),那么事件将不会继续传播到你的监听器。

  • 事件处理程序的执行顺序:如果 inputchange 事件的处理程序中有任何异步操作,可能需要等待这些操作完成后才能看到效果。

  • DOM更新问题:如果 inputchange 事件的监听器是在DOM元素被添加到文档之后才添加的,那么可能需要确保在添加监听器时元素已经存在于DOM中。

  • 浏览器兼容性问题:虽然 inputchange 事件在现代浏览器中广泛支持,但仍然可能存在一些边缘情况或特定浏览器的兼容性问题。

  • 代码逻辑问题:如果事件处理程序中的逻辑依赖于特定的条件或状态,可能需要检查这些条件或状态是否在 inputchange 事件触发时满足。

为了解决这个问题,你可以尝试以下步骤:

  • 确保事件监听器在元素被添加到DOM后立即添加。
  • 检查是否有其他脚本或代码可能影响事件的触发。
  • 使用 console.log 或其他调试工具来检查事件是否被正确触发,以及事件处理程序是否按预期执行。
  • 如果可能,尝试在不同的浏览器和环境中测试代码,以确定是否存在兼容性问题。

如果问题仍然存在,你可能需要提供更多的代码上下文或详细信息,以便进一步分析和解决问题。

你觉得结果怎么样?
MutationObserver 与 input 事件触发问题
MutationObserver 如何监听 input 元素变化
input 事件与 blur 事件的区别
如何使用 MutationObserver 监听 input 元素的 change 事件
MutationObserver 监听 input 元素的最佳实践
input 事件不触发的原因分析 # 说明: - 问题集中在 MutationObserver 监听 input 元素的事件触发问题上。 - 探讨了 input 事件与 blur 事件的不同,以及为什么 blur 可以触发而 input 或 change 不能。 - 提供了关于如何更有效地使用 MutationObserver 监听 input 元素的指导。 - 分析了可能导致 input 事件不触发的原因。

以上内容由AI搜集生成,仅供参考

在线客服