在日常 bug 修复中,免不了遇到一些打开新窗口后参数不对,或是想要添加新参数的情况。这时候我们可以通过拦截打开新窗口的行为,以便查看调用栈,排查问题或者找到对应的代码位置以添加代码。
下面是我记录的一些自己有用到的一些方法,帮助我在开发中更快的定位代码🚀
情况1: 使用 window.open 打开新窗口
触发跳转代码
javascript
window.open('https://example.com', '_blank');
拦截方式
可以通过重写 window.open
方法,以便捕获所有通过 window.open
打开的行为:
javascript
const originalWindowOpen = window.open;
window.open = function(url, target, features) {
debugger; // 捕获所有通过 window.open 打开的行为
console.info('window.open 打开:', url, target, features);
return originalWindowOpen.call(window, url, target, features);
};
情况2: 使用a标签进行的跳转
触发跳转代码
javascript
let a = document.createElement('a')
a.setAttribute('href', `${url}/${params}`)
a.setAttribute('target', '_blank')
a.click()
a.remove()
拦截方式
javascript
const originalAnchorClick = HTMLAnchorElement.prototype.click;
HTMLAnchorElement.prototype.click = function() {
debugger; // 捕获所有通过 a.click() 打开的行为
console.info('a标签打开:', this.href, this.target);
return originalAnchorClick.call(this);
};
总方法
javascript
const DebuggerTool = {
originalWindowOpen: window.open,
originalAnchorClick: HTMLAnchorElement.prototype.click,
init: function () {
this.interceptWindowOpen();
this.interceptAnchorClick();
},
interceptWindowOpen: function () {
window.open = function (url, target, features) {
debugger;
console.info("window.open 打开:", url, target, features);
return DebuggerTool.originalWindowOpen.call(
window,
url,
target,
features
);
};
},
interceptAnchorClick: function () {
HTMLAnchorElement.prototype.click = function () {
debugger;
console.info("a标签打开:", this.href, this.target);
return DebuggerTool.originalAnchorClick.call(this);
};
},
};
DebuggerTool.init();