要获取 node
节点及其所有子节点中的 src
和 href
属性,你可以使用递归函数来遍历整个节点树。下面是一个实现示例:
// 保存原始的 appendChild 方法
const originalBodyAppendChild = HTMLBodyElement.prototype.appendChild;
// 用于提取所有 src 和 href 的递归函数
function extractSrcAndHref(node) {
const srcs = [];
const hrefs = [];
// 检查当前节点是否为元素节点
if (node.nodeType === Node.ELEMENT_NODE) {
const src = node.getAttribute('src');
const href = node.getAttribute('href');
// 如果存在,则将其添加到相应的数组中
if (src) {
srcs.push(src);
}
if (href) {
hrefs.push(href);
}
}
// 遍历子节点并递归调用
for (let i = 0; i < node.childNodes.length; i++) {
const childNode = node.childNodes[i];
const { src: childSrc, href: childHref } = extractSrcAndHref(childNode);
srcs.push(...childSrc);
hrefs.push(...childHref);
}
return { src: srcs, href: hrefs };
}
HTMLBodyElement.prototype.appendChild = function (node) {
console.log('A node is being appended to the body:', node);
// 提取当前节点和所有子节点中的 src 和 href
const { src, href } = extractSrcAndHref(node);
// 输出结果
console.log('Found src attributes:', src);
console.log('Found href attributes:', href);
// 调用原始的 appendChild 方法以执行实际操作
return originalBodyAppendChild.call(this, node);
};
代码解释:
- 保存原始方法:如之前所述,首先保存原始的
appendChild
方法。 - 创建递归函数:定义了一个名为
extractSrcAndHref
的函数,用于提取给定节点及其所有子节点中的src
和href
属性。- 它会检查当前节点,如果是元素节点,则获取并存储
src
和href
属性。 - 然后,它遍历该节点的所有子节点,对每个子节点递归调用自身,以提取其中的属性。
- 它会检查当前节点,如果是元素节点,则获取并存储
- 输出结果:在自定义的
appendChild
方法中调用这个递归函数,并将找到的所有属性打印到控制台。 - 调用原始方法:最后,仍然调用保存下来的原始
appendChild
方法以保持功能正常。
这样,无论你将什么类型的元素(包括带有其他嵌套子元素)添加到 <body>
中,都能够正确提取出其中包含的所有 src
和 href
属性。
内容由零声教学AI助手提供,问题来源于学员提问