更改远程网站';使用FireFox扩展在本地运行JavaScript?

更改远程网站';使用FireFox扩展在本地运行JavaScript?,javascript,firefox-addon,Javascript,Firefox Addon,我正在尝试编写一个浏览器扩展来添加一些功能,并在第三方网站上重新格式化一些数据 我安装了Firefox开发者版。然后,我基于创建了一个简单的附加组件扩展 我编写了一个简单的脚本来监视span元素的innerHTML何时更改,然后进行一些处理 这段代码有效,但它不是我想要的方式: function fixformat(){ var value = document.getElementById("value"); var valueFloat = parseFloat(value

我正在尝试编写一个浏览器扩展来添加一些功能,并在第三方网站上重新格式化一些数据

我安装了Firefox开发者版。然后,我基于创建了一个简单的附加组件扩展

我编写了一个简单的脚本来监视span元素的innerHTML何时更改,然后进行一些处理

这段代码有效,但它不是我想要的方式:

function fixformat(){
    var value = document.getElementById("value");

    var valueFloat = parseFloat(value.innerHTML);

    if (valueFloat < 1000) valueFloat += 1000;

    value.innerHTML = valueFloat;
}
setInterval(fixformat, 100);
但我想替换这一行:

value.innerHTML = totValue;
为此:

value.innerHTML = totValue + 1000;
这段代码隐藏在一个巨大的远程javascript文件中,这是我浏览他们网站时加载的大约24个Java脚本之一。这个javascript文件有大约4000行代码。当新信息可用时,它每1-15秒执行一次


是否有某种方法可以通过编程方式连接到远程javascript文件?对该行代码执行某种简单的搜索和替换,这将使其他所有代码正常执行?

您将在脚本执行之前使用
事件侦听器,并更改脚本的
.textContent

以下是一个例子:

document.addEventListener("beforescriptexecute", function(e) {
        src = e.target.src;
        content = e.target.text;

        if (src.search("i18n.js") > -1) {
            // Stop original script
            e.preventDefault();
            e.stopPropagation();
            window.jQuery(e.target).remove();

            var script = document.createElement('script');

            script.textContent = 'script you want';

            (document.head || document.documentElement).appendChild(script);
            script.onload = function() {
                this.parentNode.removeChild(this);
            }
        }
    }
}

好吧,我现在放弃了浏览器扩展的想法,因为我可以用脚本做我想做的事情。下面是我编写的脚本,用于在远程JavaScript中创建一个“钩子”以替换一行代码:

// ==UserScript==
// @name        test load
// @namespace   testing
// @description testing
// @include     https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/
// @version     1
// @grant       none
// @run-at document-start
// ==/UserScript==
document.addEventListener("beforescriptexecute", function(e) {
    src = e.target.src;
    content = e.target.text;
    console.log("src: " + src);
    if (src.search("script.js") > -1) {
        var newContent = "";
        $.ajax({
            async: false,
            type: 'GET',
            url: '/script.js',
            success: function(data) { //inject code via search and replace
                newContent=data.replace('totValue += value;', 'totValue += value + 1000;');
            }
        });
        // Stop original script
        e.preventDefault();
        e.stopPropagation();
        window.jQuery(e.target).remove();
        var script = document.createElement('script');
        script.textContent = newContent;
        (document.head || document.documentElement).appendChild(script);
        script.onload = function() {
            this.parentNode.removeChild(this);
        }
    }
});

也许您可以创建脚本的副本并进行所需的修改。然后,当页面加载时,删除原始脚本标签并添加修改后的脚本。这可能会起作用,但每当第三方网站更新某些内容时,这看起来就像维护噩梦。我正计划写很多小的UI黑客,在这里和那里搜索和替换一行代码比保留数千行代码的本地副本要好得多。不过感谢你的建议,我正在研究这个问题,这不适用于WebExtension,但我将尝试xpi风格的扩展。adblock plus似乎能够从执行中删除Java脚本,所以我只需要一种方法来替换它们。正在学习ABP源代码。谢谢你的帮助,你的想法奏效了,我只是不知道如何在浏览器扩展中实现它,但我找到了一种使用GreaseMonkey的方法:)非常酷,谢谢分享。您应该尝试使用WebExtension。您应该将内容脚本设置为在页面开头加载,然后在那个里执行。应该行得通,我试过了,但没办法。现在我发现了,我决定朝着一个不同的方向走。一旦我弄明白了,我会把我的解决方案贴在那里。谢谢。我已经删除了我的评论,因为它不再相关。还有几件事:A)只有发表评论的帖子的作者才会收到你的评论,除非你在评论中包括他们的名字,如:
@Makyen
。B) 鉴于这是你用来回答问题的答案,你应该接受这个答案。C) 我删除了代码中的空白行,使其显示而无需滚动代码。如果可能的话,如果代码可以一次全部显示而不需要垂直或水平滚动,代码会更容易理解。好的@Makyen谢谢你让我知道。它说我必须再等几个小时才能将解决方案标记为已接受。您已经使用了。搜索,该搜索将生成。通配符
// ==UserScript==
// @name        test load
// @namespace   testing
// @description testing
// @include     https://addons.mozilla.org/en-US/firefox/addon/greasemonkey/
// @version     1
// @grant       none
// @run-at document-start
// ==/UserScript==
document.addEventListener("beforescriptexecute", function(e) {
    src = e.target.src;
    content = e.target.text;
    console.log("src: " + src);
    if (src.search("script.js") > -1) {
        var newContent = "";
        $.ajax({
            async: false,
            type: 'GET',
            url: '/script.js',
            success: function(data) { //inject code via search and replace
                newContent=data.replace('totValue += value;', 'totValue += value + 1000;');
            }
        });
        // Stop original script
        e.preventDefault();
        e.stopPropagation();
        window.jQuery(e.target).remove();
        var script = document.createElement('script');
        script.textContent = newContent;
        (document.head || document.documentElement).appendChild(script);
        script.onload = function() {
            this.parentNode.removeChild(this);
        }
    }
});