You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android WebView中MutationObserver无法检测DOM新增IFRAME问题求助

问题原因

你现有的代码只过滤了mutation.addedNodes中直接是iframe元素的节点,漏掉了「新增节点是父容器、内部包含嵌套iframe」的场景:比如通过innerHTML批量插入<div class="container"><iframe src="xxx"></iframe></div>时,addedNodes里返回的是外层div元素,你的代码不会遍历它的子节点查找iframe,自然捕获不到。
另外nodeName的判断没有兼容大小写,部分特殊场景下可能匹配失败。

修复后代码

var observer = new MutationObserver(function (mutations) {
    mutations.forEach(function (mutation) {
        // 遍历所有新增节点
        mutation.addedNodes.forEach(function (node) {
            // 只处理元素节点
            if (node.nodeType !== 1) return;
            // 检查当前节点是不是iframe
            if (node.nodeName.toUpperCase() === 'IFRAME') {
                handleIframe(node);
            }
            // 遍历当前节点的所有后代节点找iframe
            var iframes = node.querySelectorAll('iframe');
            iframes.forEach(handleIframe);
        });
    });
});

function handleIframe(iframe) {
    // 避免重复绑定事件
    if (iframe.dataset.iframeHandled) return;
    iframe.dataset.iframeHandled = '1';
    // 绑定load事件
    iframe.addEventListener('load', function () {
        console.log('loaded', iframe.src);
    });
    // 兼容已经加载完成的iframe
    if (iframe.complete) {
        console.log('already loaded', iframe.src);
    }
}

// 监听配置保持不变
observer.observe(document, { childList: true, subtree: true });

补充说明

  • 新增的标记逻辑可以避免同一个iframe被重复处理、绑定多次事件
  • 额外增加的iframe.complete判断,覆盖了「iframe在绑定load事件前就已经加载完成」的边界场景
  • 全部基于原生JS实现,无需引入任何外部资源,符合你的使用要求

内容的提问来源于stack exchange,提问作者FunkSoulBrother

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:09:01