在你提供的代码中,hook Node.prototype.appendChild
方法是为了在每次调用时打印出新添加的子节点的一些属性。然而,当你尝试访问某个属性(如 href
或 src
)时,可能会出现 Cannot read properties of undefined (reading 'get')
的错误。这通常是因为某些节点并没有这些属性,或者它们不是预期的元素类型。
要避免这个错误,你可以先检查传入的 child
是否为有效的元素,并且具有相应的属性。以下是一个修改后的示例代码:
(function () {
var originalAppendChild = Node.prototype.appendChild;
Node.prototype.appendChild = function (child) {
// 确保 child 是一个有效的 HTML 元素
if (child instanceof HTMLElement) {
console.log("child href : ", child.href || "N/A",
" child src : ", child.src || "N/A",
" child action : ", child.action || "N/A");
} else {
console.log("Not an HTMLElement: ", child);
}
return originalAppendChild.call(this, child);
};
})();
修改点:
- 检查节点类型:使用
instanceof HTMLElement
来确保child
是一个 HTML 元素。 - 安全访问属性:通过使用逻辑或 (
||
) 操作符,为未定义或不存在的属性提供默认值,以避免读取未定义的属性导致错误。
使用说明:
- 当你将一个非 HTML 元素(比如文本节点、注释等)传递给
appendChild
时,它不会触发对该元素属性的访问,而是简单地记录它不是一个 HTML 元素。 - 如果传入的是一个有效元素,则打印其相关信息。如果某个属性不存在,会输出”N/A”。
这样就可以避免出现读取未定义性质的问题,同时还能获取到所需的信息。
内容由零声教学AI助手提供,问题来源于学员提问