1

我想使用通过 Google Chrome 扩展程序运行的注入 javascript 从页面中删除 javascript 函数。

出于问题的目的,让我们调用我要删除 testtest 的示例函数。在这种情况下,该函数在页面上如下所示:

var testtest() {
    somecode bla bla bla;
    somecode bla bla bla;
    somecode bla bla bla;
    return false;
}

基本上我想删除或阻止功能 testtest 在页面上运行。

我正在尝试使用 javascript 替换方法来执行此操作,但它不起作用。如果这不可能,我想要一个替代解决方案来实现我的最终目标(防止该功能在页面上运行)。

我收到 Hello World 弹出窗口,这意味着脚本正在页面上运行,但代码没有被替换。

这是我使用 javascript 替换方法的尝试:

尝试 1:

alert("Hello World!");
window.location = loc.replace(testtest, "aaaaa");

结论:
“Hello World”弹出窗口:成功
代码已替换:失败

--

尝试 2:

alert("Hello World!");
loc.replace(testtest, "aaaaa");

结论:
“Hello World”弹出窗口:成功
代码已替换:失败

--

尝试 3:

alert("Hello World!");
testtest= "aaaaa";

结论:
“Hello World”弹出窗口:成功
代码已替换:失败

--

尝试 4:

alert("Hello World!");
var str="testtest";
var n=str.replace("testtest","aaaaa");

结论:
“Hello World”弹出窗口:成功
代码已替换:失败


也许 javascript replace 方法不是实现我的最终目标的正确方法。我并不真正关心我是如何做到的,只要我实现了我的目标。请帮我找到解决方案。

更新:我尝试了其他三种方法,但它们也失败了。

尝试 5:

alert("Hello World!");
function pacifyGlobalFunction(testtest) {
Object.defineProperty(
    window,
    testtest,
    {
        value: function () {},
        configurable: true // permit future Object.defineProperty
    }
);
}

结论:
“Hello World”弹出窗口:成功
代码已替换:失败

--

尝试 6:

alert("Hello World!");
Object.defineProperty(window, 'testtest', {
    value: function(){/*This function cannot be overridden*/}
});

结论:
“Hello World”弹出窗口:成功
代码已替换:失败

--

尝试 7:

alert("Hello World!");
var actualCode = '(' + function() {
    window.testtest = null;
} + ')();';
var script = document.createElement('script');
script.textContent = actualCode;
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);

结论:
“Hello World”弹出窗口:成功
代码已替换:失败


所以我仍然需要一个解决方案。

4

3 回答 3

0
function testtest() {}

类似于:

window.testtest = function () {};

testtest对象的属性也是如此window

您可以使用delete从对象中删除属性。所以:

delete window.testtest;

应该去掉这个功能。该函数仍然会被调用..所以你可能只想重新定义它。

于 2013-08-05T15:41:06.620 回答
0

您提到Google Chrome意味着您应该拥有Object.defineProperty; 制作一个不可写的属性,window以防止它被设置为其他东西

function pacifyGlobalFunction(functionName) {
    Object.defineProperty(
        window,
        functionName,
        {
            value: function () {},
            configurable: true // permit future Object.defineProperty
        }
    );
}
于 2013-08-05T15:54:02.063 回答
0

您可以覆盖该功能。例如,您的旧版本看起来像

function testMe() { 
   alert("Hi"); 
}

只是用这样的空内容覆盖它

function testMe() {}

因此,在页面上调用testMe();时不会弹出任何警报:)

于 2018-12-18T11:57:39.667 回答