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;