拦截 parentNode 为 null 时的 removeChild 崩溃
核心思路:重写 Node.prototype.parentNode 的 getter. 当检测到特定调用栈且父节点为 null 时, 返回一个带有空方法(no-op)的假对象, 从而避免 null.removeChild() 报错.
1 | const originalDesc = Object.getOwnPropertyDescriptor(Node.prototype, 'parentNode'); |
要点:
- 覆盖:使用
Object.defineProperty重写 getter, 保留原始 getter 引用以便正常情况透传. - 检测:在 getter 内部实例化
new Error()获取当前调用栈(stack), 通过字符串匹配定位触发删除操作的特定函数名. 通过此方法可实现让代码以str的形式知道自己的调用栈, 进而进行针对性 patch, 不影响其他正常页面.