Skip to content

Chrome 57 版本 MutationObserver 报错

问题描述

Chrome 57 版本下,Platform 加载 App 时报错: MutationObserver observer 的第一个参数节点不是 Node。

问题原因

该问题产生的原因是 document 被重写为 ProxyDocument 导致的,App 内部访问到的 document 实际上是一个 Proxy 对象,导致 observer 函数访问的一个参数不是 Node 节点,从而报错。

解决方案

MutationObserver.prototype.observer 进行重写,判断监听的元素是否是 proxyDocument。如果是的话,将其代理到 nativeDocument

typescript
const nativeMutationObserverObserveEn = MutationObserver.prototype.observe;

const observe = function observe(this: MutationObserver, target: Node | typeof Proxy, options: MutationObserverInit) {
  const realTarget = isProxyDocument(target) ? globalEnv.rawDocument : target;
  return nativeMutationObserverObserveEn.call(this, realTarget, options);
};

MutationObserver.prototype.observe = observe;