在你的代码中,nodeName
变量没有被定义,所以无法正确判断元素的类型。要获取当前元素的节点类型(tag name),你需要使用 this.nodeName
或 this.tagName
。
修正后的代码:
let originalSetAttribute = window.Element.prototype.setAttribute;
window.Element.prototype.setAttribute = function (attr, value) {
let hv = value;
const nodeName = this.nodeName.toLowerCase(); // 获取当前元素的标签名(小写)
if (nodeName === "img" || nodeName === "link" ||
nodeName === "script" || nodeName === "a" ||
nodeName === "frame" || nodeName === "iframe" ||
nodeName === "form" || nodeName === "audio" ||
nodeName === "video" || nodeName === "source" || // 注意:原代码拼写错误 'vedio' -> 'video'
nodeName === "embed" || nodeName === "object" ||
nodeName === "track" || nodeName === "area"
) {
if (attr === "src" ||
attr === "href" ||
attr === "action") {
if (isNeedHook(value)) {
hv = hookUrl(value);
}
}
}
debugLog("setAttribute v : ", value, " hookv : ", hv);
originalSetAttribute.call(this, attr, hv);
};
window.setAttributeHook = true;
关键修改说明:
获取当前元素的节点类型
- 使用
this.nodeName.toLowerCase()
获取当前 DOM 元素的标签名(转换为小写)。 this
指向调用setAttribute
的 DOM 元素。
- 使用
修正拼写错误
vedio
→video
(原代码中的拼写错误)。
移除无效属性
refresh
不是标准 HTML 属性,已从判断条件中移除。
注意事项
isNeedHook(value)
和hookUrl(value)
需要你自己实现。debugLog
也需要自行定义或替换为console.log
。
这样修改后,你的 Hook 逻辑就能正确识别不同类型的 DOM 元素了。
内容由零声教学AI助手提供,问题来源于学员提问