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就没有触发,是为什么
在JavaScript中,input
事件和 change
事件都是用来监听表单元素(如 input
, select
, textarea
等)的值变化的。但是它们触发的时机和条件有所不同:
-
input
事件:当元素的值发生变化时,每次变化都会触发这个事件。这意味着,只要用户在输入框中键入或删除字符,input
事件就会被触发。 -
change
事件:当元素的值发生变化,并且用户已经离开该元素(即失去焦点)时触发。这意味着,change
事件不会在用户输入时连续触发,而是在用户完成输入并离开该元素后才触发。 -
blur
事件:当元素失去焦点时触发。这与change
事件的触发条件相同,但是blur
事件不关心元素的值是否发生了变化。
在你的情况下,如果将事件监听器从 blur
改为 input
或 change
后没有触发,可能的原因包括:
-
事件冲突:如果其他脚本或代码已经为相同的元素添加了
input
或change
事件监听器,并且这些监听器中执行了event.stopPropagation()
,那么事件将不会继续传播到你的监听器。 -
事件处理程序的执行顺序:如果
input
或change
事件的处理程序中有任何异步操作,可能需要等待这些操作完成后才能看到效果。 -
DOM更新问题:如果
input
或change
事件的监听器是在DOM元素被添加到文档之后才添加的,那么可能需要确保在添加监听器时元素已经存在于DOM中。 -
浏览器兼容性问题:虽然
input
和change
事件在现代浏览器中广泛支持,但仍然可能存在一些边缘情况或特定浏览器的兼容性问题。 -
代码逻辑问题:如果事件处理程序中的逻辑依赖于特定的条件或状态,可能需要检查这些条件或状态是否在
input
或change
事件触发时满足。
为了解决这个问题,你可以尝试以下步骤:
- 确保事件监听器在元素被添加到DOM后立即添加。
- 检查是否有其他脚本或代码可能影响事件的触发。
- 使用
console.log
或其他调试工具来检查事件是否被正确触发,以及事件处理程序是否按预期执行。 - 如果可能,尝试在不同的浏览器和环境中测试代码,以确定是否存在兼容性问题。
如果问题仍然存在,你可能需要提供更多的代码上下文或详细信息,以便进一步分析和解决问题。