1、攔截動(dòng)態(tài)創(chuàng)建A標(biāo)簽進(jìn)行的跳轉(zhuǎn)
通常大部分站點(diǎn)會(huì)通過(guò)動(dòng)態(tài)創(chuàng)建A標(biāo)簽來(lái)實(shí)現(xiàn)彈窗跳轉(zhuǎn)鏈接绍刮,以繞過(guò)瀏覽器的一些彈窗攔截插件
export const openLink=(link,target='_blank')=>{
let domLink = document.createElement('a');
domLink.href=link;
domLink.setAttribute('target',target);
domLink.style.opacity=0;
domLink.style.zIndex=-999;
document.body.appendChild(domLink);
domLink.click();
setTimeout(()=>{
document.body.removeChild(domLink);
},200);
}
// 直接的用新窗口打開(kāi)鏈接
openLink('https://www.baidu.com');
window.open()通常會(huì)被瀏覽器廣告插件攔截
那針對(duì)以上的方案,我們可以用以下方法來(lái)攔截動(dòng)態(tài)創(chuàng)建的A標(biāo)簽
var oldSetAttribute = Element.prototype.setAttribute;
Element.prototype.setAttribute = function(name, value) {
// 發(fā)現(xiàn)利用target進(jìn)行彈窗跳轉(zhuǎn)的鏈接 這里進(jìn)行一些非法判斷后萄焦,修改href值不恭,并攔截setAttribute的執(zhí)行
if (this.tagName == 'A' && name =='target' ) {
this.href='javascript:;';
return;
}
// 無(wú)需攔截的情況下走正常的原始setAttribute
oldSetAttribute.apply(this, arguments);
};
2灵妨、監(jiān)聽(tīng)DOM發(fā)生變化事件衣陶,以進(jìn)行一些報(bào)警處理
var ob= new MutationObserver((m,e)=>{
m.forEach(i=>{
i.addedNodes.forEach(t=>{
if(t.tagName=='A'){
console.log('捕獲到動(dòng)態(tài)添加了A標(biāo)簽',t);
t.parentNode.removeChild(t);//這里可以進(jìn)行移除也可以自己嵌入報(bào)警邏輯
}
})
})
});
ob.observe(document.body,{childList:true,subtree:true});