要获取新添加的节点的 src
或 href
属性并进行修改,可以在观察到子节点变化时,对 addedNodes
进行遍历,检查每个节点的类型,并根据需要修改相应的属性。以下是如何实现这一功能的示例代码:
// 选择要观察的目标节点(这里观察整个文档)
const targetNode = document;
// 创建一个配置对象,指定我们想要观察的变化类型
const config = {
childList: true, // 观察子节点的增加与删除
subtree: true // 如果为 true,则会递归地检查后代节点
};
// 创建 MutationObserver 实例并传入回调函数
const observer = new MutationObserver((mutationsList) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
if (mutation.addedNodes.length) {
mutation.addedNodes.forEach(node => {
// 检查添加的节点是否为元素节点
if (node.nodeType === Node.ELEMENT_NODE) {
// 检查 src 和 href 属性并进行修改
if (node.hasAttribute('src')) {
const originalSrc = node.getAttribute('src');
console.log('添加了图像或脚本节点,原始 src:', originalSrc);
// 在这里可以修改 src,例如:
node.setAttribute('src', '新的链接');
}
if (node.hasAttribute('href')) {
const originalHref = node.getAttribute('href');
console.log('添加了链接节点,原始 href:', originalHref);
// 在这里可以修改 href,例如:
node.setAttribute('href', '新的链接');
}
}
});
}
if (mutation.removedNodes.length) {
console.log('移除了这些子节点:', mutation.removedNodes);
}
} else if (mutation.type === 'attributes') {
// 属性变化处理逻辑(如果需要的话)
} else if (mutation.type === 'characterData') {
// 文本内容变化处理逻辑(如果需要的话)
}
}
});
// 开始观察目标节点以进行所需的变更
observer.observe(targetNode, config);
// 示例操作:向文档中添加一个新的 img 标签和 a 标签以测试观察器。
const imgElement = document.createElement('img');
imgElement.setAttribute('src', 'http://example.com/original-image.png');
document.body.appendChild(imgElement);
const linkElement = document.createElement('a');
linkElement.setAttribute('href', 'http://example.com/original-link');
document.body.appendChild(linkElement);
代码说明:
创建
MutationObserver
:同之前一样,我们创建了一个MutationObserver
的实例来监听 DOM 的变化。遍历
addedNodes
:当有新子节点被添加时,我们通过forEach()
遍历所有的新添加元素。检查元素类型:确保只对元素类型 (
Node.ELEMENT_NODE
) 的新添加节点执行操作。检查和修改属性:
- 使用
hasAttribute()
方法检查该元素是否具有src
或href
属性。 - 使用
getAttribute()
获取其原始值并打印。 - 使用
setAttribute()
修改这些属性为你希望的新值。
- 使用
注意事项:
- 确保你的代码是运行在合适的环境中,以便能够正确识别并修改这些动态生成或插入到 DOM 中的元素。
- 修改链接或图像地址可能会影响页面功能,因此请谨慎处理。
内容由零声教学AI助手提供,问题来源于学员提问