Google chrome 是否可以插入一个javascript代码来覆盖DOM中现有的代码?(例如,默认警报功能)

Google chrome 是否可以插入一个javascript代码来覆盖DOM中现有的代码?(例如,默认警报功能),google-chrome,google-chrome-extension,Google Chrome,Google Chrome Extension,好的,我想重写一个已经存在于选项卡中的方法,我要使用的是默认的警报函数。 在JS函数中重写它将非常容易。加上 window.alert = function(){ //Do Something } 但问题是,当我尝试使用chrome.tabs.executeScript(“window.alert=function(){};”)时它不工作。我试图通过使用Chrome中的控制台手动完成这项工作,在我想要覆盖该功能的选项卡中,我在日志中键入覆盖功能,然后按enter键,完成后,警报功能被覆

好的,我想重写一个已经存在于选项卡中的方法,我要使用的是默认的警报函数。 在JS函数中重写它将非常容易。加上

window.alert = function(){ 
   //Do Something
}
但问题是,当我尝试使用
chrome.tabs.executeScript(“window.alert=function(){};”)时它不工作。我试图通过使用Chrome中的控制台手动完成这项工作,在我想要覆盖该功能的选项卡中,我在日志中键入覆盖功能,然后按enter键,完成后,警报功能被覆盖,但我无法通过Chrome扩展来完成这项工作

添加executeScript时,它似乎创建了一个与tab DOM中的Javascript不同的Javascript,因为我可以使用tab DOM中已经存在的函数名创建函数

有没有一种方法可以让executeScript在选项卡DOM中编写脚本,这样它就可以覆盖页面生成的.js文件编写的任何函数


谢谢

函数不作为DOM的一部分存在;相反,它们存在于包含DOM的执行环境中。内容脚本(包括与一起运行的脚本)和实际网页共享同一个DOM,但具有相同的属性。因此,调用
window.alert=function(){}
只会在内容脚本的执行环境中重写
window.alert
,而不是在实际页面的执行环境中

到达实际页面的执行环境的典型方法是将
标记注入DOM。这可以在一个小时内完成。一种方法是在中列出一个脚本,并在文档中插入引用该脚本的
元素。所需的绝对URL可通过获取

确保脚本配置为,以便在加载任何页面函数之前进行覆盖

注意:您的操作可以通过以下页面轻松撤消:

window.alert = function(){ /*...*/ }; // Your overwrite
delete window.alert;                  // Run from the page/console/...
window.alert('Test?');                // Displays alert box.

如果不能删除覆盖的函数非常重要,请使用定义一个不可变的方法。有关更多详细信息,请参阅。

您确定该功能与DOM分离吗?也许可以尝试设置计时器或设置间隔,看看情况是否如此。也许executeScript在DOM脚本之前执行。我试过了。我为每500毫秒设置了一个setInterval,它覆盖了alert函数,什么都没有,它不是关于它解释的时间,它实际上与页面DOM分离,我们甚至不能调用页面中的现有函数。我们可以访问的只是我们的脚本,由executeScript生成的脚本和HTML。executeScript无法运行页面生成javascript的函数。我已编辑您的答案以删除错误信息,并添加额外信息。检查您是否同意它。@RobW
defineProperty
是一个很好的注释(但它应该读为“
替换属性”
”,还是我没有完全理解您的意思?)。我没有提到
run_at
属性,因为他们只询问如何使用
executeScript
,但它在几乎所有情况下都非常有用和相关。看起来不错,谢谢。@RobW@apsillers,Re.“覆盖…”;如果使用的是
src=
,那么还需要
async=false
。在任何情况下,我都不相信它能保证在一开始就运行,即使文档之前写过。有人有链接到那部分源代码吗?另外,除了@RobW、@apsillers,Ok,刚刚测试过,目前为止它对清单代码有效,但对executescriptcode和executescriptfile都不起作用。我用ftp
ftp://speedtest.tele2.net
,http
www.w3dougs.com
,https
https://en.wikipedia.org/wiki/Main_Page
。与Refby相同的3个链接
window.alert = function(){ /*...*/ }; // Your overwrite
delete window.alert;                  // Run from the page/console/...
window.alert('Test?');                // Displays alert box.