我一直试图了解当您点击描述中的链接时,youtube.com 上的哪部分代码会将您重定向到另一个网站。为此,我尝试阻止所有与单击的元素相关的事件运行,但这没有帮助:
Object.keys(window).filter(
k => /(?=^on)(?!.*move)(?!.*pointerup)(?!.*auxclick)/.test(k)
).forEach(key => {
et.addEventListener(key.slice(2), ex => {
console.log(`stop: ${key}`)
ex.stopPropagation()
ex.preventDefault()
})
})
所以我进入浏览器控制台并检查按下按钮时会调用哪个函数。但是,当我尝试从调试器调用此函数时,我得到“x 未定义”。
有人可以解释为什么这些函数无法访问,并且无法覆盖它们,即使是使用内容脚本的扩展代码也是如此?
所以,你可以劫持
addEventListener
函数本身,你可以从window.__proto__.__proto__.__proto__
找到它的源码,其中包含addEventListener
,removeEventListener
和dispatchEvent
将以下代码粘贴到 YouTube 选项卡中;不会添加任何事件侦听器,您引用的任何全局变量也不会有用,并且此代码将打开的选项卡,而从技术上讲,youtube 将是非常破碎
function execute(){
const eventClass=window.__proto__.__proto__.__proto__
const realListener=eventClass.addEventListener
eventClass.addEventListener=function(){
//return realListener.bind(this)(...arguments) //uncomment line if you want other listeners to be added
}
//now for modification of your code
Object.keys(window).filter(
k => /(?=^on)(?!.*move)(?!.*pointerup)(?!.*auxclick)/.test(k)
).forEach(function(key){
const event=key.substr(2)
realListener.bind(window)(key.slice(2), ex => {
console.log(`stop: ${key}`)
ex.stopPropagation()
ex.preventDefault()
})
let dummy=null
Object.defineProperty(window,key,{get:_=>dummy,set:thing=>dummy=thing})
})
}
let myWindow=window.open(location.href)
myWindow.eval(`(${execute.toString()})()`)